[FFmpeg-devel] [PATCH 1/2] lavc: deprecate AV_CODEC_FLAG_TRUNCATED

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Mon Mar 8 14:24:32 EET 2021


Anton Khirnov:
> It is supported only by two decoders and is entirely redundant with
> parsers.

Just because it is only used in two files doesn't mean it is only used
by two decoders: Six decoders have the AV_CODEC_CAP_TRUNCATED (which you
forgot to deprecate) set.

(fftools/cmdutils.c checks for AV_CODEC_CAP_TRUNCATED and informs the
user about whether it is supported by a codec or not. It should probably
be wrapped in #if LIBAVCODEC_VERSION_MAJOR < 60 checks.)

> ---
>  doc/APIchanges             |  3 +++
>  libavcodec/avcodec.h       |  4 ++++
>  libavcodec/decode.c        |  6 +++++-
>  libavcodec/h263dec.c       | 10 ++++++++--
>  libavcodec/mpeg12dec.c     | 12 +++++++++++-
>  libavcodec/mpegvideo.c     |  6 ++++++
>  libavcodec/mpegvideo.h     |  2 ++
>  libavcodec/options_table.h |  2 ++
>  libavcodec/pthread.c       |  2 ++
>  libavcodec/version.h       |  3 +++
>  10 files changed, 46 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 4027d599e7..344f484a8b 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2017-10-21
>  
>  API changes, most recent first:
>  
> +2021-03-xx - xxxxxxxxxx - avcodec.h

Missing version

> +  Deprecate AV_CODEC_FLAG_TRUNCATED, as it is redundant with parsers.
> +
>  2021-03-04 - xxxxxxxxxx - lavc 58.128.101 - avcodec.h
>    Enable err_recognition to be set for encoders.
>  
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 46d31b34ad..45929d6b05 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -310,11 +310,15 @@ typedef struct RcOverride{
>   * error[?] variables will be set during encoding.
>   */
>  #define AV_CODEC_FLAG_PSNR            (1 << 15)
> +#if FF_API_FLAG_TRUNCATED
>  /**
>   * Input bitstream might be truncated at a random location
>   * instead of only at frame boundaries.
> + *
> + * @deprecated use codec parsers for packetizing input
>   */
>  #define AV_CODEC_FLAG_TRUNCATED       (1 << 16)
> +#endif
>  /**
>   * Use interlaced DCT.
>   */
> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> index c976795311..c00069b8d4 100644
> --- a/libavcodec/decode.c
> +++ b/libavcodec/decode.c
> @@ -462,7 +462,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
>      if (!got_frame)
>          av_frame_unref(frame);
>  
> -    if (ret >= 0 && avctx->codec->type == AVMEDIA_TYPE_VIDEO && !(avctx->flags & AV_CODEC_FLAG_TRUNCATED))
> +    if (ret >= 0 && avctx->codec->type == AVMEDIA_TYPE_VIDEO
> +#if FF_API_FLAG_TRUNCATED
> +        && !(avctx->flags & AV_CODEC_FLAG_TRUNCATED)
> +#endif
> +        )
>          ret = pkt->size;
>  
>  #if FF_API_AVCTX_TIMEBASE
> diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
> index dafa54d8d4..57d4a0d4e7 100644
> --- a/libavcodec/h263dec.c
> +++ b/libavcodec/h263dec.c
> @@ -172,13 +172,17 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size)
>          /* We would have to scan through the whole buf to handle the weird
>           * reordering ... */
>          return buf_size;
> -    } else if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
> +    }
> +#if FF_API_FLAG_TRUNCATED
> +    else if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
>          pos -= s->parse_context.last_index;
>          // padding is not really read so this might be -1
>          if (pos < 0)
>              pos = 0;
>          return pos;
> -    } else {
> +    }
> +#endif
> +    else {
>          // avoid infinite loops (maybe not needed...)
>          if (pos == 0)
>              pos = 1;
> @@ -443,6 +447,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
>          return 0;
>      }
>  
> +#if FF_API_FLAG_TRUNCATED
>      if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
>          int next;
>  
> @@ -462,6 +467,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
>                               &buf_size) < 0)
>              return buf_size;
>      }
> +#endif
>  
>  retry:
>      if (s->divx_packed && s->bitstream_buffer_size) {
> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
> index 92dd6a0b24..9e1f9c4b79 100644
> --- a/libavcodec/mpeg12dec.c
> +++ b/libavcodec/mpeg12dec.c
> @@ -1267,10 +1267,14 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
>          (s1->save_progressive_seq != s->progressive_sequence && FFALIGN(s->height, 16) != FFALIGN(s->height, 32)) ||
>          0) {
>          if (s1->mpeg_enc_ctx_allocated) {
> +#if FF_API_FLAG_TRUNCATED
>              ParseContext pc = s->parse_context;
>              s->parse_context.buffer = 0;
>              ff_mpv_common_end(s);
>              s->parse_context = pc;
> +#else
> +            ff_mpv_common_end(s);
> +#endif
>              s1->mpeg_enc_ctx_allocated = 0;
>          }
>  
> @@ -2506,7 +2510,11 @@ static int decode_chunks(AVCodecContext *avctx, AVFrame *picture,
>              if (avctx->err_recognition & AV_EF_EXPLODE && s2->er.error_count)
>                  return AVERROR_INVALIDDATA;
>  
> -            return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index);
> +            return FFMAX(0, buf_ptr - buf
> +#if FF_API_FLAG_TRUNCATED
> +                         - s2->parse_context.last_index
> +#endif
> +                        );
>          }
>  
>          input_size = buf_end - buf_ptr;
> @@ -2812,6 +2820,7 @@ static int mpeg_decode_frame(AVCodecContext *avctx, void *data,
>          return buf_size;
>      }
>  
> +#if FF_API_FLAG_TRUNCATED
>      if (s2->avctx->flags & AV_CODEC_FLAG_TRUNCATED) {
>          int next = ff_mpeg1_find_frame_end(&s2->parse_context, buf,
>                                             buf_size, NULL);
> @@ -2820,6 +2829,7 @@ static int mpeg_decode_frame(AVCodecContext *avctx, void *data,
>                               (const uint8_t **) &buf, &buf_size) < 0)
>              return buf_size;
>      }
> +#endif
>  
>      s2->codec_tag = avpriv_toupper4(avctx->codec_tag);
>      if (s->mpeg_enc_ctx_allocated == 0 && (   s2->codec_tag == AV_RL32("VCR2")
> diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
> index 988dd18a33..45f42618e2 100644
> --- a/libavcodec/mpegvideo.c
> +++ b/libavcodec/mpegvideo.c
> @@ -944,7 +944,9 @@ av_cold int ff_mpv_common_init(MpegEncContext *s)
>      if ((ret = init_context_frame(s)))
>          return AVERROR(ENOMEM);
>  
> +#if FF_API_FLAG_TRUNCATED
>      s->parse_context.state = -1;
> +#endif
>  
>      s->context_initialized = 1;
>      memset(s->thread_context, 0, sizeof(s->thread_context));
> @@ -1123,8 +1125,10 @@ void ff_mpv_common_end(MpegEncContext *s)
>          s->slice_context_count = 1;
>      } else free_duplicate_context(s);
>  
> +#if FF_API_FLAG_TRUNCATED
>      av_freep(&s->parse_context.buffer);
>      s->parse_context.buffer_size = 0;
> +#endif
>  
>      av_freep(&s->bitstream_buffer);
>      s->allocated_bitstream_buffer_size = 0;
> @@ -2320,12 +2324,14 @@ void ff_mpeg_flush(AVCodecContext *avctx){
>      s->mb_x= s->mb_y= 0;
>      s->closed_gop= 0;
>  
> +#if FF_API_FLAG_TRUNCATED
>      s->parse_context.state= -1;
>      s->parse_context.frame_start_found= 0;
>      s->parse_context.overread= 0;
>      s->parse_context.overread_index= 0;
>      s->parse_context.index= 0;
>      s->parse_context.last_index= 0;
> +#endif
>      s->bitstream_buffer_size=0;
>      s->pp_time=0;
>  }
> diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
> index 5a99c19656..0779a3d51a 100644
> --- a/libavcodec/mpegvideo.h
> +++ b/libavcodec/mpegvideo.h
> @@ -359,7 +359,9 @@ typedef struct MpegEncContext {
>      int mb_num_left;                 ///< number of MBs left in this video packet (for partitioned Slices only)
>      int next_p_frame_damaged;        ///< set if the next p frame is damaged, to avoid showing trashed B-frames
>  
> +#if FF_API_FLAG_TRUNCATED
>      ParseContext parse_context;
> +#endif

I think you can remove the inclusion of parser.h once this is removed.

>  
>      /* H.263 specific */
>      int gob_index;
> diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
> index e12159f734..3202f68cd3 100644
> --- a/libavcodec/options_table.h
> +++ b/libavcodec/options_table.h
> @@ -59,7 +59,9 @@ static const AVOption avcodec_options[] = {
>  {"pass2", "use internal 2-pass ratecontrol in second pass mode", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PASS2 }, INT_MIN, INT_MAX, 0, "flags"},
>  {"gray", "only decode/encode grayscale", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_GRAY }, INT_MIN, INT_MAX, V|E|D, "flags"},
>  {"psnr", "error[?] variables will be set during encoding", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PSNR }, INT_MIN, INT_MAX, V|E, "flags"},
> +#if FF_API_FLAG_TRUNCATED
>  {"truncated", "Input bitstream might be randomly truncated", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_TRUNCATED }, INT_MIN, INT_MAX, V|D, "flags"},

