[FFmpeg-devel] [PATCH 1/2] lavc: deprecate AV_CODEC_FLAG_TRUNCATED
Anton Khirnov
anton at khirnov.net
Mon Mar 8 12:26:32 EET 2021
It is supported only by two decoders and is entirely redundant with
parsers.
---
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
+ 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
/* 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"},
+#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 @@
#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 */
--
2.30.0
More information about the ffmpeg-devel
mailing list