@@ -341,6 +341,34 @@ FF_ENABLE_DEPRECATION_WARNINGS
avci->needs_close = 1;
}
+#if FF_API_CODED_SIDE_DATA
+ if (av_codec_is_encoder(avctx->codec)) {
+ const AVPacketSideData *sd =
+ av_packet_side_data_set_get(&avctx->packet_side_data, AV_PKT_DATA_CPB_PROPERTIES);
+ if (sd) {
+ uint8_t *data;
+ AVPacketSideData *tmp = av_realloc_array(avctx->coded_side_data,
+ avctx->nb_coded_side_data + 1U,
+ sizeof(*tmp));
+ if (!tmp) {
+ ret = AVERROR(ENOMEM);
+ goto free_and_end;
+ }
+ avctx->coded_side_data = tmp;
+
+ data = av_memdup(sd->data, sd->size);
+ if (!data) {
+ ret = AVERROR(ENOMEM);
+ goto free_and_end;
+ }
+
+ avctx->coded_side_data[avctx->nb_coded_side_data].data = data;
+ avctx->coded_side_data[avctx->nb_coded_side_data].size = sd->size;
+ avctx->coded_side_data[avctx->nb_coded_side_data++].type = AV_PKT_DATA_CPB_PROPERTIES;
+ }
+ }
+#endif
+
ret=0;
if (av_codec_is_decoder(avctx->codec)) {
@@ -1893,8 +1893,9 @@ typedef struct AVCodecContext {
/**
* Additional data associated with the entire coded stream.
*
- * - decoding: unused
- * - encoding: may be set by libavcodec after avcodec_open2().
+ * - decoding: set by libavcodec
+ * - encoding: the use of this field for encoding is deprecated.
+ * Use packet_side_data instead.
*/
AVPacketSideData *coded_side_data;
int nb_coded_side_data;
@@ -2105,7 +2106,7 @@ typedef struct AVCodecContext {
* Additional data associated with the entire stream.
*
* - decoding: set by user
- * - encoding: unused
+ * - encoding: may be set by libavcodec after avcodec_open2().
*/
AVPacketSideDataSet packet_side_data;
} AVCodecContext;
@@ -1878,3 +1878,34 @@ AVCodecInternal *ff_decode_internal_alloc(void)
{
return av_mallocz(sizeof(DecodeContext));
}
+
+AVCPBProperties *ff_decode_add_cpb_side_data(AVCodecContext *avctx)
+{
+ AVPacketSideData *tmp;
+ AVCPBProperties *props;
+ size_t size;
+ int i;
+
+ for (i = 0; i < avctx->nb_coded_side_data; i++)
+ if (avctx->coded_side_data[i].type == AV_PKT_DATA_CPB_PROPERTIES)
+ return (AVCPBProperties *)avctx->coded_side_data[i].data;
+
+ props = av_cpb_properties_alloc(&size);
+ if (!props)
+ return NULL;
+
+ tmp = av_realloc_array(avctx->coded_side_data, avctx->nb_coded_side_data + 1, sizeof(*tmp));
+ if (!tmp) {
+ av_freep(&props);
+ return NULL;
+ }
+
+ avctx->coded_side_data = tmp;
+ avctx->nb_coded_side_data++;
+
+ avctx->coded_side_data[avctx->nb_coded_side_data - 1].type = AV_PKT_DATA_CPB_PROPERTIES;
+ avctx->coded_side_data[avctx->nb_coded_side_data - 1].data = (uint8_t*)props;
+ avctx->coded_side_data[avctx->nb_coded_side_data - 1].size = size;
+
+ return props;
+}
@@ -153,4 +153,9 @@ int ff_side_data_update_matrix_encoding(AVFrame *frame,
int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private,
AVBufferRef **hwaccel_priv_buf);
+/**
+ * Add a CPB properties side data to an decoding context.
+ */
+AVCPBProperties *ff_decode_add_cpb_side_data(AVCodecContext *avctx);
+
#endif /* AVCODEC_DECODE_H */
@@ -864,3 +864,28 @@ AVCodecInternal *ff_encode_internal_alloc(void)
{
return av_mallocz(sizeof(EncodeContext));
}
+
+AVCPBProperties *ff_encode_add_cpb_side_data(AVCodecContext *avctx)
+{
+ AVPacketSideData *sd;
+ AVCPBProperties *props;
+ size_t size;
+ int ret;
+
+ sd = av_packet_side_data_set_get(&avctx->packet_side_data, AV_PKT_DATA_CPB_PROPERTIES);
+ if (sd)
+ return (AVCPBProperties *)sd->data;
+
+ props = av_cpb_properties_alloc(&size);
+ if (!props)
+ return NULL;
+
+ ret = av_packet_side_data_set_add(&avctx->packet_side_data, AV_PKT_DATA_CPB_PROPERTIES,
+ (uint8_t *)props, size);
+ if (ret < 0) {
+ av_free(props);
+ return NULL;
+ }
+
+ return props;
+}
@@ -73,6 +73,11 @@ int ff_encode_reordered_opaque(AVCodecContext *avctx,
int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt,
AVFrame *frame, int *got_packet);
+/**
+ * Add a CPB properties side data to an encoding context.
+ */
+AVCPBProperties *ff_encode_add_cpb_side_data(AVCodecContext *avctx);
+
/**
* Rescale from sample rate to AVCodecContext.time_base.
*/
@@ -180,11 +180,6 @@ int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx);
int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec);
-/**
- * Add a CPB properties side data to an encoding context.
- */
-AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx);
-
/**
* Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info
*
@@ -1018,7 +1018,7 @@ static av_cold int aom_init(AVCodecContext *avctx,
if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH)
ctx->rawimg.bit_depth = enccfg.g_bit_depth;
- cpb_props = ff_add_cpb_side_data(avctx);
+ cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
@@ -353,7 +353,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
memcpy(avctx->extradata, fbi.sLayerInfo[0].pBsBuf, size);
}
- props = ff_add_cpb_side_data(avctx);
+ props = ff_encode_add_cpb_side_data(avctx);
if (!props)
return AVERROR(ENOMEM);
props->max_bitrate = param.iMaxBitrate;
@@ -325,7 +325,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
FFMAX(avctx->bit_rate, avctx->rc_max_rate) / 1000LL;
if (avctx->bit_rate || avctx->rc_max_rate || avctx->rc_buffer_size) {
- AVCPBProperties *cpb_props = ff_add_cpb_side_data(avctx);
+ AVCPBProperties *cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
@@ -1273,7 +1273,7 @@ static av_cold int vpx_init(AVCodecContext *avctx,
ctx->rawimg.bit_depth = enccfg.g_bit_depth;
#endif
- cpb_props = ff_add_cpb_side_data(avctx);
+ cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
@@ -1231,7 +1231,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
avctx->extradata_size = p - avctx->extradata;
}
- cpb_props = ff_add_cpb_side_data(avctx);
+ cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
cpb_props->buffer_size = x4->params.rc.i_vbv_buffer_size * 1000;
@@ -395,7 +395,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
ctx->params->rc.vbvBufferSize = avctx->rc_buffer_size / 1000;
ctx->params->rc.vbvMaxBitrate = avctx->rc_max_rate / 1000;
- cpb_props = ff_add_cpb_side_data(avctx);
+ cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
cpb_props->buffer_size = ctx->params->rc.vbvBufferSize * 1000;
@@ -1403,7 +1403,7 @@ static void mpeg_decode_sequence_extension(Mpeg1Context *s1)
ff_dlog(s->avctx, "sequence extension\n");
s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
- if (cpb_props = ff_add_cpb_side_data(s->avctx)) {
+ if (cpb_props = ff_decode_add_cpb_side_data(s->avctx)) {
cpb_props->buffer_size = s1->rc_buffer_size;
if (s->bit_rate != 0x3FFFF*400)
cpb_props->max_bitrate = s->bit_rate;
@@ -972,7 +972,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
}
}
- cpb_props = ff_add_cpb_side_data(avctx);
+ cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
cpb_props->max_bitrate = avctx->rc_max_rate;
@@ -1666,7 +1666,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (ctx->encode_config.rcParams.averageBitRate > 0)
avctx->bit_rate = ctx->encode_config.rcParams.averageBitRate;
- cpb_props = ff_add_cpb_side_data(avctx);
+ cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
cpb_props->max_bitrate = ctx->encode_config.rcParams.maxBitRate;
@@ -1504,7 +1504,7 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
}
memset(avctx->extradata + avctx->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
- cpb_props = ff_add_cpb_side_data(avctx);
+ cpb_props = ff_encode_add_cpb_side_data(avctx);
if (!cpb_props)
return AVERROR(ENOMEM);
cpb_props->max_bitrate = avctx->rc_max_rate;
@@ -1018,37 +1018,6 @@ AVCPBProperties *av_cpb_properties_alloc(size_t *size)
return props;
}
-AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx)
-{
- AVPacketSideData *tmp;
- AVCPBProperties *props;
- size_t size;
- int i;
-
- for (i = 0; i < avctx->nb_coded_side_data; i++)
- if (avctx->coded_side_data[i].type == AV_PKT_DATA_CPB_PROPERTIES)
- return (AVCPBProperties *)avctx->coded_side_data[i].data;
-
- props = av_cpb_properties_alloc(&size);
- if (!props)
- return NULL;
-
- tmp = av_realloc_array(avctx->coded_side_data, avctx->nb_coded_side_data + 1, sizeof(*tmp));
- if (!tmp) {
- av_freep(&props);
- return NULL;
- }
-
- avctx->coded_side_data = tmp;
- avctx->nb_coded_side_data++;
-
- avctx->coded_side_data[avctx->nb_coded_side_data - 1].type = AV_PKT_DATA_CPB_PROPERTIES;
- avctx->coded_side_data[avctx->nb_coded_side_data - 1].data = (uint8_t*)props;
- avctx->coded_side_data[avctx->nb_coded_side_data - 1].size = size;
-
- return props;
-}
-
static unsigned bcd2uint(uint8_t bcd)
{
unsigned low = bcd & 0xf;
@@ -49,6 +49,7 @@
#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)
+#define FF_API_CODED_SIDE_DATA (LIBAVCODEC_VERSION_MAJOR < 61)
// reminder to remove CrystalHD decoders on next major bump
#define FF_CODEC_CRYSTAL_HD (LIBAVCODEC_VERSION_MAJOR < 61)
In favor of AVCodecContext.packet_sd Also reflect the fact the field has been used during decoding for some time now. Signed-off-by: James Almer <jamrial@gmail.com> --- libavcodec/avcodec.c | 28 ++++++++++++++++++++++++++++ libavcodec/avcodec.h | 7 ++++--- libavcodec/decode.c | 31 +++++++++++++++++++++++++++++++ libavcodec/decode.h | 5 +++++ libavcodec/encode.c | 25 +++++++++++++++++++++++++ libavcodec/encode.h | 5 +++++ libavcodec/internal.h | 5 ----- libavcodec/libaomenc.c | 2 +- libavcodec/libopenh264enc.c | 2 +- libavcodec/libsvtav1.c | 2 +- libavcodec/libvpxenc.c | 2 +- libavcodec/libx264.c | 2 +- libavcodec/libx265.c | 2 +- libavcodec/mpeg12dec.c | 2 +- libavcodec/mpegvideo_enc.c | 2 +- libavcodec/nvenc.c | 2 +- libavcodec/qsvenc.c | 2 +- libavcodec/utils.c | 31 ------------------------------- libavcodec/version_major.h | 1 + 19 files changed, 109 insertions(+), 49 deletions(-)