From d6531927510ad3885176158afa643fee6ec30882 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 22 Dec 2009 12:01:32 +0000 Subject: Reports: writing movies now uses the reports mechanism to throw errors. Also fixes bug #19463: screencast to xvid ffmpeg crash. --- source/blender/quicktime/apple/qtkit_export.m | 100 +++++++++++----------- source/blender/quicktime/apple/quicktime_export.c | 83 +++++++++--------- source/blender/quicktime/quicktime_export.h | 4 +- 3 files changed, 95 insertions(+), 92 deletions(-) (limited to 'source/blender/quicktime') diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m index c7759055d7e..38baacf009e 100644 --- a/source/blender/quicktime/apple/qtkit_export.m +++ b/source/blender/quicktime/apple/qtkit_export.m @@ -154,68 +154,68 @@ void makeqtstring (RenderData *rd, char *string) { #pragma mark export functions -void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty) +int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSError *error; char name[2048]; + int success= 1; + if(qtexport == NULL) qtexport = MEM_callocN(sizeof(QuicktimeExport), "QuicktimeExport"); - if (G.afbreek != 1) { - - if(qtexport == NULL) qtexport = MEM_callocN(sizeof(QuicktimeExport), "QuicktimeExport"); - - [QTMovie enterQTKitOnThread]; - - /* 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; - 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]); - [QTMovie exitQTKitOnThread]; - } 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 : try to retrieve them from render data first*/ - if (rd->qtcodecsettings.codecType) { - qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys: - stringWithCodecType(rd->qtcodecsettings.codecType), - QTAddImageCodecType, - [NSNumber numberWithLong:((rd->qtcodecsettings.codecSpatialQuality)*codecLosslessQuality)/100], - QTAddImageCodecQuality, - nil]; - } - else { - qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"jpeg", - QTAddImageCodecType, - [NSNumber numberWithLong:codecHighQuality], - QTAddImageCodecQuality, - nil]; - } - [qtexport->frameAttributes retain]; + [QTMovie enterQTKitOnThread]; + + /* Check first if the QuickTime 7.2.1 initToWritableFile: method is available */ + if ([[[[QTMovie alloc] init] autorelease] respondsToSelector:@selector(initToWritableFile:error:)] != YES) { + BKE_report(reports, RPT_EROR, "\nUnable to create quicktime movie, need Quicktime rev 7.2.1 or later"); + success= 0; + } + 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) { + BKE_report(reports, RPT_ERROR, "Unable to create quicktime movie."); + success= 0; + NSLog(@"Unable to create quicktime movie : %@",[error localizedDescription]); + [QTMovie exitQTKitOnThread]; + } 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 : try to retrieve them from render data first*/ + if (rd->qtcodecsettings.codecType) { + qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys: + stringWithCodecType(rd->qtcodecsettings.codecType), + QTAddImageCodecType, + [NSNumber numberWithLong:((rd->qtcodecsettings.codecSpatialQuality)*codecLosslessQuality)/100], + QTAddImageCodecQuality, + nil]; } + else { + qtexport->frameAttributes = [NSDictionary dictionaryWithObjectsAndKeys:@"jpeg", + QTAddImageCodecType, + [NSNumber numberWithLong:codecHighQuality], + QTAddImageCodecQuality, + nil]; + } + [qtexport->frameAttributes retain]; } } [pool drain]; + + return success; } -void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty) +int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSBitmapImageRep *blBitmapFormatImage; @@ -235,7 +235,7 @@ void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rec bitsPerPixel:32]; if (!blBitmapFormatImage) { [pool drain]; - return; + return 0; } from_Ptr = (unsigned char*)pixels; @@ -257,6 +257,8 @@ void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rec [blBitmapFormatImage release]; [frameImage release]; [pool drain]; + + return 1; } diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c index 68fd60d89d2..a5737e93271 100644 --- a/source/blender/quicktime/apple/quicktime_export.c +++ b/source/blender/quicktime/apple/quicktime_export.c @@ -503,7 +503,7 @@ void makeqtstring (RenderData *rd, char *string) { } -void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty) { +int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports) { OSErr err = noErr; char name[2048]; @@ -515,6 +515,7 @@ void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty) #else char *qtname; #endif + int success= 1; if(qtexport == NULL) qtexport = MEM_callocN(sizeof(QuicktimeExport), "QuicktimeExport"); @@ -534,57 +535,57 @@ void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty) check_renderbutton_framerate(rd); } - if (G.afbreek != 1) { - sframe = (rd->sfra); + sframe = (rd->sfra); - makeqtstring(rd, name); + makeqtstring(rd, name); #ifdef __APPLE__ - EnterMoviesOnThread(0); - 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"); + EnterMoviesOnThread(0); + 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"); #endif #ifdef _WIN32 - qtname = get_valid_qtname(name); - sprintf(theFullPath, "%s", qtname); - strcpy(name, qtname); - MEM_freeN(qtname); - - CopyCStringToPascal(theFullPath, qtexport->qtfilename); - err = FSMakeFSSpec(0, 0L, qtexport->qtfilename, &qtexport->theSpec); + qtname = get_valid_qtname(name); + sprintf(theFullPath, "%s", qtname); + strcpy(name, qtname); + MEM_freeN(qtname); + + CopyCStringToPascal(theFullPath, qtexport->qtfilename); + err = FSMakeFSSpec(0, 0L, qtexport->qtfilename, &qtexport->theSpec); #endif - err = CreateMovieFile (&qtexport->theSpec, - kMyCreatorType, - smCurrentScript, - createMovieFileDeleteCurFile | createMovieFileDontCreateResFile, - &qtexport->resRefNum, - &qtexport->theMovie ); - CheckError(err, "CreateMovieFile error"); - - if(err != noErr) { - G.afbreek = 1; -// XXX error("Unable to create Quicktime movie: %s", name); + err = CreateMovieFile (&qtexport->theSpec, + kMyCreatorType, + smCurrentScript, + createMovieFileDeleteCurFile | createMovieFileDontCreateResFile, + &qtexport->resRefNum, + &qtexport->theMovie ); + CheckError(err, "CreateMovieFile error"); + + if(err != noErr) { + BKE_reportf(reports, RPT_ERROR, "Unable to create Quicktime movie: %s", name); + success= 0; #ifdef __APPLE__ - ExitMoviesOnThread(); + ExitMoviesOnThread(); #endif - } else { - printf("Created QuickTime movie: %s\n", name); + } else { + printf("Created QuickTime movie: %s\n", name); - QT_CreateMyVideoTrack(rectx, recty); - } + QT_CreateMyVideoTrack(rectx, recty); } + + return success; } diff --git a/source/blender/quicktime/quicktime_export.h b/source/blender/quicktime/quicktime_export.h index 69f679693f6..543371999ed 100644 --- a/source/blender/quicktime/quicktime_export.h +++ b/source/blender/quicktime/quicktime_export.h @@ -46,8 +46,8 @@ struct RenderData; struct Scene; struct wmOperatorType; -void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty); //for movie handle (BKE writeavi.c now) -void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty); +int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports); //for movie handle (BKE writeavi.c now) +int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports); void end_qt(void); /*RNA helper functions */ -- cgit v1.2.3