[FFmpeg-devel] [PATCH] avcodec/decode: clean-up if get_hw_frames_parameters fails
Rémi Denis-Courmont
remi at remlab.net
Mon Oct 7 18:12:47 EEST 2024
Le 30 septembre 2024 17:27:46 GMT+09:00, Thomas Guillem via ffmpeg-devel <ffmpeg-devel at ffmpeg.org> a écrit :
>Fixes the following assert:
>
>[00007f1df83d17e0] vaapi generic error: avcodec_get_hw_frames_parameters failed: -22
>Assertion p_dst->hwaccel_threadsafe || (!dst->hwaccel && !dst->internal->hwaccel_priv_data) failed at libavcodec/pthread_frame.c:349
>
>Reproduced from VLC with VAAPI, when fallbacking from hw to sw.
>---
> libavcodec/decode.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
>diff --git a/libavcodec/decode.c b/libavcodec/decode.c
>index c331bb8596..e90a6630e1 100644
>--- a/libavcodec/decode.c
>+++ b/libavcodec/decode.c
>@@ -19,6 +19,7 @@
> */
>
> #include <stdint.h>
>+#include <stdbool.h>
> #include <string.h>
>
> #include "config.h"
>@@ -1173,6 +1174,7 @@ int avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
> const AVCodecHWConfigInternal *hw_config;
> const FFHWAccel *hwa;
> int i, ret;
>+ bool clean_priv_data = false;
>
> for (i = 0;; i++) {
> hw_config = ffcodec(avctx->codec)->hw_configs[i];
>@@ -1197,6 +1199,7 @@ int avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
> av_buffer_unref(&frames_ref);
> return AVERROR(ENOMEM);
> }
>+ clean_priv_data = true;
> }
>
> ret = hwa->frame_params(avctx, frames_ref);
>@@ -1217,6 +1220,10 @@ int avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
>
> *out_frames_ref = frames_ref;
> } else {
>+ if (clean_priv_data) {
>+ av_freep(avctx->internal->hwaccel_priv_data);
>+ avctx->internal->hwaccel_priv_data = NULL;
Isn't this assignment redundant? Though IMO, `av_freep` is an abomination that needs to be exterminated with extreme prejudice, but I digress. Did you mean to use `av_free`?
>+ }
> av_buffer_unref(&frames_ref);
> }
> return ret;
More information about the ffmpeg-devel
mailing list