[FFmpeg-devel] [PATCH] avcodec/avcodec: Deprecate AV_INPUT_BUFFER_MIN_SIZE

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sun Feb 18 03:35:35 EET 2024


It used to be used with preallocated packet buffers with
the old encode API, but said API is no more and therefore
there is no reason for this to be public any more.
So deprecate it and use an internal replacement
for the encoders using it as an upper bound for the
size of their headers.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 doc/APIchanges                  | 3 +++
 libavcodec/asvenc.c             | 2 +-
 libavcodec/avcodec.h            | 4 ++++
 libavcodec/encode.h             | 6 ++++++
 libavcodec/ffv1enc.c            | 4 ++--
 libavcodec/flashsv2enc.c        | 2 +-
 libavcodec/gif.c                | 2 +-
 libavcodec/huffyuvenc.c         | 2 +-
 libavcodec/j2kenc.c             | 2 +-
 libavcodec/jpeglsenc.c          | 2 +-
 libavcodec/libxvid.c            | 2 +-
 libavcodec/ljpegenc.c           | 2 +-
 libavcodec/msrleenc.c           | 2 +-
 libavcodec/msvideo1enc.c        | 2 +-
 libavcodec/pngenc.c             | 6 +++---
 libavcodec/proresenc_anatoliy.c | 4 ++--
 libavcodec/proresenc_kostya.c   | 2 +-
 libavcodec/snowenc.c            | 2 +-
 libavcodec/svq1enc.c            | 2 +-
 libavcodec/tiffenc.c            | 2 +-
 libavcodec/version_major.h      | 1 +
 21 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 77b9740891..27030ee03e 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:
 
+2024-02-17 - xxxxxxxxxx - lavc 60.yy.100 - avcodec.h
+  Deprecate AV_INPUT_BUFFER_MIN_SIZE without replacement.
+
 2024-02-13 - xxxxxxxxxx - lavf 60.21.100 - avformat.h
   Add AVStreamGroup.disposition.
 
