aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2016-06-12 17:28:28 +0100
committerMark Thompson <sw@jkqxz.net>2016-11-13 20:39:48 +0000
commit2dee500f4cbf64c547a37046e95141b84c85ee55 (patch)
treeb33a0b07dba95fb121527b43571db18dd035fd31
parenta8d51bb42474b1641f45b5b3815864ea323a3e59 (diff)
downloadffmpeg-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.
-rw-r--r--libavcodec/vaapi_encode.c22
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;