diff options
author | Mark Thompson <sw@jkqxz.net> | 2016-06-12 17:28:28 +0100 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2016-11-13 20:39:48 +0000 |
commit | 2dee500f4cbf64c547a37046e95141b84c85ee55 (patch) | |
tree | b33a0b07dba95fb121527b43571db18dd035fd31 /libavcodec/vaapi_encode.c | |
parent | a8d51bb42474b1641f45b5b3815864ea323a3e59 (diff) | |
download | ffmpeg-2dee500f4cbf64c547a37046e95141b84c85ee55.tar.gz |
vaapi_encode: Respect driver quirks around buffer destruction
No longer leaks memory when used with a driver with the "render does
not destroy param buffers" quirk (i.e. Intel i965).
(cherry picked from commit 221ffca6314ed3ba9d38464ea50cd85251c04e74)
Fixes ticket #5871.
Diffstat (limited to 'libavcodec/vaapi_encode.c')
-rw-r--r-- | libavcodec/vaapi_encode.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index f8d848bc16..4a92506b41 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -385,7 +385,27 @@ static int vaapi_encode_issue(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "Failed to end picture encode issue: " "%d (%s).\n", vas, vaErrorStr(vas)); err = AVERROR(EIO); - goto fail_at_end; + // vaRenderPicture() has been called here, so we should not destroy + // the parameter buffers unless separate destruction is required. + if (ctx->hwctx->driver_quirks & + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS) + goto fail; + else + goto fail_at_end; + } + + if (ctx->hwctx->driver_quirks & + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS) { + for (i = 0; i < pic->nb_param_buffers; i++) { + vas = vaDestroyBuffer(ctx->hwctx->display, + pic->param_buffers[i]); + if (vas != VA_STATUS_SUCCESS) { + av_log(avctx, AV_LOG_ERROR, "Failed to destroy " + "param buffer %#x: %d (%s).\n", + pic->param_buffers[i], vas, vaErrorStr(vas)); + // And ignore. + } + } } pic->encode_issued = 1; |