You should add AV_OPT_FLAG_DEPRECATED (but better test in advance
whether it works with AV_OPT_TYPE_CONST at all).

> +#endif
>  {"ildct", "use interlaced DCT", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_INTERLACED_DCT }, INT_MIN, INT_MAX, V|E, "flags"},
>  {"low_delay", "force low delay", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_LOW_DELAY }, INT_MIN, INT_MAX, V|D|E, "flags"},
>  {"global_header", "place global headers in extradata instead of every keyframe", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_GLOBAL_HEADER }, INT_MIN, INT_MAX, V|A|E, "flags"},
> diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
> index 572471586d..86c208e73e 100644
> --- a/libavcodec/pthread.c
> +++ b/libavcodec/pthread.c
> @@ -46,7 +46,9 @@
>  static void validate_thread_parameters(AVCodecContext *avctx)
>  {
>      int frame_threading_supported = (avctx->codec->capabilities & AV_CODEC_CAP_FRAME_THREADS)
> +#if FF_API_FLAG_TRUNCATED
>                                  && !(avctx->flags  & AV_CODEC_FLAG_TRUNCATED)
> +#endif
>                                  && !(avctx->flags  & AV_CODEC_FLAG_LOW_DELAY)
>                                  && !(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS);
>      if (avctx->thread_count == 1) {
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 169c763e8a..d3e813428b 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -162,5 +162,8 @@

Missing minor version bump.

>  #ifndef FF_API_GET_FRAME_CLASS
>  #define FF_API_GET_FRAME_CLASS     (LIBAVCODEC_VERSION_MAJOR < 60)
>  #endif
> +#ifndef FF_API_FLAG_TRUNCATED
> +#define FF_API_FLAG_TRUNCATED      (LIBAVCODEC_VERSION_MAJOR < 60)
> +#endif
>  
>  #endif /* AVCODEC_VERSION_H */
> 



More information about the ffmpeg-devel mailing list