#include "ofQtUtils.h"
#if defined (TARGET_WIN32) || (defined TARGET_OSX && !defined(MAC_OS_X_VERSION_10_7))
#if !defined(MAC_OS_X_VERSION_10_12) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12
#include "ofUtils.h"
#include "ofGraphics.h"
static bool bQuicktimeInitialized = false;
void initializeQuicktime(){
if (bQuicktimeInitialized == false){
OSErr myErr = noErr;
#ifdef TARGET_WIN32
myErr = InitializeQTML(0);
if (myErr != noErr){
ofLogFatalError("ofQtUtils.h") << "------------------------------------------------------";
ofLogFatalError("ofQtUtils.h") << "sorry, there wasa problem initing quicktime... exiting";
OF_EXIT_APP(0);
}
#endif
myErr = EnterMovies ();
if (myErr != noErr){
ofLogFatalError("ofQtUtils.h") << "------------------------------------------------------";
ofLogFatalError("ofQtUtils.h") << "sorry, there is a problem initing quicktime... exiting";
OF_EXIT_APP(0);
}
bQuicktimeInitialized = true;
}
}
void closeQuicktime(){
if (bQuicktimeInitialized == true){
ExitMovies();
#ifdef TARGET_WIN32
TerminateQTML();
#endif
bQuicktimeInitialized = false;
}
}
void convertPixels(unsigned char * gWorldPixels, unsigned char * rgbPixels, int w, int h){
int * rgbaPtr = (int *) gWorldPixels;
pix24 * rgbPtr = (pix24 *) rgbPixels;
unsigned char * rgbaStart;
bool bFlipVertically = false;
if (!bFlipVertically){
for (int i = 0; i < h; i++){
pix24 * rgbPtr = (pix24 *) rgbPixels + ((i) * w);
for (int j = 0; j < w; j++){
rgbaStart = (unsigned char *)rgbaPtr;
memcpy (rgbPtr, rgbaStart+1, sizeof(pix24));
rgbPtr++;
rgbaPtr++;
}
}
} else {
for (int i = 0; i < h; i++){
pix24 * rgbPtr = (pix24 *) rgbPixels + ((h-i-1) * w);
for (int j = 0; j < w; j++){
rgbaStart = (unsigned char *)rgbaPtr;
memcpy (rgbPtr, rgbaStart+1, sizeof(pix24));
rgbPtr++;
rgbaPtr++;
}
}
}
}
Boolean SeqGrabberModalFilterUPP (DialogPtr theDialog, const EventRecord *theEvent, short *itemHit, long refCon){
#pragma unused(theDialog, itemHit)
Boolean handled = false;
if ((theEvent->what == updateEvt) &&
((WindowPtr) theEvent->message == (WindowPtr) refCon))
{
BeginUpdate ((WindowPtr) refCon);
EndUpdate ((WindowPtr) refCon);
handled = true;
}
return (handled);
}
#define kCharacteristicHasVideoFrameRate FOUR_CHAR_CODE('vfrr')
#define kCharacteristicIsAnMpegTrack FOUR_CHAR_CODE('mpeg')
void MovieGetStaticFrameRate(Movie inMovie, double *outStaticFrameRate)
{
*outStaticFrameRate = 0;
Media movieMedia;
MediaHandler movieMediaHandler;
MovieGetVideoMediaAndMediaHandler(inMovie, &movieMedia, &movieMediaHandler);
if (movieMedia && movieMediaHandler)
{
Boolean isMPEG = false;
OSErr err = IsMPEGMediaHandler(movieMediaHandler, &isMPEG);
if (err == noErr)
{
if (isMPEG)
{
Fixed staticFrameRate;
ComponentResult err = MPEGMediaGetStaticFrameRate(movieMediaHandler, &staticFrameRate);
if (err == noErr)
{
*outStaticFrameRate = Fix2X(staticFrameRate);
}
}
else
{
OSErr err = MediaGetStaticFrameRate(movieMedia, outStaticFrameRate);
if (err != noErr) {
ofLogError("ofQtUtils") << "MovieGetStaticFrameRate(): couldn't get static frame rate: OSErr " << err;
}
}
}
}
}
void MovieGetVideoMediaAndMediaHandler(Movie inMovie, Media *outMedia, MediaHandler *outMediaHandler)
{
*outMedia = nullptr;
*outMediaHandler = nullptr;
Track videoTrack = GetMovieIndTrackType(inMovie, 1, kCharacteristicHasVideoFrameRate,
movieTrackCharacteristic | movieTrackEnabledOnly);
if (videoTrack != nullptr)
{
*outMedia = GetTrackMedia(videoTrack);
if (*outMedia)
{
*outMediaHandler = GetMediaHandler(*outMedia);
}
}
}
OSErr IsMPEGMediaHandler(MediaHandler inMediaHandler, Boolean *outIsMPEG)
{
return((OSErr) MediaHasCharacteristic(inMediaHandler,
kCharacteristicIsAnMpegTrack,
outIsMPEG));
}
ComponentResult MPEGMediaGetStaticFrameRate(MediaHandler inMPEGMediaHandler, Fixed *outStaticFrameRate)
{
*outStaticFrameRate = 0;
MHInfoEncodedFrameRateRecord encodedFrameRate;
Size encodedFrameRateSize = sizeof(encodedFrameRate);
ComponentResult err = MediaGetPublicInfo(inMPEGMediaHandler,
kMHInfoEncodedFrameRate,
&encodedFrameRate,
&encodedFrameRateSize);
if (err == noErr)
{
*outStaticFrameRate = encodedFrameRate.encodedFrameRate;
}
return err;
}
OSErr MediaGetStaticFrameRate(Media inMovieMedia, double *outFPS)
{
*outFPS = 0;
long sampleCount = GetMediaSampleCount(inMovieMedia);
OSErr err = GetMoviesError();
if (sampleCount && err == noErr)
{
TimeValue64 duration = GetMediaDuration(inMovieMedia);
err = GetMoviesError();
if (err == noErr)
{
TimeValue64 timeScale = GetMediaTimeScale(inMovieMedia);
err = GetMoviesError();
if (err == noErr)
{
*outFPS = (double)sampleCount * (double)timeScale / (double)duration;
}
}
}
return err;
}
#ifdef TARGET_OSX
OSErr GetSettingsPreference(CFStringRef inKey, UserData *outUserData)
{
CFPropertyListRef theCFSettings;
Handle theHandle = nullptr;
UserData theUserData = nullptr;
OSErr err = paramErr;
theCFSettings = CFPreferencesCopyAppValue(inKey,
kCFPreferencesCurrentApplication);
if (theCFSettings) {
err = PtrToHand(CFDataGetBytePtr((CFDataRef)theCFSettings), &theHandle,
CFDataGetLength((CFDataRef)theCFSettings));
CFRelease(theCFSettings);
if (theHandle) {
err = NewUserDataFromHandle(theHandle, &theUserData);
if (theUserData) {
*outUserData = theUserData;
}
DisposeHandle(theHandle);
}
}
return err;
}
OSErr SaveSettingsPreference(CFStringRef inKey, UserData inUserData)
{
CFDataRef theCFSettings;
Handle hSettings;
OSErr err;
if (nullptr == inUserData) return paramErr;
hSettings = NewHandle(0);
err = MemError();
if (noErr == err) {
err = PutUserDataIntoHandle(inUserData, hSettings);
if (noErr == err) {
HLock(hSettings);
theCFSettings = CFDataCreate(kCFAllocatorDefault,
(UInt8 *)*hSettings,
GetHandleSize(hSettings));
if (theCFSettings) {
CFPreferencesSetAppValue(inKey, theCFSettings,
kCFPreferencesCurrentApplication);
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
CFRelease(theCFSettings);
}
}
DisposeHandle(hSettings);
}
return err;
}
#endif
#endif
#endif
Comments