static void decompressCb( void *decompressionTrackingRefCon, OSStatus result, ICMDecompressionTrackingFlags decompressionTrackingFlags, CVPixelBufferRef pixelBuffer, TimeValue64 displayTime, TimeValue64 displayDuration, ICMValidTimeFlags validTimeFlags, void *reserved, void *sourceFrameRefCon ) { MacOSXVideoDecoder * macosx; GstBuffer *origbuf = (GstBuffer *) sourceFrameRefCon; macosx = (MacOSXVideoDecoder *) decompressionTrackingRefCon; GST_LOG_OBJECT (macosx, "result:%d, flags:0x%x, pixelBuffer:%p, displayTime:%lld, displayDuration:%lld", result, decompressionTrackingFlags, pixelBuffer, displayTime, displayDuration); if (decompressionTrackingFlags & kICMDecompressionTracking_ReleaseSourceData) { GST_LOG ("removing previous buffer : %p", origbuf); gst_buffer_unref (origbuf); } if ((decompressionTrackingFlags & kICMDecompressionTracking_EmittingFrame) && pixelBuffer) { gpointer addr; GstBuffer *outbuf; size_t size = CVPixelBufferGetDataSize(pixelBuffer); /* allocate buffer */ macosx->lastret = gst_pad_alloc_buffer (macosx->srcpad, GST_BUFFER_OFFSET_NONE, size, GST_PAD_CAPS (macosx->srcpad), &outbuf); if (G_UNLIKELY (macosx->lastret != GST_FLOW_OK)) { GST_LOG ("gst_pad_alloc_buffer() returned %s", gst_flow_get_name (macosx->lastret)); goto beach; } CVPixelBufferRetain (pixelBuffer); if (CVPixelBufferLockBaseAddress (pixelBuffer, 0)) GST_WARNING ("Couldn't lock base adress on pixel buffer !"); addr = CVPixelBufferGetBaseAddress(pixelBuffer); /* copy data */ GST_LOG ("copying data in buffer"); g_memmove (GST_BUFFER_DATA (outbuf), addr, size); GST_LOG ("Releasing pixelbuffer"); CVPixelBufferUnlockBaseAddress (pixelBuffer, 0); CVPixelBufferRelease (pixelBuffer); /* Set proper timestamp ! */ gst_buffer_set_caps (outbuf, GST_PAD_CAPS (macosx->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = displayTime; GST_BUFFER_DURATION (outbuf) = displayDuration; GST_BUFFER_SIZE (outbuf) = macosx->outsize; /* push buffer */ GST_LOG ("Pushing buffer out !"); macosx->lastret = gst_pad_push (macosx->srcpad, outbuf); } else { macosx->lastret = GST_FLOW_OK; } beach: return; }