From 3b1c6d6065ea784e6986bff58a842afd0915dc7a Mon Sep 17 00:00:00 2001 From: Damien Plisson Date: Thu, 3 Dec 2009 12:16:00 +0000 Subject: [PATCH] Quicktime Carbon: Fix memory leak when build with cocoa --- intern/ghost/CMakeLists.txt | 4 ++++ intern/ghost/SConscript | 6 ++++- intern/ghost/intern/GHOST_SystemCocoa.mm | 22 +++++++++++++++++++ source/blender/quicktime/SConscript | 7 +++++- .../quicktime/apple/quicktime_export.c | 19 ++++++++++++++-- 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index 92d0abce2b8..77afcc929aa 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -45,6 +45,10 @@ IF(APPLE) LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp") LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp") LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp") + + IF(WITH_QUICKTIME) + ADD_DEFINITIONS(-DWITH_QUICKTIME) + ENDIF(WITH_QUICKTIME) ELSE(APPLE) IF(WIN32) SET(INC ${INC} ${WINTAB_INC}) diff --git a/intern/ghost/SConscript b/intern/ghost/SConscript index 90a86ae01a9..2a06a9d3c9e 100644 --- a/intern/ghost/SConscript +++ b/intern/ghost/SConscript @@ -12,6 +12,7 @@ if window_system == 'darwin': pf = ['GHOST_DisplayManager', 'GHOST_System', 'GHOST_Window', 'GHOST_DropTarget'] +defs=['_USE_MATH_DEFINES'] if window_system in ('linux2', 'openbsd3', 'sunos5', 'freebsd6', 'irix6'): for f in pf: @@ -29,6 +30,10 @@ elif window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64 pass elif window_system == 'darwin': if env['WITH_GHOST_COCOA']: + if env['WITH_BF_QUICKTIME']: + defs.append('WITH_QUICKTIME') + if env['USE_QTKIT']: + defs.append('USE_QTKIT') for f in pf: try: sources.remove('intern' + os.sep + f + 'Win32.cpp') @@ -49,7 +54,6 @@ else: print "Unknown window system specified." Exit() -defs=['_USE_MATH_DEFINES'] if env['BF_GHOST_DEBUG']: defs.append('BF_GHOST_DEBUG') diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index f7036f21642..37befdf7f85 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -389,6 +389,28 @@ extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG]) { } } +#if defined(WITH_QUICKTIME) && !defined(USE_QTKIT) +//Need to place this quicktime function in an ObjC file +//It is used to avoid memory leak when raising the quicktime "compression settings" standard dialog +extern "C" { + struct bContext; + struct wmOperator; + extern int fromcocoa_request_qtcodec_settings(bContext *C, wmOperator *op); + + +int cocoa_request_qtcodec_settings(bContext *C, wmOperator *op) +{ + int result; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + result = fromcocoa_request_qtcodec_settings(C, op); + + [pool drain]; + return result; +} +}; +#endif + #pragma mark Cocoa objects diff --git a/source/blender/quicktime/SConscript b/source/blender/quicktime/SConscript index 549b3cffe5a..c8cd795decb 100644 --- a/source/blender/quicktime/SConscript +++ b/source/blender/quicktime/SConscript @@ -30,4 +30,9 @@ incs.append(env['BF_QUICKTIME_INC']) types = ['core','player'] priorities = [200,235] -env.BlenderLib ('bf_quicktime', sources=source_files, includes=incs, defines=['WITH_QUICKTIME'], libtype=types, priority=priorities) +defs=['WITH_QUICKTIME'] + +if env['WITH_GHOST_COCOA']: + defs.append('GHOST_COCOA') + +env.BlenderLib ('bf_quicktime', sources=source_files, includes=incs, defines=defs, libtype=types, priority=priorities) diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c index dea170ddeb4..68fd60d89d2 100644 --- a/source/blender/quicktime/apple/quicktime_export.c +++ b/source/blender/quicktime/apple/quicktime_export.c @@ -783,7 +783,7 @@ static int request_qtcodec_settings(bContext *C, wmOperator *op) err = SCRequestSequenceSettings(qtdata->theComponent); if (err == scUserCancelled) { - return 0; + return OPERATOR_FINISHED; } // update runtime codecsettings for use with the codec dialog @@ -844,7 +844,7 @@ static int request_qtcodec_settings(bContext *C, wmOperator *op) } } - return 1; + return OPERATOR_FINISHED; } static int ED_operator_setqtcodec(bContext *C) @@ -852,6 +852,17 @@ static int ED_operator_setqtcodec(bContext *C) return G.have_quicktime != FALSE; } +#if defined(__APPLE__) && defined(GHOST_COCOA) +//Need to set up a Cocoa NSAutoReleasePool to avoid memory leak +//And it must be done in an objC file, so use a GHOST_SystemCocoa.mm function for that +extern int cocoa_request_qtcodec_settings(bContext *C, wmOperator *op); + +int fromcocoa_request_qtcodec_settings(bContext *C, wmOperator *op) +{ + return request_qtcodec_settings(C, op); +} +#endif + void SCENE_OT_render_data_set_quicktime_codec(wmOperatorType *ot) { @@ -861,7 +872,11 @@ void SCENE_OT_render_data_set_quicktime_codec(wmOperatorType *ot) ot->idname= "SCENE_OT_render_data_set_quicktime_codec"; /* api callbacks */ +#if defined(__APPLE__) && defined(GHOST_COCOA) + ot->exec = cocoa_request_qtcodec_settings; +#else ot->exec= request_qtcodec_settings; +#endif ot->poll= ED_operator_setqtcodec; /* flags */