diff --git a/sys/applemedia/corevideobuffer.c b/sys/applemedia/corevideobuffer.c index b1da334cbe..269e19d0e7 100644 --- a/sys/applemedia/corevideobuffer.c +++ b/sys/applemedia/corevideobuffer.c @@ -59,7 +59,8 @@ gst_core_video_meta_get_info (void) } GstBuffer * -gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo) +gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo, + gboolean map) { CVPixelBufferRef pixbuf = NULL; GstBuffer *buf; @@ -74,7 +75,7 @@ gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo) pixbuf = (CVPixelBufferRef) cvbuf; - if (CVPixelBufferLockBaseAddress (pixbuf, 0) != kCVReturnSuccess) { + if (map && CVPixelBufferLockBaseAddress (pixbuf, 0) != kCVReturnSuccess) { goto error; } @@ -101,10 +102,12 @@ gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo) offset[i] = off; off += size; - gst_buffer_append_memory (buf, - gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, - CVPixelBufferGetBaseAddressOfPlane (pixbuf, i), size, 0, size, - NULL, NULL)); + if (map) { + gst_buffer_append_memory (buf, + gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, + CVPixelBufferGetBaseAddressOfPlane (pixbuf, i), size, 0, size, + NULL, NULL)); + } } } else { int size; @@ -114,9 +117,11 @@ gst_core_video_buffer_new (CVBufferRef cvbuf, GstVideoInfo * vinfo) offset[0] = 0; size = stride[0] * CVPixelBufferGetHeight (pixbuf); - gst_buffer_append_memory (buf, - gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, - CVPixelBufferGetBaseAddress (pixbuf), size, 0, size, NULL, NULL)); + if (map) { + gst_buffer_append_memory (buf, + gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, + CVPixelBufferGetBaseAddress (pixbuf), size, 0, size, NULL, NULL)); + } } if (vinfo) { diff --git a/sys/applemedia/corevideobuffer.h b/sys/applemedia/corevideobuffer.h index 53b16a9be8..8f58a6e48c 100644 --- a/sys/applemedia/corevideobuffer.h +++ b/sys/applemedia/corevideobuffer.h @@ -41,7 +41,8 @@ typedef struct _GstCoreVideoMeta } GstCoreVideoMeta; GstBuffer * gst_core_video_buffer_new (CVBufferRef cvbuf, - GstVideoInfo *info); + GstVideoInfo *info, + gboolean map); GType gst_core_video_meta_api_get_type (void); G_END_DECLS diff --git a/sys/applemedia/qtkitvideosrc.m b/sys/applemedia/qtkitvideosrc.m index e6b427f87b..2c15bb5e33 100644 --- a/sys/applemedia/qtkitvideosrc.m +++ b/sys/applemedia/qtkitvideosrc.m @@ -434,7 +434,7 @@ openFailed: [queueLock unlockWithCondition: ([queue count] == 0) ? NO_FRAMES : HAS_FRAME_OR_STOP_REQUEST]; - *buf = gst_core_video_buffer_new ((CVBufferRef)frame, NULL); + *buf = gst_core_video_buffer_new ((CVBufferRef)frame, NULL, TRUE); CVBufferRelease (frame); [self timestampBuffer:*buf]; diff --git a/sys/applemedia/vtdec.c b/sys/applemedia/vtdec.c index 15385187e2..5903286147 100644 --- a/sys/applemedia/vtdec.c +++ b/sys/applemedia/vtdec.c @@ -640,7 +640,9 @@ gst_vtdec_session_output_callback (void *decompression_output_ref_con, * segment.format being undefined */ goto release; } - buf = gst_core_video_buffer_new (image_buffer, &state->info); + buf = + gst_core_video_buffer_new (image_buffer, &state->info, + vtdec->texture_cache == NULL); gst_video_codec_state_unref (state); gst_buffer_copy_into (buf, frame->input_buffer, diff --git a/sys/applemedia/vtenc.c b/sys/applemedia/vtenc.c index 8365da1819..269172b363 100644 --- a/sys/applemedia/vtenc.c +++ b/sys/applemedia/vtenc.c @@ -1098,7 +1098,8 @@ gst_vtenc_encode_frame (GstVTEnc * self, GstVideoCodecFrame * frame) goto cv_error; } - outbuf = gst_core_video_buffer_new ((CVBufferRef) pbuf, &self->video_info); + outbuf = + gst_core_video_buffer_new ((CVBufferRef) pbuf, &self->video_info, TRUE); if (!gst_video_frame_map (&outframe, &self->video_info, outbuf, GST_MAP_WRITE)) { gst_video_frame_unmap (&inframe);