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; }