diff --git a/libavcodec/asvenc.c b/libavcodec/asvenc.c
index 50da46738c..6179b50583 100644
--- a/libavcodec/asvenc.c
+++ b/libavcodec/asvenc.c
@@ -272,7 +272,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     }
 
     if ((ret = ff_alloc_packet(avctx, pkt, c->mb_height * c->mb_width * MAX_MB_SIZE +
-                               AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+                               FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
 
     init_put_bits(&a->pb, pkt->data, pkt->size);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 0018ccbb0c..43859251cc 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -187,12 +187,16 @@ struct AVCodecParameters;
  * @{
  */
 
+#if FF_API_BUFFER_MIN_SIZE
 /**
  * @ingroup lavc_encoding
  * minimum encoding buffer size
  * Used to avoid some checks during header writing.
+ * @deprecated Unused: avcodec_receive_packet() does not work
+ *             with preallocated packet buffers.
  */
 #define AV_INPUT_BUFFER_MIN_SIZE 16384
+#endif
 
 /**
  * @ingroup lavc_encoding
diff --git a/libavcodec/encode.h b/libavcodec/encode.h
index e019cd7702..85331e04b7 100644
--- a/libavcodec/encode.h
+++ b/libavcodec/encode.h
@@ -26,6 +26,12 @@
 #include "avcodec.h"
 #include "packet.h"
 
+/**
+ * Used by some encoders as upper bound for the length of headers.
+ * TODO: Use proper codec-specific upper bounds.
+ */
+#define FF_INPUT_BUFFER_MIN_SIZE 16384
+
 /**
  * Called by encoders to get the next frame for encoding.
  *
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index 4f581fbf6b..e510abf6ff 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -1104,7 +1104,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     uint8_t keystate    = 128;
     uint8_t *buf_p;
     int i, ret;
-    int64_t maxsize =   AV_INPUT_BUFFER_MIN_SIZE
+    int64_t maxsize =   FF_INPUT_BUFFER_MIN_SIZE
                       + avctx->width*avctx->height*37LL*4;
 
     if(!pict) {
@@ -1154,7 +1154,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     }
 
     if (f->version > 3)
-        maxsize = AV_INPUT_BUFFER_MIN_SIZE + avctx->width*avctx->height*3LL*4;
+        maxsize = FF_INPUT_BUFFER_MIN_SIZE + avctx->width*avctx->height*3LL*4;
 
     if (maxsize > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32) {
         av_log(avctx, AV_LOG_WARNING, "Cannot allocate worst case packet size, the encoding could fail\n");
diff --git a/libavcodec/flashsv2enc.c b/libavcodec/flashsv2enc.c
index 75b48eb1fd..6dcb9102a8 100644
--- a/libavcodec/flashsv2enc.c
+++ b/libavcodec/flashsv2enc.c
@@ -857,7 +857,7 @@ static int flashsv2_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     int res;
     int keyframe = 0;
 
-    if ((res = ff_alloc_packet(avctx, pkt, s->frame_size + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((res = ff_alloc_packet(avctx, pkt, s->frame_size + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return res;
 
     /* First frame needs to be a keyframe */
diff --git a/libavcodec/gif.c b/libavcodec/gif.c
index 7a32f8fc8b..49356236e7 100644
--- a/libavcodec/gif.c
+++ b/libavcodec/gif.c
@@ -477,7 +477,7 @@ static int gif_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     const uint32_t *palette = NULL;
     int ret;
 
-    if ((ret = ff_alloc_packet(avctx, pkt, avctx->width*avctx->height*7/5 + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, avctx->width*avctx->height*7/5 + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
     outbuf_ptr = pkt->data;
     end        = pkt->data + pkt->size;
diff --git a/libavcodec/huffyuvenc.c b/libavcodec/huffyuvenc.c
index d49566cb5b..494ca7e603 100644
--- a/libavcodec/huffyuvenc.c
+++ b/libavcodec/huffyuvenc.c
@@ -762,7 +762,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     const AVFrame * const p = pict;
     int i, j, size = 0, ret;
 
-    if ((ret = ff_alloc_packet(avctx, pkt, width * height * 3 * 4 + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, width * height * 3 * 4 + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
 
     if (s->context) {
diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c
index ebf21f6e7a..a80e74d4ec 100644
--- a/libavcodec/j2kenc.c
+++ b/libavcodec/j2kenc.c
@@ -1534,7 +1534,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     uint8_t *chunkstart, *jp2cstart, *jp2hstart;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
 
-    if ((ret = ff_alloc_packet(avctx, pkt, avctx->width*avctx->height*9 + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, avctx->width*avctx->height*9 + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
 
     // init:
diff --git a/libavcodec/jpeglsenc.c b/libavcodec/jpeglsenc.c
index 4345ae44fa..3481c61ee3 100644
--- a/libavcodec/jpeglsenc.c
+++ b/libavcodec/jpeglsenc.c
@@ -432,7 +432,7 @@ static av_cold int encode_jpegls_init(AVCodecContext *avctx)
         ctx->comps = 1;
     else
         ctx->comps = 3;
-    size = AV_INPUT_BUFFER_MIN_SIZE;
+    size = FF_INPUT_BUFFER_MIN_SIZE;
     /* INT_MAX due to PutBit-API. */
     if (avctx->width * (unsigned)avctx->height > (INT_MAX - size) / 4 / ctx->comps)
         return AVERROR(ERANGE);
diff --git a/libavcodec/libxvid.c b/libavcodec/libxvid.c
index d5232d4ee6..b9ac39429d 100644
--- a/libavcodec/libxvid.c
+++ b/libavcodec/libxvid.c
@@ -739,7 +739,7 @@ static int xvid_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     xvid_enc_frame_t xvid_enc_frame = { 0 };
     xvid_enc_stats_t xvid_enc_stats = { 0 };
 
-    if ((ret = ff_alloc_packet(avctx, pkt, mb_width*(int64_t)mb_height*MAX_MB_BYTES + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, mb_width*(int64_t)mb_height*MAX_MB_BYTES + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
 
     /* Start setting up the frame */
diff --git a/libavcodec/ljpegenc.c b/libavcodec/ljpegenc.c
index 71457220dd..46546e2160 100644
--- a/libavcodec/ljpegenc.c
+++ b/libavcodec/ljpegenc.c
@@ -214,7 +214,7 @@ static int ljpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     const int height = avctx->height;
     const int mb_width  = (width  + s->hsample[0] - 1) / s->hsample[0];
     const int mb_height = (height + s->vsample[0] - 1) / s->vsample[0];
-    size_t max_pkt_size = AV_INPUT_BUFFER_MIN_SIZE;
+    size_t max_pkt_size = FF_INPUT_BUFFER_MIN_SIZE;
     int ret, header_bits;
 
     if(    avctx->pix_fmt == AV_PIX_FMT_BGR0
diff --git a/libavcodec/msrleenc.c b/libavcodec/msrleenc.c
index 931e7af053..cc39aa308f 100644
--- a/libavcodec/msrleenc.c
+++ b/libavcodec/msrleenc.c
@@ -252,7 +252,7 @@ static int msrle_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
 
     if ((ret = ff_alloc_packet(avctx, pkt, (
                 avctx->width*2 /* worst case = rle every pixel */ + 2 /*end of line */
-            ) * avctx->height + 2 /* end of bitmap */ + AV_INPUT_BUFFER_MIN_SIZE)))
+            ) * avctx->height + 2 /* end of bitmap */ + FF_INPUT_BUFFER_MIN_SIZE)))
         return ret;
 
     if (pict->data[1]) {
diff --git a/libavcodec/msvideo1enc.c b/libavcodec/msvideo1enc.c
index 1fb8be8883..3bea3ed297 100644
--- a/libavcodec/msvideo1enc.c
+++ b/libavcodec/msvideo1enc.c
@@ -78,7 +78,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     int skips = 0;
     int quality = 24;
 
-    if ((ret = ff_alloc_packet(avctx, pkt, avctx->width*avctx->height*9 + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, avctx->width*avctx->height*9 + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
     dst= buf= pkt->data;
 
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c
index 7f7137b34d..28d645ea48 100644
--- a/libavcodec/pngenc.c
+++ b/libavcodec/pngenc.c
@@ -637,7 +637,7 @@ static int encode_png(AVCodecContext *avctx, AVPacket *pkt,
     enc_row_size    = deflateBound(&s->zstream.zstream,
                                    (avctx->width * s->bits_per_pixel + 7) >> 3);
     max_packet_size =
-        AV_INPUT_BUFFER_MIN_SIZE + // headers
+        FF_INPUT_BUFFER_MIN_SIZE + // headers
         avctx->height * (
             enc_row_size +
             12 * (((int64_t)enc_row_size + IOBUF_SIZE - 1) / IOBUF_SIZE) // IDAT * ceil(enc_row_size / IOBUF_SIZE)
@@ -968,7 +968,7 @@ static int encode_apng(AVCodecContext *avctx, AVPacket *pkt,
     enc_row_size    = deflateBound(&s->zstream.zstream,
                                    (avctx->width * s->bits_per_pixel + 7) >> 3);
     max_packet_size =
-        AV_INPUT_BUFFER_MIN_SIZE + // headers
+        FF_INPUT_BUFFER_MIN_SIZE + // headers
         avctx->height * (
             enc_row_size +
             (4 + 12) * (((int64_t)enc_row_size + IOBUF_SIZE - 1) / IOBUF_SIZE) // fdAT * ceil(enc_row_size / IOBUF_SIZE)
@@ -982,7 +982,7 @@ static int encode_apng(AVCodecContext *avctx, AVPacket *pkt,
         if (!pict)
             return AVERROR(EINVAL);
 
-        s->bytestream = s->extra_data = av_malloc(AV_INPUT_BUFFER_MIN_SIZE);
+        s->bytestream = s->extra_data = av_malloc(FF_INPUT_BUFFER_MIN_SIZE);
         if (!s->extra_data)
             return AVERROR(ENOMEM);
 
diff --git a/libavcodec/proresenc_anatoliy.c b/libavcodec/proresenc_anatoliy.c
index 5c93ea6566..02ab07d28e 100644
--- a/libavcodec/proresenc_anatoliy.c
+++ b/libavcodec/proresenc_anatoliy.c
@@ -733,10 +733,10 @@ static int prores_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     uint8_t *buf;
     int compress_frame_size, pic_size, ret, is_top_field_first = 0;
     uint8_t frame_flags;
-    int frame_size = FFALIGN(avctx->width, 16) * FFALIGN(avctx->height, 16)*16 + 500 + AV_INPUT_BUFFER_MIN_SIZE; //FIXME choose tighter limit
+    int frame_size = FFALIGN(avctx->width, 16) * FFALIGN(avctx->height, 16)*16 + 500 + FF_INPUT_BUFFER_MIN_SIZE; //FIXME choose tighter limit
 
 
-    if ((ret = ff_alloc_packet(avctx, pkt, frame_size + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, frame_size + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
 
     buf = pkt->data;
diff --git a/libavcodec/proresenc_kostya.c b/libavcodec/proresenc_kostya.c
index 6720774e14..45385213ac 100644
--- a/libavcodec/proresenc_kostya.c
+++ b/libavcodec/proresenc_kostya.c
@@ -981,7 +981,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     ctx->pic = pic;
     pkt_size = ctx->frame_size_upper_bound;
 
-    if ((ret = ff_alloc_packet(avctx, pkt, pkt_size + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, pkt_size + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
 
     orig_buf = pkt->data;
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index 6d79a90184..d81ff6f2aa 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -1761,7 +1761,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     uint8_t rc_header_bak[sizeof(s->header_state)];
     uint8_t rc_block_bak[sizeof(s->block_state)];
 
-    if ((ret = ff_alloc_packet(avctx, pkt, s->b_width*s->b_height*MB_SIZE*MB_SIZE*3 + AV_INPUT_BUFFER_MIN_SIZE)) < 0)
+    if ((ret = ff_alloc_packet(avctx, pkt, s->b_width*s->b_height*MB_SIZE*MB_SIZE*3 + FF_INPUT_BUFFER_MIN_SIZE)) < 0)
         return ret;
 
     ff_init_range_encoder(c, pkt->data, pkt->size);
diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c
index c4861010f1..5675ae5218 100644
--- a/libavcodec/svq1enc.c
+++ b/libavcodec/svq1enc.c
@@ -655,7 +655,7 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     int i, ret;
 
     ret = ff_alloc_packet(avctx, pkt, s->y_block_width * s->y_block_height *
-                          MAX_MB_BYTES * 3 + AV_INPUT_BUFFER_MIN_SIZE);
+                          MAX_MB_BYTES * 3 + FF_INPUT_BUFFER_MIN_SIZE);
     if (ret < 0)
         return ret;
 
diff --git a/libavcodec/tiffenc.c b/libavcodec/tiffenc.c
index 61d7316c4b..dfe308ee17 100644
--- a/libavcodec/tiffenc.c
+++ b/libavcodec/tiffenc.c
@@ -334,7 +334,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
     bytes_per_row = (((s->width - 1) / s->subsampling[0] + 1) * s->bpp *
                      s->subsampling[0] * s->subsampling[1] + 7) >> 3;
     packet_size = avctx->height * bytes_per_row * 2 +
-                  avctx->height * 4 + AV_INPUT_BUFFER_MIN_SIZE;
+                  avctx->height * 4 + FF_INPUT_BUFFER_MIN_SIZE;
 
     if ((ret = ff_alloc_packet(avctx, pkt, packet_size)) < 0)
         return ret;
diff --git a/libavcodec/version_major.h b/libavcodec/version_major.h
index 45209c0a4f..161442df95 100644
--- a/libavcodec/version_major.h
+++ b/libavcodec/version_major.h
@@ -53,6 +53,7 @@
 #define FF_API_AVFFT               (LIBAVCODEC_VERSION_MAJOR < 62)
 #define FF_API_FF_PROFILE_LEVEL    (LIBAVCODEC_VERSION_MAJOR < 62)
 #define FF_API_AVCODEC_CLOSE       (LIBAVCODEC_VERSION_MAJOR < 62)
+#define FF_API_BUFFER_MIN_SIZE     (LIBAVCODEC_VERSION_MAJOR < 62)
 
 // reminder to remove CrystalHD decoders on next major bump
 #define FF_CODEC_CRYSTAL_HD        (LIBAVCODEC_VERSION_MAJOR < 61)
-- 
2.34.1



More information about the ffmpeg-devel mailing list