Quicktime Carbon: Fix memory leak when build with cocoa

This commit is contained in:
Damien Plisson 2009-12-03 12:16:00 +00:00
parent 1fd581ad77
commit 3b1c6d6065
5 changed files with 54 additions and 4 deletions

@ -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})

@ -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')

@ -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

@ -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)

@ -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 */