[FFmpeg-devel] [PATCH] avcodec: add avcodec_reset_hw_frames_parameters()
Thomas Guillem
thomas at gllm.fr
Fri Nov 29 10:37:34 EET 2024
Or you can check the alternative patch: "avcodec/pthread_frame: rework assert"
On Thu, Nov 28, 2024, at 16:57, Thomas Guillem via ffmpeg-devel wrote:
> usage example:
>
> AVBufferRef *hwframes_ref;
> int ret = avcodec_get_hw_frames_parameters(ctx, hwdev_ref, hwfmt,
> &hwframes_ref);
> ...
> ret = av_hwframe_ctx_init(hwframes_ref);
> if (ret < 0)
> {
> av_buffer_unref(&hwframes_ref);
> avcodec_reset_hw_frames_parameters(ctx);
> return -1;
> }
>
> If avcodec_reset_hw_frames_parameters() is not called, it can lead to the
> following assert:
>
> Assertion p_dst->hwaccel_threadsafe || (!dst->hwaccel &&
> !dst->internal->hwaccel_priv_data) failed at
> src/libavcodec/pthread_frame.c:426
> ---
> libavcodec/avcodec.h | 15 +++++++++++++++
> libavcodec/decode.c | 5 +++++
> 2 files changed, 20 insertions(+)
>
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 77ca8dee1f..dfea991db9 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -2701,6 +2701,21 @@ int
> avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
> enum AVPixelFormat hw_pix_fmt,
> AVBufferRef **out_frames_ref);
>
> +/**
> + * Reset AVCodecContext HW frames internals
> + *
> + * This function can be called after a successful call to
> + * avcodec_get_hw_frames_parameters() in order to reset the HW
> decoding state.
> + *
> + * It can be used from get_format, to fallback to software decoding
> after a
> + * failure, not necessarily linked to
> avcodec_get_hw_frames_parameters()
> + *
> + * @param avctx The context which is currently calling get_format, and
> which
> + * implicitly contains all state needed for filling the
> returned
> + * AVHWFramesContext properly.
> + */
> +void avcodec_reset_hw_frames_parameters(AVCodecContext *avctx);
> +
> enum AVCodecConfig {
> AV_CODEC_CONFIG_PIX_FORMAT, ///< AVPixelFormat, terminated by
> AV_PIX_FMT_NONE
> AV_CODEC_CONFIG_FRAME_RATE, ///< AVRational, terminated by {0,
> 0}
> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> index d1e10223f2..5e608076e5 100644
> --- a/libavcodec/decode.c
> +++ b/libavcodec/decode.c
> @@ -1227,6 +1227,11 @@ int
> avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
> return ret;
> }
>
> +void avcodec_reset_hw_frames_parameters(AVCodecContext *avctx)
> +{
> + ff_hwaccel_uninit(avctx);
> +}
> +
> static int hwaccel_init(AVCodecContext *avctx,
> const FFHWAccel *hwaccel)
> {
> --
> 2.45.2
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list