Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: James Almer <jamrial@gmail.com>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH] lavc: deprecate AV_CODEC_FLAG_DROPCHANGED
Date: Wed, 12 Jul 2023 09:42:18 -0300
Message-ID: <3f5fae87-e165-b8c6-4270-bea88be187c4@gmail.com> (raw)
In-Reply-To: <20230709125746.8054-1-anton@khirnov.net>

On 7/9/2023 9:57 AM, Anton Khirnov wrote:
> This decoding flag makes decoders drop all frames after a parameter
> change, but what exactly constitutes a parameter change is not well
> defined and will typically depend on the exact use case.
> This functionality then does not belong in libavcodec, but rather in
> user code
> ---
>   doc/APIchanges             |  3 +++
>   libavcodec/avcodec.c       |  2 ++
>   libavcodec/avcodec.h       |  7 ++++---
>   libavcodec/decode.c        | 11 +++++++++--
>   libavcodec/internal.h      |  2 ++
>   libavcodec/options_table.h |  2 ++
>   libavcodec/version_major.h |  1 +
>   7 files changed, 23 insertions(+), 5 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 0cda51fdee..6217502492 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-07-xx - xxxxxxxxxx - lavc 60 - avcodec.h
> +  Deprecate AV_CODEC_FLAG_DROPCHANGED without replacement.
> +
>   2023-07-xx - xxxxxxxxxx - lavu 58.15.100 - video_hint.h
>     Add AVVideoHint API.
>   
> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
> index 8ccc610227..340abe830e 100644
> --- a/libavcodec/avcodec.c
> +++ b/libavcodec/avcodec.c
> @@ -456,7 +456,9 @@ av_cold int avcodec_close(AVCodecContext *avctx)
>   
>           av_bsf_free(&avci->bsf);
>   
> +#if FF_API_DROPCHANGED
>           av_channel_layout_uninit(&avci->initial_ch_layout);
> +#endif
>   
>   #if CONFIG_LCMS2
>           ff_icc_context_uninit(&avci->icc);
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index d17bdc360d..fe41ecc3c9 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -226,11 +226,15 @@ typedef struct RcOverride{
>    * Use qpel MC.
>    */
>   #define AV_CODEC_FLAG_QPEL            (1 <<  4)
> +#if FF_API_DROPCHANGED
>   /**
>    * Don't output frames whose parameters differ from first
>    * decoded frame in stream.
> + *
> + * @deprecated callers should implement this functionality in their own code
>    */
>   #define AV_CODEC_FLAG_DROPCHANGED     (1 <<  5)
> +#endif
>   /**
>    * Request the encoder to output reconstructed frames, i.e.\ frames that would
>    * be produced by decoding the encoded bistream. These frames may be retrieved
> @@ -2713,9 +2717,6 @@ int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
>    *                          no more output frames
>    * @retval AVERROR(EINVAL)  codec not opened, or it is an encoder without the
>    *                          @ref AV_CODEC_FLAG_RECON_FRAME flag enabled
> - * @retval AVERROR_INPUT_CHANGED current decoded frame has changed parameters with
> - *                          respect to first decoded frame. Applicable when flag
> - *                          AV_CODEC_FLAG_DROPCHANGED is set.
>    * @retval "other negative error code" legitimate decoding errors
>    */
>   int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> index 269633ce10..40eb7679ca 100644
> --- a/libavcodec/decode.c
> +++ b/libavcodec/decode.c
> @@ -740,7 +740,7 @@ fail:
>   int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame)
>   {
>       AVCodecInternal *avci = avctx->internal;
> -    int ret, changed;
> +    int ret;
>   
>       if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
>           return AVERROR(EINVAL);
> @@ -770,6 +770,7 @@ FF_DISABLE_DEPRECATION_WARNINGS
>   FF_ENABLE_DEPRECATION_WARNINGS
>   #endif
>   
> +#if FF_API_DROPCHANGED
>       if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED) {
>   
>           if (avctx->frame_num == 1) {
> @@ -790,7 +791,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>           }
>   
>           if (avctx->frame_num > 1) {
> -            changed = avci->initial_format != frame->format;
> +            int changed = avci->initial_format != frame->format;
>   
>               switch(avctx->codec_type) {
>               case AVMEDIA_TYPE_VIDEO:
> @@ -815,6 +816,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>               }
>           }
>       }
> +#endif
>       return 0;
>   fail:
>       av_frame_unref(frame);
> @@ -1739,6 +1741,11 @@ int ff_decode_preinit(AVCodecContext *avctx)
>       if (ret < 0)
>           return ret;
>   
> +#if FF_API_DROPCHANGED
> +    if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED)
> +        av_log(avctx, AV_LOG_WARNING, "The dropchanged flag is deprecated.\n");
> +#endif
> +
>       return 0;
>   }
>   
> diff --git a/libavcodec/internal.h b/libavcodec/internal.h
> index 868dd46b48..4dce9f6fbb 100644
> --- a/libavcodec/internal.h
> +++ b/libavcodec/internal.h
> @@ -135,12 +135,14 @@ typedef struct AVCodecInternal {
>       AVFrame *buffer_frame;
>       int draining_done;
>   
> +#if FF_API_DROPCHANGED
>       /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */
>       int changed_frames_dropped;
>       int initial_format;
>       int initial_width, initial_height;
>       int initial_sample_rate;
>       AVChannelLayout initial_ch_layout;
> +#endif
>   
>   #if CONFIG_LCMS2
>       FFIccContext icc; /* used to read and write embedded ICC profiles */
> diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
> index f1a9729c0d..d1244bfc1a 100644
> --- a/libavcodec/options_table.h
> +++ b/libavcodec/options_table.h
> @@ -72,7 +72,9 @@ static const AVOption avcodec_options[] = {
>   {"ilme", "interlaced motion estimation", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_INTERLACED_ME }, INT_MIN, INT_MAX, V|E, "flags"},
>   {"cgop", "closed GOP", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_CLOSED_GOP }, INT_MIN, INT_MAX, V|E, "flags"},
>   {"output_corrupt", "Output even potentially corrupted frames", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_OUTPUT_CORRUPT }, INT_MIN, INT_MAX, V|D, "flags"},
> +#if FF_API_DROPCHANGED
>   {"drop_changed", "Drop frames whose parameters differ from first decoded frame", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_DROPCHANGED }, INT_MIN, INT_MAX, A|V|D, "flags"},

