[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24646] trunk/blender/source/blender/ quicktime/apple: Quicktime for Cocoa : export part

Damien Plisson damien.plisson at yahoo.fr
Wed Nov 18 16:02:00 CET 2009


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

Log Message:
-----------
Quicktime for Cocoa : export part
Following the quicktime import port, here is the movie export feature.

The codec selection remains to be implemented in the ui (render panel).
So the settings are now blocked on codec=jpeg, quality=max.

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

Modified: trunk/blender/source/blender/quicktime/apple/qtkit_export.m
===================================================================
--- trunk/blender/source/blender/quicktime/apple/qtkit_export.m	2009-11-18 14:36:23 UTC (rev 24645)
+++ trunk/blender/source/blender/quicktime/apple/qtkit_export.m	2009-11-18 15:01:59 UTC (rev 24646)
@@ -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);
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list