Example #1
0
static OSErr QT_SaveCodecSettingsToScene(RenderData *rd, ReportList *reports)
{	
	QTAtomContainer  myContainer = NULL;
	ComponentResult  myErr = noErr;
	Ptr              myPtr;
	long             mySize = 0;

	CodecInfo        ci;

	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) {
		BKE_report(reports, RPT_ERROR, "Quicktime: SCGetSettingsAsAtomContainer failed");
		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);
	}
	else {
		BKE_report(reports, RPT_ERROR, "Quicktime: QT_SaveCodecSettingsToScene failed"); 
	}

	QTUnlockContainer(myContainer);

bail:
	if (myContainer != NULL)
		QTDisposeAtomContainer(myContainer);
		
	return((OSErr)myErr);
}
int qCreateDecoderAPI(QDecoder **dptr, char* args, int semaIndex, int width, int height)
{
	QDecoder* decoder;			// the decompressor to be initialized
	ImageDescription* imDesc;	// description of input frame images
	ImageDescriptionHandle myImHandle;
	
	CFNumberRef number = NULL;
	CFMutableDictionaryRef pixelBufferAttributes = NULL;
	ICMDecompressionTrackingCallbackRecord trackingCallbackRecord;
	QVideoArgs* decoderArgs = (QVideoArgs*)args;
	CodecInfo codecInfo;
	
	OSType pixelFormat = Q_PIXEL_FORMAT;
	
	OSStatus err;             // status of QuickTime functions

	fprintf(QSTDERR, "\nqCreateDecoderQT: START DECODER CREATION! (width: %d height: %d)", width, height);

	decoder = (QDecoder*)malloc(sizeof(QDecoder));
	if (decoder == NULL) {
		fprintf(QSTDERR, "\nqCreateDecoderQT: failed to malloc decoder struct");
		return -2; 
	}

	// Get codec info
	decoder->codecType = *((CodecType*)(decoderArgs->codecType));
	err = GetCodecInfo(&codecInfo, decoder->codecType, NULL);
	if (err != noErr) {
		fprintf(QSTDERR, "\nqCreateDecoderQT: cannot get codec info");
		fprintf(QSTDERR, "\n\tQUICKTIME ERROR CODE: %d", err);
		free(decoder);
		return -5;
	}

	// We have found an available camera to initialize.
	decoder->timeScale = decoderArgs->timeScale;
	decoder->semaIndex = semaIndex;
	decoder->width = width;
	decoder->height = height;
	decoder->inFrameCount = decoder->outFrameCount = 0;
	qInitCallbackData(&(decoder->callbackData));
	
	fprintf(QSTDERR, "\nqCreateDecoderQT: INITIALIZED STRUCTURE");
	
	imDesc = &(decoder->imDesc);
	imDesc->idSize          = 86;                     // grabbed from camera (total size of ImageDescription including extra data)
	imDesc->cType			= decoder->codecType;
	//imDesc->resvd1;                                 // reserved for Apple use
	//imDesc->resvd2;                                 // reserved for Apple use
	imDesc->dataRefIndex    = 0;                      // docs say that this must be set to zero
	imDesc->version			= codecInfo.version;
	imDesc->revisionLevel   = codecInfo.revisionLevel;
	imDesc->vendor          = codecInfo.vendor;         
	imDesc->temporalQuality = codecNormalQuality;
	imDesc->spatialQuality  = codecNormalQuality;
	imDesc->width           = width;                  // in pixels
	imDesc->height          = height;                 // in pixels
	imDesc->hRes            = FloatToFixed(72.0);     // DPI, I presume                
	imDesc->vRes            = FloatToFixed(72.0);     // ditto
	imDesc->dataSize        = 0;                      // every frame will have a different size
	imDesc->frameCount      = 0;                      // # of frames this desc applies to (is '1' what we want?)
	memcpy(imDesc->name, codecInfo.typeName, 32 );
	imDesc->depth           = 24;                     // might eventually want to support 32 (to support an alpha-channel)
	imDesc->clutID          = -1;                     // no color-lookup table
		
	fprintf(QSTDERR, "\nqCreateDecoderQT: INITIALIZED IMAGE DESCRIPTION");
	
	pixelBufferAttributes = CFDictionaryCreateMutable( NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks );

		number = CFNumberCreate( NULL, kCFNumberIntType, &width );
		CFDictionaryAddValue( pixelBufferAttributes, kCVPixelBufferWidthKey, number );
		CFRelease( number );
		
		number = CFNumberCreate( NULL, kCFNumberIntType, &height );
		CFDictionaryAddValue( pixelBufferAttributes, kCVPixelBufferHeightKey, number );
		CFRelease( number );
		
		number = CFNumberCreate( NULL, kCFNumberSInt32Type, &pixelFormat );
		CFDictionaryAddValue( pixelBufferAttributes, kCVPixelBufferPixelFormatTypeKey, number );
		CFRelease( number );
		
		CFDictionaryAddValue( pixelBufferAttributes, kCVPixelBufferCGBitmapContextCompatibilityKey, kCFBooleanTrue );
		CFDictionaryAddValue( pixelBufferAttributes, kCVPixelBufferCGImageCompatibilityKey, kCFBooleanTrue );

	fprintf(QSTDERR, "\nqCreateDecoderQT: SET UP PIXEL-BUFFER ATTRIBUTES");

	trackingCallbackRecord.decompressionTrackingCallback = (ICMDecompressionTrackingCallback)qQuickTimeDecoderCallback;
	trackingCallbackRecord.decompressionTrackingRefCon = decoder;
	
	fprintf(QSTDERR, "\nqCreateDecoderQT: SET UP CALLBACK RECORD");
	
	// Actually create the session.  First, we need to allocate copy the image description into a handle
	// (Quicktime requires this... we dispose of the handle immediately afterward).
	myImHandle = (ImageDescriptionHandle)NewHandle(sizeof(ImageDescription));
	**myImHandle = *imDesc;
	fprintf(QSTDERR, "\nDECOMPRESSOR IMAGE DESCRIPTION:");
	qPrintImageDescription(myImHandle);
	
	//  err = ICMDecompressionSessionCreate(kCFAllocatorDefault, myImHandle, NULL, pixelBufferAttributes, &trackingCallbackRecord, &(decomp->session));
	err = ICMDecompressionSessionCreate(NULL, myImHandle, NULL, pixelBufferAttributes, &trackingCallbackRecord, &(decoder->session));

	DisposeHandle((Handle)myImHandle);
	
	if (err != noErr) {
		fprintf(QSTDERR, "\nqCreateDecoderQT: cannot create session");
		fprintf(QSTDERR, "\n\tQUICKTIME ERROR CODE: %d", err);
		free(decoder);
		return -5;
	}
	
	fprintf(QSTDERR, "\nqCreateDecoderQT: FINISHED!!!");
	
	*dptr = decoder;
	return 0;
}