static void VDADecoderCallback (void *decompressionOutputRefCon, CFDictionaryRef frameInfo, OSStatus status, uint32_t infoFlags, CVImageBufferRef imageBuffer) { MoonVDADecoder *decoder = (MoonVDADecoder *) decompressionOutputRefCon; VideoStream *vs = (VideoStream *) decoder->GetStream (); // FIXME: Is this always 1 thread? Can we optimize this decoder->GetDeployment ()->RegisterThread (); Deployment::SetCurrent (decoder->GetDeployment ()); if (imageBuffer == NULL) { return; } OSType format_type = CVPixelBufferGetPixelFormatType (imageBuffer); if (format_type != kCVPixelFormatType_422YpCbCr8) { g_warning ("Mismatched format in VDA"); return; } MediaFrame *mf = (MediaFrame *) CFDictionaryGetValue (frameInfo, CFSTR ("MoonMediaFrame")); mf->AddState (MediaFrameVUY2); mf->FreeBuffer (); mf->SetBufLen (0); mf->srcSlideY = 0; mf->srcSlideH = vs->GetHeight (); mf->width = vs->GetWidth (); mf->height = vs->GetHeight (); CVPixelBufferLockBaseAddress (imageBuffer, 0); mf->data_stride [0] = (uint8_t *) CVPixelBufferGetBaseAddress (imageBuffer); mf->srcStride [0] = CVPixelBufferGetBytesPerRow (imageBuffer); mf->AddState (MediaFrameDecoded); mf->decoder_specific_data = imageBuffer; CVPixelBufferRetain (imageBuffer); decoder->ReportDecodeFrameCompleted (mf); mf->unref (); }
void MoonVDADecoder::OpenDecoderAsyncInternal () { IMediaStream *stream = GetStream (); VideoStream *vs = (VideoStream *) stream; int format = 'avc1'; CFDataRef avcCData = CFDataCreate (kCFAllocatorDefault, (const uint8_t*) stream->GetRawExtraData (), stream->GetRawExtraDataSize ()); OSStatus status = CreateDecoder ((SInt32) vs->GetHeight (), (SInt32) vs->GetWidth (), (OSType) format, avcCData); if (avcCData) CFRelease (avcCData); if (status == kVDADecoderNoErr) { SetPixelFormat (MoonPixelFormat422YpCbCr8); ReportOpenDecoderCompleted (); } else { char *str = g_strdup_printf ("MoonVDADecoder failed to open codec (result: %d)", status); ReportErrorOccurred (str); g_free (str); } }