aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-11-29 15:29:11 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-12-01 13:58:20 +0100
commitd1b47f3bfcc625ca1cae210fc198dcbd54381a88 (patch)
tree1caeb68bdaf34e3b7cbfab12e1854bff934741bf
parent8a18db3ec6af13c0a9889f1ef61d38cabc714813 (diff)
downloadffmpeg-d1b47f3bfcc625ca1cae210fc198dcbd54381a88.tar.gz
avcodec/vaapi_encode: Fix segfault upon closing uninitialized encoder
Fixes ticket #9537. Probably a regression since 2b3206891649f317c20993411efef4bee39ae784. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r--libavcodec/vaapi_encode.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index ec054ae701..3bf379b1a0 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -2366,6 +2366,11 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
VAStatus vas;
int err;
+ ctx->va_config = VA_INVALID_ID;
+ ctx->va_context = VA_INVALID_ID;
+
+ /* If you add something that can fail above this av_frame_alloc(),
+ * modify ff_vaapi_encode_close() accordingly. */
ctx->frame = av_frame_alloc();
if (!ctx->frame) {
return AVERROR(ENOMEM);
@@ -2377,9 +2382,6 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
return AVERROR(EINVAL);
}
- ctx->va_config = VA_INVALID_ID;
- ctx->va_context = VA_INVALID_ID;
-
ctx->input_frames_ref = av_buffer_ref(avctx->hw_frames_ctx);
if (!ctx->input_frames_ref) {
err = AVERROR(ENOMEM);
@@ -2531,6 +2533,11 @@ av_cold int ff_vaapi_encode_close(AVCodecContext *avctx)
VAAPIEncodeContext *ctx = avctx->priv_data;
VAAPIEncodePicture *pic, *next;
+ /* We check ctx->frame to know whether ff_vaapi_encode_init()
+ * has been called and va_config/va_context initialized. */
+ if (!ctx->frame)
+ return 0;
+
for (pic = ctx->pic_start; pic; pic = next) {
next = pic->next;
vaapi_encode_free(avctx, pic);