From: Sebastien Zwickert <[email protected]>

Fix a buffer leak when seeking occurs.

Signed-off-by: Luca Barbato <[email protected]>
---
 libavcodec/vda_h264.c | 25 ++++++++++++++++++++++++-
 libavcodec/version.h  |  4 ++--
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/libavcodec/vda_h264.c b/libavcodec/vda_h264.c
index e9c4af6..a7183c6 100644
--- a/libavcodec/vda_h264.c
+++ b/libavcodec/vda_h264.c
@@ -107,6 +107,12 @@ static int vda_h264_decode_slice(AVCodecContext *avctx,
     return 0;
 }
 
+static void vda_h264_release_buffer(void *opaque, uint8_t *data)
+{
+    CVPixelBufferRef cv_buffer = opaque;
+    CVPixelBufferRelease(cv_buffer);
+}
+
 static int vda_h264_end_frame(AVCodecContext *avctx)
 {
     H264Context *h                      = avctx->priv_data;
@@ -120,8 +126,25 @@ static int vda_h264_end_frame(AVCodecContext *avctx)
     status = vda_sync_decode(vda_ctx);
     frame->data[3] = (void*)vda_ctx->cv_buffer;
 
-    if (status)
+    if (status) {
         av_log(avctx, AV_LOG_ERROR, "Failed to decode frame (%d)\n", status);
+        return status;
+    }
+
+    /* VDA workaround to release properly each core video buffer:
+     * we need to create an extra av_buffer with a custom freeing callback
+     * to avoid potential memory leaks. */
+    h->cur_pic_ptr->hwaccel_priv_buf = av_buffer_create(frame->data[0],
+                                                        0,
+                                                        
vda_h264_release_buffer,
+                                                        vda_ctx->cv_buffer,
+                                                        0);
+    if (!h->cur_pic_ptr->hwaccel_priv_buf) {
+        CVPixelBufferRelease(vda_ctx->cv_buffer);
+        return AVERROR(ENOMEM);
+    }
+
+    h->cur_pic_ptr->hwaccel_picture_private = 
h->cur_pic_ptr->hwaccel_priv_buf->data;
 
     return status;
 }
diff --git a/libavcodec/version.h b/libavcodec/version.h
index cdd5a61..a813fc9 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,8 +29,8 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR 55
-#define LIBAVCODEC_VERSION_MINOR 34
-#define LIBAVCODEC_VERSION_MICRO  1
+#define LIBAVCODEC_VERSION_MINOR 35
+#define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \
-- 
1.8.5.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to