avcodec/decode: clean-up if get_hw_frames_parameters fails

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.

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
Thomas Guillem 2024-10-07 17:43:07 +02:00 committed by Zhao Zhili
parent bb57b78013
commit 44a0a0c050

View File

@ -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,8 @@ 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);
av_buffer_unref(&frames_ref);
}
return ret;