[FFmpeg-devel] [PATCH v2 7/7] avcodec: add AV_CODEC_FLAG_CLEAR
Anton Khirnov
anton at khirnov.net
Thu Dec 7 18:30:47 EET 2023
Quoting Marton Balint (2023-12-06 09:22:20)
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> doc/APIchanges | 3 +++
> doc/codecs.texi | 14 ++++++++++++++
> libavcodec/avcodec.h | 4 ++++
> libavcodec/decode.c | 6 ++++++
> libavcodec/options_table.h | 1 +
> libavcodec/version.h | 2 +-
> 6 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 416e2bec5e..f839504a64 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
>
> API changes, most recent first:
>
> +2023-12-xx - xxxxxxxxxxx - lavc 60.36.100 - avcodec.h
> + Add AV_CODEC_FLAG_CLEAR.
I'm not a huge fan of calling it just 'clear'. How about something more
descriptive like 'wipe_frames'.
> +
> 2023-12-xx - xxxxxxxxxxx - lavu 58.33.100 - imgutils.h
> Add av_image_fill_color()
>
> diff --git a/doc/codecs.texi b/doc/codecs.texi
> index 5b950b4560..0504a535f2 100644
> --- a/doc/codecs.texi
> +++ b/doc/codecs.texi
> @@ -76,6 +76,20 @@ Apply interlaced motion estimation.
> Use closed gop.
> @item output_corrupt
> Output even potentially corrupted frames.
> + at item clear
> +Clear the contents of the video buffer before decoding the next picture to it.
> +
> +Usually if only a part of a picture is affected by a decode error then the
> +decoder (if it implements error concealment) tries to hide it by interpolating
> +pixels from neighbouring areas or in some cases from the previous frame. Even
> +without error concealment it is quite likely that the affected area will
> +contain pixels from an earlier frame, due to frame pooling.
> +
> +For quality checking this might not be desirable, because it makes the errors
> +less noticable. By using this flag, and combining it with disabled error
> +concealment (@code{-ec 0}) it is possible to ensure that no leftover data from
> +an earlier frame is presented in areas affected by decode errors.
> +
> @end table
>
> @item time_base @var{rational number}
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 7fb44e28f4..97848e942f 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -312,6 +312,10 @@ typedef struct RcOverride{
> * loop filter.
> */
> #define AV_CODEC_FLAG_LOOP_FILTER (1 << 11)
> +/**
> + * Clear frame buffer contents before decoding.
Clear the contents of each frame buffer after it is allocated with
AVCodecContext.get_buffer2() and before anything is decoded into it.
Note that this may have a significant performance cost.
> + */
> +#define AV_CODEC_FLAG_CLEAR (1 << 12)
> /**
> * Only decode/encode grayscale.
> */
> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> index 2cfb3fcf97..f9b18a2c35 100644
> --- a/libavcodec/decode.c
> +++ b/libavcodec/decode.c
> @@ -1675,6 +1675,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
>
> validate_avframe_allocation(avctx, frame);
>
> + if (avctx->flags & AV_CODEC_FLAG_CLEAR && avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> + uint32_t color[4] = {0};
> + ptrdiff_t linesize[4] = {frame->linesize[0], frame->linesize[1], frame->linesize[2], frame->linesize[3]};
> + av_image_fill_color(frame->data, linesize, frame->format, color, frame->width, frame->height);
Should this check for errors?
--
Anton Khirnov
More information about the ffmpeg-devel
mailing list