diff options
Diffstat (limited to 'source/blender/quicktime')
-rw-r--r-- | source/blender/quicktime/apple/qtkit_export.m | 643 | ||||
-rw-r--r-- | source/blender/quicktime/apple/qtkit_import.m | 14 |
2 files changed, 141 insertions, 516 deletions
diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m index c5e878c6ebc..48b6b6e5429 100644 --- a/source/blender/quicktime/apple/qtkit_export.m +++ b/source/blender/quicktime/apple/qtkit_export.m @@ -32,6 +32,9 @@ #ifdef WITH_QUICKTIME #if defined(_WIN32) || defined(__APPLE__) +#include <stdio.h> +#include <string.h> + #include "DNA_scene_types.h" #include "BKE_global.h" @@ -55,362 +58,25 @@ #ifndef __AIFF__ #define __AIFF__ #endif +#import <Cocoa/Cocoa.h> +#import <QTKit/QTKit.h> #endif /* __APPLE__ */ -#define kMyCreatorType FOUR_CHAR_CODE('TVOD') -#define kTrackStart 0 -#define kMediaStart 0 - -//static void QT_StartAddVideoSamplesToMedia (const Rect *trackFrame, int rectx, int recty); -static void QT_DoAddVideoSamplesToMedia (int frame, int *pixels, int rectx, int recty); -static void QT_EndAddVideoSamplesToMedia (void); -static void QT_CreateMyVideoTrack (int rectx, int recty); -static void QT_EndCreateMyVideoTrack (void); -static void check_renderbutton_framerate(struct RenderData *rd); - typedef struct QuicktimeExport { + QTMovie *movie; + + NSString *filename; - /*FSSpec theSpec; - short resRefNum; - Str255 qtfilename; - - Media theMedia; - Movie theMovie; - Track theTrack; - - GWorldPtr theGWorld; - PixMapHandle thePixMap; - ImageDescription **anImageDescription;*/ - - ImBuf *ibuf; //imagedata for Quicktime's Gworld - ImBuf *ibuf2; //copy of renderdata, to be Y-flipped - + QTTime frameDuration; + NSDictionary *frameAttributes; } QuicktimeExport; -typedef struct QuicktimeComponentData { - - /*ComponentInstance theComponent; - SCTemporalSettings gTemporalSettings; - SCSpatialSettings gSpatialSettings; - SCDataRateSettings aDataRateSetting; - TimeValue duration; - long kVideoTimeScale;*/ - -} QuicktimeComponentData; - static struct QuicktimeExport *qtexport; -static struct QuicktimeComponentData *qtdata; - -static int sframe; - -#if 0 - -static OSErr QT_SaveCodecSettingsToScene(RenderData *rd) -{ - QTAtomContainer myContainer = NULL; - ComponentResult myErr = noErr; - Ptr myPtr; - long mySize = 0; - - CodecInfo ci; - char str[255]; - - QuicktimeCodecData *qcd = rd->qtcodecdata; - - // check if current scene already has qtcodec settings, and clear them - if (qcd) { - free_qtcodecdata(qcd); - } else { - qcd = rd->qtcodecdata = MEM_callocN(sizeof(QuicktimeCodecData), "QuicktimeCodecData"); - } - - // obtain all current codec settings - SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings); - SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings); - SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting); - - // retreive codecdata from quicktime in a atomcontainer - myErr = SCGetSettingsAsAtomContainer(qtdata->theComponent, &myContainer); - if (myErr != noErr) { - printf("Quicktime: SCGetSettingsAsAtomContainer failed\n"); - goto bail; - } - - // get the size of the atomcontainer - mySize = GetHandleSize((Handle)myContainer); - - // lock and convert the atomcontainer to a *valid* pointer - QTLockContainer(myContainer); - myPtr = *(Handle)myContainer; - - // copy the Quicktime data into the blender qtcodecdata struct - if (myPtr) { - qcd->cdParms = MEM_mallocN(mySize, "qt.cdParms"); - memcpy(qcd->cdParms, myPtr, mySize); - qcd->cdSize = mySize; - - GetCodecInfo (&ci, qtdata->gSpatialSettings.codecType, 0); - CopyPascalStringToC(ci.typeName, str); - sprintf(qcd->qtcodecname, "Codec: %s", str); - } else { - printf("Quicktime: QT_SaveCodecSettingsToScene failed\n"); - } - - QTUnlockContainer(myContainer); - -bail: - if (myContainer != NULL) - QTDisposeAtomContainer(myContainer); - - return((OSErr)myErr); -} - - -static OSErr QT_GetCodecSettingsFromScene(RenderData *rd) -{ - Handle myHandle = NULL; - ComponentResult myErr = noErr; -// CodecInfo ci; -// char str[255]; - - QuicktimeCodecData *qcd = rd->qtcodecdata; - - // if there is codecdata in the blendfile, convert it to a Quicktime handle - if (qcd) { - myHandle = NewHandle(qcd->cdSize); - PtrToHand( qcd->cdParms, &myHandle, qcd->cdSize); - } - - // restore codecsettings to the quicktime component - if(qcd->cdParms && qcd->cdSize) { - myErr = SCSetSettingsFromAtomContainer((GraphicsExportComponent)qtdata->theComponent, (QTAtomContainer)myHandle); - if (myErr != noErr) { - printf("Quicktime: SCSetSettingsFromAtomContainer failed\n"); - goto bail; - } - - // update runtime codecsettings for use with the codec dialog - SCGetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting); - SCGetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings); - SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings); - -// GetCodecInfo (&ci, qtdata->gSpatialSettings.codecType, 0); -// CopyPascalStringToC(ci.typeName, str); -// printf("restored Codec: %s\n", str); - } else { - printf("Quicktime: QT_GetCodecSettingsFromScene failed\n"); - } -bail: - if (myHandle != NULL) - DisposeHandle(myHandle); - - return((OSErr)myErr); -} - - -static OSErr QT_AddUserDataTextToMovie (Movie theMovie, char *theText, OSType theType) -{ - UserData myUserData = NULL; - Handle myHandle = NULL; - long myLength = strlen(theText); - OSErr myErr = noErr; - - // get the movie's user data list - myUserData = GetMovieUserData(theMovie); - if (myUserData == NULL) - return(paramErr); - - // copy the specified text into a new handle - myHandle = NewHandleClear(myLength); - if (myHandle == NULL) - return(MemError()); - - BlockMoveData(theText, *myHandle, myLength); - - // add the data to the movie's user data - myErr = AddUserDataText(myUserData, myHandle, theType, 1, (short)GetScriptManagerVariable(smRegionCode)); - - // clean up - DisposeHandle(myHandle); - return(myErr); -} - - -static void QT_CreateMyVideoTrack(int rectx, int recty) -{ - OSErr err = noErr; - Rect trackFrame; -// MatrixRecord myMatrix; - - trackFrame.top = 0; - trackFrame.left = 0; - trackFrame.bottom = recty; - trackFrame.right = rectx; - - qtexport->theTrack = NewMovieTrack (qtexport->theMovie, - FixRatio(trackFrame.right,1), - FixRatio(trackFrame.bottom,1), - 0); - CheckError( GetMoviesError(), "NewMovieTrack error" ); - -// SetIdentityMatrix(&myMatrix); -// ScaleMatrix(&myMatrix, fixed1, Long2Fix(-1), 0, 0); -// TranslateMatrix(&myMatrix, 0, Long2Fix(trackFrame.bottom)); -// SetMovieMatrix(qtexport->theMovie, &myMatrix); - - qtexport->theMedia = NewTrackMedia (qtexport->theTrack, - VideoMediaType, - qtdata->kVideoTimeScale, - nil, - 0); - CheckError( GetMoviesError(), "NewTrackMedia error" ); - - err = BeginMediaEdits (qtexport->theMedia); - CheckError( err, "BeginMediaEdits error" ); - - QT_StartAddVideoSamplesToMedia (&trackFrame, rectx, recty); -} - - -static void QT_EndCreateMyVideoTrack(void) -{ - OSErr err = noErr; - - QT_EndAddVideoSamplesToMedia (); - - err = EndMediaEdits (qtexport->theMedia); - CheckError( err, "EndMediaEdits error" ); - - err = InsertMediaIntoTrack (qtexport->theTrack, - kTrackStart,/* track start time */ - kMediaStart,/* media start time */ - GetMediaDuration (qtexport->theMedia), - fixed1); - CheckError( err, "InsertMediaIntoTrack error" ); -} - - -static void QT_StartAddVideoSamplesToMedia (const Rect *trackFrame, int rectx, int recty) -{ - SCTemporalSettings gTemporalSettings; - OSErr err = noErr; - - qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0); - qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0); - - err = NewGWorldFromPtr( &qtexport->theGWorld, - k32ARGBPixelFormat, - trackFrame, - NULL, NULL, 0, - (Ptr)qtexport->ibuf->rect, - rectx * 4 ); - CheckError (err, "NewGWorldFromPtr error"); - - qtexport->thePixMap = GetGWorldPixMap(qtexport->theGWorld); - LockPixels(qtexport->thePixMap); - - SCDefaultPixMapSettings (qtdata->theComponent, qtexport->thePixMap, true); - - // workaround for crash with H.264, which requires an upgrade to - // the new callback based api for proper encoding, but that's not - // really compatible with rendering out frames sequentially - gTemporalSettings = qtdata->gTemporalSettings; - if(qtdata->gSpatialSettings.codecType == kH264CodecType) { - if(gTemporalSettings.temporalQuality != codecMinQuality) { - fprintf(stderr, "Only minimum quality compression supported for QuickTime H.264.\n"); - gTemporalSettings.temporalQuality = codecMinQuality; - } - } - - SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &gTemporalSettings); - SCSetInfo(qtdata->theComponent, scSpatialSettingsType, &qtdata->gSpatialSettings); - SCSetInfo(qtdata->theComponent, scDataRateSettingsType, &qtdata->aDataRateSetting); - - err = SCCompressSequenceBegin(qtdata->theComponent, qtexport->thePixMap, NULL, &qtexport->anImageDescription); - CheckError (err, "SCCompressSequenceBegin error" ); -} - -static void QT_DoAddVideoSamplesToMedia (int frame, int *pixels, int rectx, int recty) -{ - OSErr err = noErr; - Rect imageRect; - - int index; - int boxsize; - unsigned char *from, *to; - - short syncFlag; - long dataSize; - Handle compressedData; - Ptr myPtr; - - - //copy and flip renderdata - memcpy(qtexport->ibuf2->rect, pixels, 4*rectx*recty); - IMB_flipy(qtexport->ibuf2); - - //get pointers to parse bitmapdata - myPtr = GetPixBaseAddr(qtexport->thePixMap); - imageRect = (**qtexport->thePixMap).bounds; - - from = (unsigned char *) qtexport->ibuf2->rect; - to = (unsigned char *) myPtr; - - //parse RGBA bitmap into Quicktime's ARGB GWorld - boxsize = rectx * recty; - for( index = 0; index < boxsize; index++) { - to[0] = from[3]; - to[1] = from[0]; - to[2] = from[1]; - to[3] = from[2]; - to +=4, from += 4; - } - - err = SCCompressSequenceFrame(qtdata->theComponent, - qtexport->thePixMap, - &imageRect, - &compressedData, - &dataSize, - &syncFlag); - CheckError(err, "SCCompressSequenceFrame error"); - - err = AddMediaSample(qtexport->theMedia, - compressedData, - 0, - dataSize, - qtdata->duration, - (SampleDescriptionHandle)qtexport->anImageDescription, - 1, - syncFlag, - NULL); - CheckError(err, "AddMediaSample error"); - - printf ("added frame %3d (frame %3d in movie): ", frame, frame-sframe); -} - - -static void QT_EndAddVideoSamplesToMedia (void) -{ - SCCompressSequenceEnd(qtdata->theComponent); - - UnlockPixels(qtexport->thePixMap); - if (qtexport->theGWorld) - DisposeGWorld (qtexport->theGWorld); - - if (qtexport->ibuf) - IMB_freeImBuf(qtexport->ibuf); - - if (qtexport->ibuf2) - IMB_freeImBuf(qtexport->ibuf2); -} -#endif //0 void makeqtstring (RenderData *rd, char *string) { char txt[64]; - if (string==0) return; - strcpy(string, rd->pic); BLI_convertstringcode(string, G.sce); @@ -423,167 +89,125 @@ void makeqtstring (RenderData *rd, char *string) { } -void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty) { -#if 0 - OSErr err = noErr; - +void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSError *error; char name[2048]; - char theFullPath[255]; - + if(qtexport == NULL) qtexport = MEM_callocN(sizeof(QuicktimeExport), "QuicktimeExport"); - if(qtdata) { - if(qtdata->theComponent) CloseComponent(qtdata->theComponent); - free_qtcomponentdata(); - } - - qtdata = MEM_callocN(sizeof(QuicktimeComponentData), "QuicktimeCodecDataExt"); - - if(rd->qtcodecdata == NULL || rd->qtcodecdata->cdParms == NULL) { - get_qtcodec_settings(rd); - } else { - qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType); - - QT_GetCodecSettingsFromScene(rd); - check_renderbutton_framerate(rd); - } - if (G.afbreek != 1) { - sframe = (rd->sfra); - - makeqtstring(rd, name); - - sprintf(theFullPath, "%s", name); - - /* hack: create an empty file to make FSPathMakeRef() happy */ - myFile = open(theFullPath, O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRUSR|S_IWUSR); - if (myFile < 0) { - printf("error while creating file!\n"); - /* do something? */ - } - close(myFile); - err = FSPathMakeRef((const UInt8 *)theFullPath, &myRef, 0); - CheckError(err, "FsPathMakeRef error"); - err = FSGetCatalogInfo(&myRef, kFSCatInfoNone, NULL, NULL, &qtexport->theSpec, NULL); - CheckError(err, "FsGetCatalogInfoRef error"); - - err = CreateMovieFile (&qtexport->theSpec, - kMyCreatorType, - smCurrentScript, - createMovieFileDeleteCurFile | createMovieFileDontCreateResFile, - &qtexport->resRefNum, - &qtexport->theMovie ); - CheckError(err, "CreateMovieFile error"); - - if(err != noErr) { + /* Check first if the QuickTime 7.2.1 initToWritableFile: method is available */ + if ([[[[QTMovie alloc] init] autorelease] respondsToSelector:@selector(initToWritableFile:error:)] != YES) { G.afbreek = 1; -// XXX error("Unable to create Quicktime movie: %s", name); - } else { - printf("Created QuickTime movie: %s\n", name); - - QT_CreateMyVideoTrack(rectx, recty); + fprintf(stderr, "\nUnable to create quicktime movie, need Quicktime rev 7.2.1 or later"); + } + else { + makeqtstring(rd, name); + qtexport->filename = [NSString stringWithCString:name + encoding:[NSString defaultCStringEncoding]]; + qtexport->movie = [[QTMovie alloc] initToWritableFile:qtexport->filename error:&error]; + + if(qtexport->movie == nil) { + G.afbreek = 1; + NSLog(@"Unable to create quicktime movie : %@",[error localizedDescription]); + } else { + [qtexport->movie retain]; + [qtexport->filename retain]; + [qtexport->movie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; + [qtexport->movie setAttribute:@"Made with Blender" forKey:QTMovieCopyrightAttribute]; + + qtexport->frameDuration = QTMakeTime(rd->frs_sec_base*1000, rd->frs_sec*1000); + + /* specifying the codec attributes + TODO: get these values from RenderData/scene*/ + qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"jpeg", + QTAddImageCodecType, + [NSNumber numberWithLong:codecHighQuality], + QTAddImageCodecQuality, + nil]; + [qtexport->frameAttributes retain]; + } } } -#endif + + [pool drain]; } -void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty) { - //QT_DoAddVideoSamplesToMedia(frame, pixels, rectx, recty); +void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSBitmapImageRep *blBitmapFormatImage; + NSImage *frameImage; + unsigned char *from_Ptr,*to_Ptr; + int y,from_i,to_i; + + + /* Create bitmap image rep in blender format (32bit RGBA) */ + blBitmapFormatImage = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL + pixelsWide:rectx + pixelsHigh:recty + bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bitmapFormat:NSAlphaNonpremultipliedBitmapFormat + bytesPerRow:rectx*4 + bitsPerPixel:32]; + if (!blBitmapFormatImage) { + [pool drain]; + return; + } + + from_Ptr = (unsigned char*)pixels; + to_Ptr = (unsigned char*)[blBitmapFormatImage bitmapData]; + for (y = 0; y < recty; y++) { + to_i = (recty-y-1)*rectx; + from_i = y*rectx; + memcpy(to_Ptr+4*to_i, from_Ptr+4*from_i, 4*rectx); + } + + frameImage = [[NSImage alloc] initWithSize:NSMakeSize(rectx, recty)]; + [frameImage addRepresentation:blBitmapFormatImage]; + + /* Add the image to the movie clip */ + [qtexport->movie addImage:frameImage + forDuration:qtexport->frameDuration + withAttributes:qtexport->frameAttributes]; + + [blBitmapFormatImage release]; + [frameImage release]; + [pool drain]; } -void end_qt(void) { -/* OSErr err = noErr; - short resId = movieInDataForkResID; - - if(qtexport->theMovie) { - QT_EndCreateMyVideoTrack(); - - err = AddMovieResource (qtexport->theMovie, qtexport->resRefNum, &resId, qtexport->qtfilename); - CheckError(err, "AddMovieResource error"); - - err = QT_AddUserDataTextToMovie(qtexport->theMovie, "Made with Blender", kUserDataTextInformation); - CheckError(err, "AddUserDataTextToMovie error"); - - err = UpdateMovieResource(qtexport->theMovie, qtexport->resRefNum, resId, qtexport->qtfilename); - CheckError(err, "UpdateMovieResource error"); - - if(qtexport->resRefNum) CloseMovieFile(qtexport->resRefNum); - - DisposeMovie(qtexport->theMovie); - - printf("Finished QuickTime movie.\n"); - } +void end_qt(void) +{ + if (qtexport->movie) { + /* Flush update of the movie file */ + [qtexport->movie updateMovieFile]; + + /* Clean up movie structure */ + [qtexport->filename release]; + [qtexport->frameAttributes release]; + [qtexport->movie release]; + } if(qtexport) { MEM_freeN(qtexport); qtexport = NULL; - }*/ + } } void free_qtcomponentdata(void) { - /*if(qtdata) { - if(qtdata->theComponent) CloseComponent(qtdata->theComponent); - MEM_freeN(qtdata); - qtdata = NULL; - }*/ -} - - -static void check_renderbutton_framerate(RenderData *rd) -{ - // to keep float framerates consistent between the codec dialog and frs/sec button. -/* OSErr err; - - //err = SCGetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings); - CheckError(err, "SCGetInfo fr error"); - - if( (rd->frs_sec == 24 || rd->frs_sec == 30 || rd->frs_sec == 60) && - (qtdata->gTemporalSettings.frameRate == 1571553 || - qtdata->gTemporalSettings.frameRate == 1964113 || - qtdata->gTemporalSettings.frameRate == 3928227)) {;} - else { - if (rd->frs_sec_base > 0) - qtdata->gTemporalSettings.frameRate = - (rd->frs_sec << 16) / rd->frs_sec_base ; - } - - //err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings); - CheckError( err, "SCSetInfo error" ); - - if(qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps - qtdata->kVideoTimeScale = 24000; - qtdata->duration = 1001; - } else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps - qtdata->kVideoTimeScale = 30000; - qtdata->duration = 1001; - } else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps - qtdata->kVideoTimeScale = 60000; - qtdata->duration = 1001; - } else { - qtdata->kVideoTimeScale = (qtdata->gTemporalSettings.frameRate >> 16) * 100; - qtdata->duration = 100; - }*/ } int get_qtcodec_settings(RenderData *rd) { -/* OSErr err = noErr; - - // erase any existing codecsetting - if(qtdata) { - if(qtdata->theComponent) CloseComponent(qtdata->theComponent); - free_qtcomponentdata(); - } - - // allocate new - qtdata = MEM_callocN(sizeof(QuicktimeComponentData), "QuicktimeComponentData"); - qtdata->theComponent = OpenDefaultComponent(StandardCompressionType, StandardCompressionSubType); - +/* // get previous selected codecsetting, if any if(rd->qtcodecdata && rd->qtcodecdata->cdParms) { QT_GetCodecSettingsFromScene(rd); @@ -623,41 +247,40 @@ int get_qtcodec_settings(RenderData *rd) QT_SaveCodecSettingsToScene(rd); // framerate jugglin' - if(qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps - qtdata->kVideoTimeScale = 24000; - qtdata->duration = 1001; - - rd->frs_sec = 24; - rd->frs_sec_base = 1.001; - } else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps - qtdata->kVideoTimeScale = 30000; - qtdata->duration = 1001; - - rd->frs_sec = 30; - rd->frs_sec_base = 1.001; - } else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps - qtdata->kVideoTimeScale = 60000; - qtdata->duration = 1001; - - rd->frs_sec = 60; - rd->frs_sec_base = 1.001; - } else { - double fps = qtdata->gTemporalSettings.frameRate; - - qtdata->kVideoTimeScale = 60000; - qtdata->duration = qtdata->kVideoTimeScale / (qtdata->gTemporalSettings.frameRate / 65536); - - if ((qtdata->gTemporalSettings.frameRate & 0xffff) == 0) { - rd->frs_sec = fps / 65536; - rd->frs_sec_base = 1; - } else { - // we do our very best... - rd->frs_sec = (fps * 10000 / 65536); - rd->frs_sec_base = 10000; + switch (qtexport->frameRate) { + case 1571553: // 23.98 fps + qtexport->frameDuration = QTMakeTime(1001, 24000); + rd->frs_sec = 24; + rd->frs_sec_base = 1.001; + break; + case 1964113: // 29.97 fps + qtexport->frameDuration = QTMakeTime(1001, 30000); + rd->frs_sec = 30; + rd->frs_sec_base = 1.001; + break; + case 3928227: // 59.94 fps + qtexport->frameDuration = QTMakeTime(1001, 60000); + rd->frs_sec = 60; + rd->frs_sec_base = 1.001; + break; + default: + { + double fps = qtexport->frameRate; + qtexport->frameDuration = QTMakeTime(60000/(qtexport->frameRate / 65536), 60000); + + if ((qtexport->frameRate & 0xffff) == 0) { + rd->frs_sec = fps / 65536; + rd->frs_sec_base = 1; + } else { + // we do our very best... + rd->frs_sec = (fps * 10000 / 65536); + rd->frs_sec_base = 10000; + } } + break; } */ - return 0; + return 1; } #endif /* _WIN32 || __APPLE__ */ diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m index 2da66e6daa6..8cdf5a4e89b 100644 --- a/source/blender/quicktime/apple/qtkit_import.m +++ b/source/blender/quicktime/apple/qtkit_import.m @@ -98,7 +98,8 @@ int anim_is_quicktime (char *name) pool = [[NSAutoreleasePool alloc] init]; - if([QTMovie canInitWithFile:[NSString stringWithUTF8String:name]]) + if([QTMovie canInitWithFile:[NSString stringWithCString:name + encoding:[NSString defaultCStringEncoding]]]) { [pool drain]; return true; @@ -163,7 +164,7 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height) for (y = 0; y < height; y++) { to_i = (height-y-1)*width; from_i = y*width; - memcpy(toIBuf+4*to_i, rasterRGB+4*from_i, 4*width); + memcpy(toIBuf+4*to_i, rasterRGB+4*from_i, 4*width); } } else { @@ -225,8 +226,8 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height) /*Copy the image to ibuf, flipping it vertically*/ toIBuf = (uchar*)ibuf->rect; - for (x = 0; x < width; x++) { - for (y = 0; y < height; y++) { + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { to_i = (height-y-1)*width + x; from_i = y*width + x; @@ -300,7 +301,8 @@ int startquicktime (struct anim *anim) pool = [[NSAutoreleasePool alloc] init]; attributes = [NSDictionary dictionaryWithObjectsAndKeys: - [NSString stringWithUTF8String:anim->name], QTMovieFileNameAttribute, + [NSString stringWithCString:anim->name + encoding:[NSString defaultCStringEncoding]], QTMovieFileNameAttribute, [NSNumber numberWithBool:NO], QTMovieEditableAttribute, nil]; @@ -332,7 +334,7 @@ int startquicktime (struct anim *anim) [anim->qtime->media retain]; - frameSize = [[anim->qtime->movie attributeForKey:QTMovieCurrentSizeAttribute] sizeValue]; + frameSize = [[anim->qtime->movie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue]; anim->x = frameSize.width; anim->y = frameSize.height; |