From e1601406a5ab4a82965a3c2c7d475c52379a02fd Mon Sep 17 00:00:00 2001 From: Matthieu Bouron Date: Mon, 16 Jun 2014 12:35:13 +0200 Subject: [PATCH] vtenc: fix memory leak The pixel buffer release callback is called if the void * dataPtr given to the CVPixelBufferCreateWithPlanarBytes is not NULL. According to the documentation dataPtr is supposed to be a "plane description block" but no specific type is given. https://bugzilla.gnome.org/show_bug.cgi?id=711847 --- sys/applemedia/vtenc.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/sys/applemedia/vtenc.c b/sys/applemedia/vtenc.c index b9232aaa5a..7dee3404d6 100644 --- a/sys/applemedia/vtenc.c +++ b/sys/applemedia/vtenc.c @@ -99,6 +99,10 @@ static GstVTEncFrame *gst_vtenc_frame_new (GstBuffer * buf, GstVideoInfo * videoinfo); static void gst_vtenc_frame_free (GstVTEncFrame * frame); +static void gst_pixel_buffer_release_cb (void *releaseRefCon, + const void *dataPtr, size_t dataSize, size_t numberOfPlanes, + const void *planeAddresses[]); + static GstStaticCaps sink_caps = GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ NV12, I420 }")); @@ -812,15 +816,13 @@ gst_vtenc_encode_frame (GstVTEnc * self, GstBuffer * buf) cv_ret = CVPixelBufferCreateWithPlanarBytes (NULL, self->negotiated_width, self->negotiated_height, pixel_format_type, - NULL, + frame, GST_VIDEO_FRAME_SIZE (&frame->videoframe), num_planes, plane_base_addresses, plane_widths, plane_heights, - plane_bytes_per_row, - (CVPixelBufferReleasePlanarBytesCallback) gst_vtenc_frame_free, frame, - NULL, &pbuf); + plane_bytes_per_row, gst_pixel_buffer_release_cb, frame, NULL, &pbuf); if (cv_ret != kCVReturnSuccess) { gst_vtenc_frame_free (frame); goto cv_error; @@ -965,6 +967,15 @@ gst_vtenc_frame_free (GstVTEncFrame * frame) g_slice_free (GstVTEncFrame, frame); } +static void +gst_pixel_buffer_release_cb (void *releaseRefCon, const void *dataPtr, + size_t dataSize, size_t numberOfPlanes, const void *planeAddresses[]) +{ + GstVTEncFrame *frame = (GstVTEncFrame *) releaseRefCon; + + gst_vtenc_frame_free (frame); +} + static void gst_vtenc_register (GstPlugin * plugin, const GstVTEncoderDetails * codec_details)