[FFmpeg-devel] [PATCH] vaapi_encode: explicitly free buffers after vaEndPicture

Will Kelleher wkelleher at gogoair.com
Wed Jun 8 19:23:14 CEST 2016


Hi all -

I'm experiencing some significant heap growth when encoding with VAAPI on
my Ivy Bridge hardware.  Based on what I'm seeing from Massif, it seems like
the parameter buffers allocated in vaapi_encode_make_param_buffer are leaking.

I came across this thread [1] that indicates that vaEndPicture might not be
freeing the param buffers like the libva documentation says it should.

I also noticed that VLC [2] seems to explicitly call vaDestroyBuffer on the
param buffers after vaEndPicture.

When I try that, the leak is gone.

Thoughts?

Thanks,

will

1: https://lists.freedesktop.org/archives/libva/2012-July/000952.html
2: https://github.com/BtbN/vlc-vaapi-enc/blob/master/vlc-h264-vaapi-enc.c

---
 libavcodec/vaapi_encode.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 329b33c..6fca815 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -370,6 +370,19 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
         goto fail_at_end;
     }
 
+    // Although the documentation says that vaEndPicture will free these buffers,
+    // in practice that appears not to be the case. We need to explicitly free
+    // them to avoid a massive leak.
+    for(i = 0; i < pic->nb_param_buffers; i++) {
+        if (pic->param_buffers[i] != VA_INVALID_ID) {
+            vas = vaDestroyBuffer(ctx->hwctx->display, pic->param_buffers[i]);
+            if (vas != 0) {
+                av_log(avctx, AV_LOG_WARNING, "Failed to destroy param buffer %d\n",i);
+            }
+            pic->param_buffers[i] = VA_INVALID_ID;
+        }
+    }
+
     pic->encode_issued = 1;
 
     if (ctx->issue_mode == ISSUE_MODE_SERIALISE_EVERYTHING)
-- 
2.8.0



More information about the ffmpeg-devel mailing list