Revision: 24631
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24631
Author:   damien78
Date:     2009-11-18 10:49:42 +0100 (Wed, 18 Nov 2009)

Log Message:
-----------
Quicktime for Cocoa : import part
This makes quicktime import (.mov & quicktime handled image files such as .gif) 
available also for 64bit OSX

Unfortunately, Apple currently incomplete implementation of QTKit has much 
lower performance than old Carbon Quicktime.
FYI, it spawns a 32bit process "QTKitserver" to place calls to Quicktime 7.

So this is mostly meant as a "backup" for 64bit OSX builds, until Apple 
releases full Quicktime X.

Export part will come just after.

CMake scripts updated: set WITH_QUICKTIME and USE_QTKIT to ON

Modified Paths:
--------------
    trunk/blender/CMakeLists.txt
    trunk/blender/source/blender/imbuf/intern/util.c
    trunk/blender/source/blender/quicktime/CMakeLists.txt
    trunk/blender/source/blender/quicktime/apple/quicktime_import.c
    trunk/blender/source/blender/quicktime/quicktime_import.h

Added Paths:
-----------
    trunk/blender/source/blender/quicktime/apple/qtkit_export.m
    trunk/blender/source/blender/quicktime/apple/qtkit_import.m

Modified: trunk/blender/CMakeLists.txt
===================================================================
--- trunk/blender/CMakeLists.txt        2009-11-18 08:50:09 UTC (rev 24630)
+++ trunk/blender/CMakeLists.txt        2009-11-18 09:49:42 UTC (rev 24631)
@@ -84,6 +84,7 @@
 
 IF (APPLE)
 OPTION(WITH_COCOA        "Use Cocoa framework instead of deprecated Carbon" ON)
+OPTION(USE_QTKIT         "Use QtKit instead of Carbon quicktime (needed for 
having partial quicktime for 64bit)" OFF)
 OPTION(WITH_LIBS10.5     "Use 10.5 libs (needed for 64bit builds)" OFF)
 ENDIF (APPLE)
 
@@ -525,7 +526,15 @@
 
        IF (WITH_COCOA)
        SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing 
-DGHOST_COCOA")
-       SET(PLATFORM_LINKFLAGS "-fexceptions -framework CoreServices -framework 
Foundation -framework IOKit -framework AppKit -framework Cocoa -framework 
Carbon -framework AudioUnit -framework AudioToolbox -framework CoreAudio 
-framework QuickTime")
+       SET(PLATFORM_LINKFLAGS "-fexceptions -framework CoreServices -framework 
Foundation -framework IOKit -framework AppKit -framework Cocoa -framework 
Carbon -framework AudioUnit -framework AudioToolbox -framework CoreAudio")
+       IF(USE_QTKIT)
+       SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -DUSE_QTKIT")
+       SET(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -framework QTKit")
+       ELSE(USE_QTKIT)
+       IF(WITH_QUICKTIME)
+       SET(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -framework QuickTime")
+       ENDIF(WITH_QUICKTIME)
+       ENDIF(USE_QTKIT)
        ELSE (WITH_COCOA)
        SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing")
        SET(PLATFORM_LINKFLAGS "-fexceptions -framework CoreServices -framework 
Foundation -framework IOKit -framework AppKit -framework Carbon -framework AGL 
-framework AudioUnit -framework AudioToolbox -framework CoreAudio -framework 
QuickTime")

Modified: trunk/blender/source/blender/imbuf/intern/util.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/util.c    2009-11-18 08:50:09 UTC 
(rev 24630)
+++ trunk/blender/source/blender/imbuf/intern/util.c    2009-11-18 09:49:42 UTC 
(rev 24631)
@@ -384,6 +384,9 @@
        if(UTIL_DEBUG) printf("in getanimtype: %s\n", name);
 
 #ifndef _WIN32
+#      ifdef WITH_QUICKTIME
+       if (isqtime(name)) return (ANIM_QTIME);
+#      endif
 #      ifdef WITH_FFMPEG
        /* stat test below fails on large files > 4GB */
        if (isffmpeg(name)) return (ANIM_FFMPEG);
@@ -394,9 +397,6 @@
        if (isavi(name)) return (ANIM_AVI);
 
        if (ismovie(name)) return (ANIM_MOVIE);
-#      ifdef WITH_QUICKTIME
-       if (isqtime(name)) return (ANIM_QTIME);
-#      endif
 #else
        if (ib_stat(name,&st) == -1) return(0);
        if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);

Modified: trunk/blender/source/blender/quicktime/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/quicktime/CMakeLists.txt       2009-11-18 
08:50:09 UTC (rev 24630)
+++ trunk/blender/source/blender/quicktime/CMakeLists.txt       2009-11-18 
09:49:42 UTC (rev 24631)
@@ -24,7 +24,11 @@
 #
 # ***** END GPL LICENSE BLOCK *****
 
-SET(SRC apple/quicktime_import.c apple/quicktime_export.c)
+IF(USE_QTKIT)
+       SET(SRC apple/qtkit_import.m apple/qtkit_export.m)
+ELSE(USE_QTKIT)
+       SET(SRC apple/quicktime_import.c apple/quicktime_export.c)
+ENDIF(USE_QTKIT)
 
 SET(INC 
        .

Added: trunk/blender/source/blender/quicktime/apple/qtkit_export.m
===================================================================
--- trunk/blender/source/blender/quicktime/apple/qtkit_export.m                 
        (rev 0)
+++ trunk/blender/source/blender/quicktime/apple/qtkit_export.m 2009-11-18 
09:49:42 UTC (rev 24631)
@@ -0,0 +1,665 @@
+/**
+ * $Id: qtkit_export.m 24424 2009-11-09 17:06:48Z damien78 $
+ *
+ * qtkit_export.m
+ *
+ * Code to create QuickTime Movies with Blender
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ *
+ * The Original Code is written by Rob Haarsma (phase)
+ *
+ * Contributor(s): Stefan Gartner (sgefant)
+ *                                Damien Plisson 11/2009
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifdef WITH_QUICKTIME
+#if defined(_WIN32) || defined(__APPLE__)
+
+#include "DNA_scene_types.h"
+
+#include "BKE_global.h"
+#include "BKE_scene.h"
+
+#include "BLI_blenlib.h"
+
+#include "BLO_sys_types.h"
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "quicktime_import.h"
+#include "quicktime_export.h"
+
+
+#ifdef __APPLE__
+/* evil */
+#ifndef __AIFF__
+#define __AIFF__
+#endif
+#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 {
+
+       /*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
+
+} 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;

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to