Missing the deprecated AVOption flag.

> +#endif
>   {"flags2", NULL, OFFSET(flags2), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, V|A|E|D|S, "flags2"},
>   {"fast", "allow non-spec-compliant speedup tricks", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_FAST }, INT_MIN, INT_MAX, V|E, "flags2"},
>   {"noout", "skip bitstream encoding", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_NO_OUTPUT }, INT_MIN, INT_MAX, V|E, "flags2"},
> diff --git a/libavcodec/version_major.h b/libavcodec/version_major.h
> index 2f5138d079..95c5aec0c5 100644
> --- a/libavcodec/version_major.h
> +++ b/libavcodec/version_major.h
> @@ -48,6 +48,7 @@
>   #define FF_API_SLICE_OFFSET        (LIBAVCODEC_VERSION_MAJOR < 61)
>   #define FF_API_SUBFRAMES           (LIBAVCODEC_VERSION_MAJOR < 61)
>   #define FF_API_TICKS_PER_FRAME     (LIBAVCODEC_VERSION_MAJOR < 61)
> +#define FF_API_DROPCHANGED         (LIBAVCODEC_VERSION_MAJOR < 61)
>   
>   // reminder to remove CrystalHD decoders on next major bump
>   #define FF_CODEC_CRYSTAL_HD        (LIBAVCODEC_VERSION_MAJOR < 61)

LGTM, and good idea.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2023-07-12 12:42 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-09 12:57 Anton Khirnov
2023-07-12 12:42 ` James Almer [this message]
2023-07-12 13:14   ` Gyan Doshi
2023-07-12 13:21     ` James Almer
2023-07-12 13:31       ` Gyan Doshi
2023-07-12 13:44         ` Anton Khirnov
2023-07-13 19:20           ` Gyan Doshi
2023-07-13 20:57             ` Anton Khirnov
2023-07-13 10:56 ` Anton Khirnov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3f5fae87-e165-b8c6-4270-bea88be187c4@gmail.com \
    --to=jamrial@gmail.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git