* [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext
@ 2023-07-20 20:34 James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 02/13] avcodec/codec_par: add side data to AVCodecParameters James Almer
` (12 more replies)
0 siblings, 13 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/avcodec.c | 2 ++
libavcodec/avcodec.h | 8 +++++
libavcodec/avpacket.c | 84 +++++++++++++++++++++++++++++++++++++++++++
libavcodec/packet.h | 54 ++++++++++++++++++++++++++++
4 files changed, 148 insertions(+)
diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 340abe830e..16869e97f2 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -467,6 +467,8 @@ av_cold int avcodec_close(AVCodecContext *avctx)
av_freep(&avctx->internal);
}
+ av_packet_free_side_data_set(&avctx->side_data_set);
+
for (i = 0; i < avctx->nb_coded_side_data; i++)
av_freep(&avctx->coded_side_data[i].data);
av_freep(&avctx->coded_side_data);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index fe41ecc3c9..2902ecf6cb 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2102,6 +2102,14 @@ typedef struct AVCodecContext {
* an error.
*/
int64_t frame_num;
+
+ /**
+ * Additional data associated with the entire stream.
+ *
+ * - decoding: set by user
+ * - encoding: unused
+ */
+ AVPacketSideDataSet side_data_set;
} AVCodecContext;
/**
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index 5fef65e97a..f569731403 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -645,3 +645,87 @@ int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp)
return 0;
}
+
+AVPacketSideData *av_packet_get_side_data_from_set(const AVPacketSideDataSet *set,
+ enum AVPacketSideDataType type)
+{
+ for (int i = 0; i < set->nb_side_data; i++)
+ if (set->side_data[i].type == type)
+ return &set->side_data[i];
+
+ return NULL;
+}
+
+static int add_side_data_to_set(AVPacketSideDataSet *set,
+ AVPacketSideData **psd,
+ enum AVPacketSideDataType type,
+ uint8_t *data, size_t size)
+{
+ AVPacketSideData *sd, *tmp;
+
+ for (int i = 0; i < set->nb_side_data; i++) {
+ sd = &set->side_data[i];
+
+ if (sd->type == type) {
+ av_freep(&sd->data);
+ sd->data = data;
+ sd->size = size;
+ *psd = sd;
+ return 0;
+ }
+ }
+
+ if (set->nb_side_data + 1U > FFMIN(INT_MAX, SIZE_MAX / sizeof(*tmp)))
+ return AVERROR(ERANGE);
+
+ tmp = av_realloc_array(set->side_data, set->nb_side_data + 1, sizeof(*tmp));
+ if (!tmp)
+ return AVERROR(ENOMEM);
+
+ set->side_data = tmp;
+ set->nb_side_data++;
+
+ sd = &set->side_data[set->nb_side_data - 1];
+ sd->type = type;
+ sd->data = data;
+ sd->size = size;
+ *psd = sd;
+
+ return 0;
+}
+
+int av_packet_add_side_data_to_set(AVPacketSideDataSet *set,
+ enum AVPacketSideDataType type,
+ uint8_t *data, size_t size)
+{
+ AVPacketSideData *sd;
+
+ return add_side_data_to_set(set, &sd, type, data, size);
+}
+
+AVPacketSideData *av_packet_new_side_data_to_set(AVPacketSideDataSet *set,
+ enum AVPacketSideDataType type,
+ size_t size)
+{
+ AVPacketSideData *sd = NULL;
+ uint8_t *data = av_malloc(size);
+ int ret;
+
+ if (!data)
+ return NULL;
+
+ ret = add_side_data_to_set(set, &sd, type, data, size);
+ if (ret < 0)
+ av_freep(&data);
+
+ return sd;
+}
+
+void av_packet_free_side_data_set(AVPacketSideDataSet *set)
+{
+ int i;
+ for (i = 0; i < set->nb_side_data; i++)
+ av_freep(&set->side_data[i].data);
+ av_freep(&set->side_data);
+ set->nb_side_data = 0;
+}
diff --git a/libavcodec/packet.h b/libavcodec/packet.h
index f28e7e7011..590c2bf15a 100644
--- a/libavcodec/packet.h
+++ b/libavcodec/packet.h
@@ -318,6 +318,14 @@ typedef struct AVPacketSideData {
enum AVPacketSideDataType type;
} AVPacketSideData;
+/**
+ * Structure to hold a set of AVPacketSideDataSet
+ */
+typedef struct AVPacketSideDataSet {
+ AVPacketSideData *side_data;
+ int nb_side_data;
+} AVPacketSideDataSet;
+
/**
* This structure stores compressed data. It is typically exported by demuxers
* and then passed as input to decoders, or received as output from encoders and
@@ -724,6 +732,52 @@ int av_packet_make_writable(AVPacket *pkt);
*/
void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
+/**
+ * Allocate a new side data entry into to a set.
+ *
+ * @param set a set to which the side data should be added
+ * @param type side data type
+ * @param size side data size
+ * @return pointer to freshly allocated side data entry or NULL otherwise.
+ */
+AVPacketSideData *av_packet_new_side_data_to_set(AVPacketSideDataSet *set,
+ enum AVPacketSideDataType type,
+ size_t size);
+
+/**
+ * Wrap an existing array as a packet side data into a set.
+ *
+ * @param set a set to which the side data should be added
+ * @param type side information type
+ * @param data the side data array. It must be allocated with the av_malloc()
+ * family of functions. The ownership of the data is transferred to
+ * pkt.
+ * @param size side information size
+ * @return a non-negative number on success, a negative AVERROR code on
+ * failure. On failure, the set is unchanged and the data remains
+ * owned by the caller.
+ */
+int av_packet_add_side_data_to_set(AVPacketSideDataSet *set,
+ enum AVPacketSideDataType type,
+ uint8_t *data, size_t size);
+
+/**
+ * Get side information from set.
+ *
+ * @param set a set from which the side data should be fetched
+ * @param type desired side information type
+ * @return pointer to side data if present or NULL otherwise
+ */
+AVPacketSideData *av_packet_get_side_data_from_set(const AVPacketSideDataSet *set,
+ enum AVPacketSideDataType type);
+
+/**
+ * Convenience function to free all the side data stored in a set.
+ *
+ * @param set a set
+ */
+void av_packet_free_side_data_set(AVPacketSideDataSet *set);
+
/**
* @}
*/
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 02/13] avcodec/codec_par: add side data to AVCodecParameters
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 03/13] avformat/avformat: use the side data from AVStream.codecpar James Almer
` (11 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/codec_par.c | 36 ++++++++++++++++++++++++++++++++++++
libavcodec/codec_par.h | 6 ++++++
2 files changed, 42 insertions(+)
diff --git a/libavcodec/codec_par.c b/libavcodec/codec_par.c
index 775c187073..c113cfcd80 100644
--- a/libavcodec/codec_par.c
+++ b/libavcodec/codec_par.c
@@ -27,11 +27,13 @@
#include "libavutil/mem.h"
#include "avcodec.h"
#include "codec_par.h"
+#include "packet.h"
static void codec_parameters_reset(AVCodecParameters *par)
{
av_freep(&par->extradata);
av_channel_layout_uninit(&par->ch_layout);
+ av_packet_free_side_data_set(&par->side_data_set);
memset(par, 0, sizeof(*par));
@@ -72,6 +74,29 @@ void avcodec_parameters_free(AVCodecParameters **ppar)
av_freep(ppar);
}
+static int codec_parameters_copy_side_data(AVPacketSideDataSet *dst,
+ const AVPacketSideDataSet *src)
+{
+ if (!src->nb_side_data)
+ return 0;
+
+ dst->side_data = av_calloc(src->nb_side_data, sizeof(*dst->side_data));
+ if (!dst->side_data)
+ return AVERROR(ENOMEM);
+
+ for (int i = 0; i < src->nb_side_data; i++) {
+ uint8_t *data = av_memdup(src->side_data[i].data, src->side_data[i].size);
+ if (!data)
+ return AVERROR(ENOMEM);
+ dst->side_data[i].type = src->side_data[i].type;
+ dst->side_data[i].size = src->side_data[i].size;
+ dst->side_data[i].data = data;
+ dst->nb_side_data++;
+ }
+
+ return 0;
+}
+
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
{
int ret;
@@ -89,6 +114,10 @@ int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src
memcpy(dst->extradata, src->extradata, src->extradata_size);
dst->extradata_size = src->extradata_size;
}
+ memset(&dst->side_data_set, 0, sizeof(dst->side_data_set));
+ ret = codec_parameters_copy_side_data(&dst->side_data_set, &src->side_data_set);
+ if (ret < 0)
+ return ret;
ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
if (ret < 0)
@@ -177,6 +206,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
memcpy(par->extradata, codec->extradata, codec->extradata_size);
par->extradata_size = codec->extradata_size;
}
+ ret = codec_parameters_copy_side_data(&par->side_data_set, &codec->side_data_set);
+ if (ret < 0)
+ return ret;
return 0;
}
@@ -261,6 +293,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
memcpy(codec->extradata, par->extradata, par->extradata_size);
codec->extradata_size = par->extradata_size;
}
+ av_packet_free_side_data_set(&codec->side_data_set);
+ ret = codec_parameters_copy_side_data(&codec->side_data_set, &par->side_data_set);
+ if (ret < 0)
+ return ret;
return 0;
}
diff --git a/libavcodec/codec_par.h b/libavcodec/codec_par.h
index add90fdb1e..06e9d54615 100644
--- a/libavcodec/codec_par.h
+++ b/libavcodec/codec_par.h
@@ -29,6 +29,7 @@
#include "libavutil/pixfmt.h"
#include "codec_id.h"
+#include "packet.h"
/**
* @addtogroup lavc_core
@@ -223,6 +224,11 @@ typedef struct AVCodecParameters {
* when no higher-level timing information is available.
*/
AVRational framerate;
+
+ /**
+ * Additional data associated with the entire stream.
+ */
+ AVPacketSideDataSet side_data_set;
} AVCodecParameters;
/**
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 03/13] avformat/avformat: use the side data from AVStream.codecpar
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 02/13] avcodec/codec_par: add side data to AVCodecParameters James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 04/13] fftools/ffmpeg: stop using AVStream.side_data James Almer
` (10 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavdevice/android_camera.c | 6 +--
libavformat/avformat.c | 42 ++++-----------------
libavformat/avformat.h | 28 ++++++++++++++
libavformat/concatdec.c | 1 -
libavformat/dashdec.c | 11 ------
libavformat/demux.c | 40 +++++++++++++++++---
libavformat/demux_utils.c | 4 ++
libavformat/dovi_isom.c | 2 +-
libavformat/dump.c | 6 +--
libavformat/hls.c | 11 ------
libavformat/hlsenc.c | 11 +++---
libavformat/internal.h | 4 ++
libavformat/matroska.c | 2 +-
libavformat/matroskadec.c | 20 +++++-----
libavformat/matroskaenc.c | 35 ++++++++---------
libavformat/mov.c | 41 +++++++++++---------
libavformat/movenc.c | 73 +++++++++++++++++-------------------
libavformat/mp3enc.c | 8 ++--
libavformat/mpegenc.c | 15 +++++---
libavformat/mpegts.c | 2 +-
libavformat/mux.c | 19 ++++++++++
libavformat/mxfdec.c | 9 +++--
libavformat/mxfenc.c | 8 ++--
libavformat/options.c | 2 +
libavformat/replaygain.c | 6 ++-
libavformat/seek.c | 2 +
libavformat/version_major.h | 1 +
27 files changed, 230 insertions(+), 179 deletions(-)
diff --git a/libavdevice/android_camera.c b/libavdevice/android_camera.c
index 1934999c18..7ceb1e1fc2 100644
--- a/libavdevice/android_camera.c
+++ b/libavdevice/android_camera.c
@@ -638,7 +638,7 @@ static int wait_for_image_format(AVFormatContext *avctx)
static int add_display_matrix(AVFormatContext *avctx, AVStream *st)
{
AndroidCameraCtx *ctx = avctx->priv_data;
- uint8_t *side_data;
+ AVPacketSideData *side_data;
int32_t display_matrix[9];
av_display_rotation_set(display_matrix, ctx->sensor_orientation);
@@ -647,14 +647,14 @@ static int add_display_matrix(AVFormatContext *avctx, AVStream *st)
av_display_matrix_flip(display_matrix, 1, 0);
}
- side_data = av_stream_new_side_data(st,
+ side_data = av_packet_new_side_data_to_set(&st->codecpar.side_data_set,
AV_PKT_DATA_DISPLAYMATRIX, sizeof(display_matrix));
if (!side_data) {
return AVERROR(ENOMEM);
}
- memcpy(side_data, display_matrix, sizeof(display_matrix));
+ memcpy(side_data->data, display_matrix, sizeof(display_matrix));
return 0;
}
diff --git a/libavformat/avformat.c b/libavformat/avformat.c
index 356b4de931..3afc5afd7f 100644
--- a/libavformat/avformat.c
+++ b/libavformat/avformat.c
@@ -46,9 +46,13 @@ void ff_free_stream(AVStream **pst)
if (!st)
return;
+#if FF_API_AVSTREAM_SIDE_DATA
+FF_DISABLE_DEPRECATION_WARNINGS
for (int i = 0; i < st->nb_side_data; i++)
av_freep(&st->side_data[i].data);
av_freep(&st->side_data);
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
if (st->attached_pic.data)
av_packet_unref(&st->attached_pic);
@@ -138,6 +142,8 @@ void avformat_free_context(AVFormatContext *s)
av_free(s);
}
+#if FF_API_AVSTREAM_SIDE_DATA
+FF_DISABLE_DEPRECATION_WARNINGS
uint8_t *av_stream_get_side_data(const AVStream *st,
enum AVPacketSideDataType type, size_t *size)
{
@@ -205,36 +211,8 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
return data;
}
-
-int ff_stream_side_data_copy(AVStream *dst, const AVStream *src)
-{
- /* Free existing side data*/
- for (int i = 0; i < dst->nb_side_data; i++)
- av_free(dst->side_data[i].data);
- av_freep(&dst->side_data);
- dst->nb_side_data = 0;
-
- /* Copy side data if present */
- if (src->nb_side_data) {
- dst->side_data = av_calloc(src->nb_side_data,
- sizeof(*dst->side_data));
- if (!dst->side_data)
- return AVERROR(ENOMEM);
- dst->nb_side_data = src->nb_side_data;
-
- for (int i = 0; i < src->nb_side_data; i++) {
- uint8_t *data = av_memdup(src->side_data[i].data,
- src->side_data[i].size);
- if (!data)
- return AVERROR(ENOMEM);
- dst->side_data[i].type = src->side_data[i].type;
- dst->side_data[i].size = src->side_data[i].size;
- dst->side_data[i].data = data;
- }
- }
-
- return 0;
-}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
/**
* Copy all stream parameters from source to destination stream, with the
@@ -270,10 +248,6 @@ static int stream_params_copy(AVStream *dst, const AVStream *src)
if (ret < 0)
return ret;
- ret = ff_stream_side_data_copy(dst, src);
- if (ret < 0)
- return ret;
-
av_packet_unref(&dst->attached_pic);
if (src->attached_pic.data) {
ret = av_packet_ref(&dst->attached_pic, &src->attached_pic);
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 1916aa2dc5..e67ed4205e 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -164,6 +164,12 @@
* decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the
* caller wishes to decode the data.
*
+ * There may be no overlap between AVCodecParameters.side_data_set and side data
+ * in packets. I.e. a given side data is either exported by the demuxer in
+ * AVCodecParameters, then it never appears in the packets, or the side data is
+ * exported through the packets (always in the first packet where the value
+ * becomes known or changes), then it does not appear in AVCodecParameters.
+ *
* AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be
* set if known. They may also be unset (i.e. AV_NOPTS_VALUE for
* pts/dts, 0 for duration) if the stream does not provide them. The timing
@@ -209,6 +215,11 @@
* AVCodecParameters, rather than using @ref avcodec_parameters_copy() during
* remuxing: there is no guarantee that the codec context values remain valid
* for both input and output format contexts.
+ * - There may be no overlap between AVCodecParameters.side_data_set and side data
+ * in packets. I.e. a given side data is either set by the caller in
+ * AVCodecParameters, then it never appears in the packets, or the side data is
+ * sent through the packets (always in the first packet where the value becomes
+ * known or changes), then it does not appear in AVCodecParameters.
* - The caller may fill in additional information, such as @ref
* AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream"
* metadata, @ref AVFormatContext.chapters "chapters", @ref
@@ -937,6 +948,7 @@ typedef struct AVStream {
*/
AVPacket attached_pic;
+#if FF_API_AVSTREAM_SIDE_DATA
/**
* An array of side data that applies to the whole stream (i.e. the
* container does not allow it to change between packets).
@@ -953,13 +965,20 @@ typedef struct AVStream {
*
* Freed by libavformat in avformat_free_context().
*
+ * @deprecated use AVStream's codecpar.side_data_set
+ *
* @see av_format_inject_global_side_data()
*/
+ attribute_deprecated
AVPacketSideData *side_data;
/**
* The number of elements in the AVStream.side_data array.
+ *
+ * @deprecated use AVStream's codecpar.side_data_set
*/
+ attribute_deprecated
int nb_side_data;
+#endif
/**
* Flags indicating events happening on the stream, a combination of
@@ -1715,11 +1734,14 @@ typedef struct AVFormatContext {
int (*io_close2)(struct AVFormatContext *s, AVIOContext *pb);
} AVFormatContext;
+#if FF_API_AVSTREAM_SIDE_DATA
/**
* This function will cause global side data to be injected in the next packet
* of each stream as well as after any subsequent seek.
*/
+attribute_deprecated
void av_format_inject_global_side_data(AVFormatContext *s);
+#endif
/**
* Returns the method used to set ctx->duration.
@@ -1856,7 +1878,9 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);
*
* @return zero on success, a negative AVERROR code on failure. On failure,
* the stream is unchanged and the data remains owned by the caller.
+ * @deprecated use av_packet_add_side_data_to_set() and stream->codecpar->side_data_set
*/
+attribute_deprecated
int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
uint8_t *data, size_t size);
@@ -1868,7 +1892,9 @@ int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
* @param size side information size
*
* @return pointer to fresh allocated data or NULL otherwise
+ * @deprecated use av_packet_new_side_data_to_set() and stream->codecpar->side_data_set
*/
+attribute_deprecated
uint8_t *av_stream_new_side_data(AVStream *stream,
enum AVPacketSideDataType type, size_t size);
/**
@@ -1880,7 +1906,9 @@ uint8_t *av_stream_new_side_data(AVStream *stream,
* or to zero if the desired side data is not present.
*
* @return pointer to data if present or NULL otherwise
+ * @deprecated use av_packet_get_side_data_from_set() and stream->codecpar->side_data_set
*/
+attribute_deprecated
uint8_t *av_stream_get_side_data(const AVStream *stream,
enum AVPacketSideDataType type, size_t *size);
diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
index 5d4f67d0ac..2aeb4f1dfd 100644
--- a/libavformat/concatdec.c
+++ b/libavformat/concatdec.c
@@ -194,7 +194,6 @@ static int copy_stream_props(AVStream *st, AVStream *source_st)
avpriv_set_pts_info(st, 64, source_st->time_base.num, source_st->time_base.den);
av_dict_copy(&st->metadata, source_st->metadata, 0);
- ff_stream_side_data_copy(st, source_st);
return 0;
}
diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
index 29d4680c68..2441087606 100644
--- a/libavformat/dashdec.c
+++ b/libavformat/dashdec.c
@@ -1952,17 +1952,6 @@ static int open_demux_for_component(AVFormatContext *s, struct representation *p
// copy disposition
st->disposition = ist->disposition;
-
- // copy side data
- for (int i = 0; i < ist->nb_side_data; i++) {
- const AVPacketSideData *sd_src = &ist->side_data[i];
- uint8_t *dst_data;
-
- dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size);
- if (!dst_data)
- return AVERROR(ENOMEM);
- memcpy(dst_data, sd_src->data, sd_src->size);
- }
}
return 0;
diff --git a/libavformat/demux.c b/libavformat/demux.c
index 1ef297d5e7..7253196a82 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -1408,9 +1408,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
sti->skip_samples = 0;
}
+#if FF_API_AVSTREAM_SIDE_DATA
if (sti->inject_global_side_data) {
- for (int i = 0; i < st->nb_side_data; i++) {
- const AVPacketSideData *const src_sd = &st->side_data[i];
+ for (int i = 0; i < st->codecpar->side_data_set.nb_side_data; i++) {
+ const AVPacketSideData *const src_sd = &st->codecpar->side_data_set.side_data[i];
uint8_t *dst_data;
if (av_packet_get_side_data(pkt, src_sd->type, NULL))
@@ -1426,6 +1427,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
}
sti->inject_global_side_data = 0;
}
+#endif
}
if (!si->metafree) {
@@ -2434,11 +2436,11 @@ static int add_coded_side_data(AVStream *st, AVCodecContext *avctx)
{
for (int i = 0; i < avctx->nb_coded_side_data; i++) {
const AVPacketSideData *const sd_src = &avctx->coded_side_data[i];
- uint8_t *dst_data;
- dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size);
- if (!dst_data)
+ AVPacketSideData *sd_dst = av_packet_new_side_data_to_set(&st->codecpar->side_data_set,
+ sd_src->type, sd_src->size);
+ if (!sd_dst)
return AVERROR(ENOMEM);
- memcpy(dst_data, sd_src->data, sd_src->size);
+ memcpy(sd_dst->data, sd_src->data, sd_src->size);
}
return 0;
}
@@ -2975,6 +2977,32 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
goto find_stream_info_err;
}
+#if FF_API_AVSTREAM_SIDE_DATA
+FF_DISABLE_DEPRECATION_WARNINGS
+ if (st->codecpar->side_data_set.nb_side_data > 0) {
+ av_assert0(!st->side_data && !st->nb_side_data);
+ st->side_data = av_calloc(st->codecpar->side_data_set.nb_side_data,
+ sizeof(*st->side_data));
+ if (!st->side_data) {
+ ret = AVERROR(ENOMEM);
+ goto find_stream_info_err;
+ }
+
+ for (int i = 0; i < st->codecpar->side_data_set.nb_side_data; i++) {
+ uint8_t *data = av_memdup(st->codecpar->side_data_set.side_data[i].data,
+ st->codecpar->side_data_set.side_data[i].size);
+ if (!data) {
+ ret = AVERROR(ENOMEM);
+ goto find_stream_info_err;
+ }
+ st->side_data[i].type = st->codecpar->side_data_set.side_data[i].type;
+ st->side_data[i].size = st->codecpar->side_data_set.side_data[i].size;
+ st->side_data[i].data = data;
+ st->nb_side_data++;
+ }
+ }
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
sti->avctx_inited = 0;
}
diff --git a/libavformat/demux_utils.c b/libavformat/demux_utils.c
index 56cc6e15d8..2946e82295 100644
--- a/libavformat/demux_utils.c
+++ b/libavformat/demux_utils.c
@@ -80,6 +80,8 @@ AVChapter *avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_ba
return chapter;
}
+#if FF_API_AVSTREAM_SIDE_DATA
+FF_DISABLE_DEPRECATION_WARNINGS
void av_format_inject_global_side_data(AVFormatContext *s)
{
FFFormatContext *const si = ffformatcontext(s);
@@ -89,6 +91,8 @@ void av_format_inject_global_side_data(AVFormatContext *s)
ffstream(st)->inject_global_side_data = 1;
}
}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
int avformat_queue_attached_pictures(AVFormatContext *s)
{
diff --git a/libavformat/dovi_isom.c b/libavformat/dovi_isom.c
index 76681b9451..031f19dba5 100644
--- a/libavformat/dovi_isom.c
+++ b/libavformat/dovi_isom.c
@@ -63,7 +63,7 @@ int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf
dovi->dv_bl_signal_compatibility_id = 0;
}
- ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_DOVI_CONF,
(uint8_t *)dovi, dovi_size);
if (ret < 0) {
av_free(dovi);
diff --git a/libavformat/dump.c b/libavformat/dump.c
index d31e4c2ec6..76981fb45f 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -431,11 +431,11 @@ static void dump_sidedata(void *ctx, const AVStream *st, const char *indent)
{
int i;
- if (st->nb_side_data)
+ if (st->codecpar->side_data_set.nb_side_data)
av_log(ctx, AV_LOG_INFO, "%sSide data:\n", indent);
- for (i = 0; i < st->nb_side_data; i++) {
- const AVPacketSideData *sd = &st->side_data[i];
+ for (i = 0; i < st->codecpar->side_data_set.nb_side_data; i++) {
+ const AVPacketSideData *sd = &st->codecpar->side_data_set.side_data[i];
av_log(ctx, AV_LOG_INFO, "%s ", indent);
switch (sd->type) {
diff --git a/libavformat/hls.c b/libavformat/hls.c
index 2a2fe28a54..d792833290 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -1851,17 +1851,6 @@ static int set_stream_info_from_input_stream(AVStream *st, struct playlist *pls,
av_dict_copy(&st->metadata, ist->metadata, 0);
- // copy side data
- for (int i = 0; i < ist->nb_side_data; i++) {
- const AVPacketSideData *sd_src = &ist->side_data[i];
- uint8_t *dst_data;
-
- dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size);
- if (!dst_data)
- return AVERROR(ENOMEM);
- memcpy(dst_data, sd_src->data, sd_src->size);
- }
-
ffstream(st)->need_context_update = 1;
return 0;
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 27d97f5f72..b61079bd76 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -1351,16 +1351,17 @@ static const char* get_relative_url(const char *master_url, const char *media_ur
static int64_t get_stream_bit_rate(AVStream *stream)
{
- AVCPBProperties *props = (AVCPBProperties*)av_stream_get_side_data(
- stream,
- AV_PKT_DATA_CPB_PROPERTIES,
- NULL
+ AVPacketSideData *sd = av_packet_get_side_data_from_set(
+ &stream->codecpar->side_data_set,
+ AV_PKT_DATA_CPB_PROPERTIES
);
if (stream->codecpar->bit_rate)
return stream->codecpar->bit_rate;
- else if (props)
+ else if (sd) {
+ AVCPBProperties *props = (AVCPBProperties*)sd->data;
return props->max_bitrate;
+ }
return 0;
}
diff --git a/libavformat/internal.h b/libavformat/internal.h
index 9fc980601f..e625a6c654 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -149,7 +149,9 @@ typedef struct FFFormatContext {
int missing_ts_warning;
#endif
+#if FF_API_AVSTREAM_SIDE_DATA
int inject_global_side_data;
+#endif
int avoid_negative_ts_use_pts;
@@ -356,10 +358,12 @@ typedef struct FFStream {
uint8_t dts_ordered;
uint8_t dts_misordered;
+#if FF_API_AVSTREAM_SIDE_DATA
/**
* Internal data to inject global side data
*/
int inject_global_side_data;
+#endif
/**
* display aspect ratio (0 if unknown)
diff --git a/libavformat/matroska.c b/libavformat/matroska.c
index 79b2d09984..d217b68584 100644
--- a/libavformat/matroska.c
+++ b/libavformat/matroska.c
@@ -198,7 +198,7 @@ int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
break;
}
- ret = av_stream_add_side_data(st, AV_PKT_DATA_STEREO3D, (uint8_t *)stereo,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_STEREO3D, (uint8_t *)stereo,
sizeof(*stereo));
if (ret < 0) {
av_freep(&stereo);
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 49950956b6..598cf8a7bf 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2202,7 +2202,7 @@ static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) {
AVContentLightMetadata *metadata = av_content_light_metadata_alloc(&size);
if (!metadata)
return AVERROR(ENOMEM);
- ret = av_stream_add_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
(uint8_t *)metadata, size);
if (ret < 0) {
av_freep(&metadata);
@@ -2213,13 +2213,13 @@ static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) {
}
if (has_mastering_primaries || has_mastering_luminance) {
- AVMasteringDisplayMetadata *metadata =
- (AVMasteringDisplayMetadata*) av_stream_new_side_data(
- st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
+ AVMasteringDisplayMetadata *metadata;
+ AVPacketSideData *sd = av_packet_new_side_data_to_set(
+ &st->codecpar->side_data_set, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
sizeof(AVMasteringDisplayMetadata));
- if (!metadata) {
+ if (!sd)
return AVERROR(ENOMEM);
- }
+ metadata = (AVMasteringDisplayMetadata*)sd->data;
memset(metadata, 0, sizeof(AVMasteringDisplayMetadata));
if (has_mastering_primaries) {
metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX);
@@ -2245,6 +2245,7 @@ static int mkv_create_display_matrix(AVStream *st,
const MatroskaTrackVideoProjection *proj,
void *logctx)
{
+ AVPacketSideData *sd;
double pitch = proj->pitch, yaw = proj->yaw, roll = proj->roll;
int32_t *matrix;
int hflip;
@@ -2261,10 +2262,11 @@ static int mkv_create_display_matrix(AVStream *st,
st->index, yaw, pitch, roll);
return 0;
}
- matrix = (int32_t*)av_stream_new_side_data(st, AV_PKT_DATA_DISPLAYMATRIX,
+ sd = av_packet_new_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_DISPLAYMATRIX,
9 * sizeof(*matrix));
- if (!matrix)
+ if (!sd)
return AVERROR(ENOMEM);
+ matrix = (int32_t*)sd->data;
hflip = yaw != 0.0;
/* ProjectionPoseRoll is in the counter-clockwise direction
@@ -2365,7 +2367,7 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track,
spherical->bound_right = r;
spherical->bound_bottom = b;
- ret = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, (uint8_t *)spherical,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_SPHERICAL, (uint8_t *)spherical,
spherical_size);
if (ret < 0) {
av_freep(&spherical);
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 41e13b273d..a382cdd120 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -1323,7 +1323,7 @@ fail:
static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st,
const AVCodecParameters *par)
{
- const void *side_data;
+ const AVPacketSideData *side_data;
ebml_writer_open_master(writer, MATROSKA_ID_VIDEOCOLOR);
@@ -1357,20 +1357,18 @@ static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st,
(ypos >> 7) + 1);
}
- side_data = av_stream_get_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
- NULL);
+ side_data = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_CONTENT_LIGHT_LEVEL);
if (side_data) {
- const AVContentLightMetadata *metadata = side_data;
+ const AVContentLightMetadata *metadata = (AVContentLightMetadata *)side_data->data;
ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORMAXCLL,
metadata->MaxCLL);
ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORMAXFALL,
metadata->MaxFALL);
}
- side_data = av_stream_get_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
- NULL);
+ side_data = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_MASTERING_DISPLAY_METADATA);
if (side_data) {
- const AVMasteringDisplayMetadata *metadata = side_data;
+ const AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)side_data->data;
ebml_writer_open_master(writer, MATROSKA_ID_VIDEOCOLORMASTERINGMETA);
if (metadata->has_primaries) {
ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_RX,
@@ -1406,13 +1404,13 @@ static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st,
static void mkv_write_video_projection(AVFormatContext *s, EbmlWriter *writer,
const AVStream *st, uint8_t private[])
{
- const AVSphericalMapping *spherical =
- (const AVSphericalMapping *)av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL,
- NULL);
+ AVPacketSideData *sd = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_SPHERICAL);
+ const AVSphericalMapping *spherical;
- if (!spherical)
+ if (!sd)
return;
+ spherical = (const AVSphericalMapping *)sd->data;
if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR &&
spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE &&
spherical->projection != AV_SPHERICAL_CUBEMAP) {
@@ -1513,9 +1511,9 @@ static int mkv_write_stereo_mode(AVFormatContext *s, EbmlWriter *writer,
AVStream *st, int is_webm,
int *h_width, int *h_height)
{
+ AVPacketSideData *sd;
const AVDictionaryEntry *tag;
MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB;
- const AVStereo3D *stereo;
*h_width = 1;
*h_height = 1;
@@ -1538,9 +1536,9 @@ static int mkv_write_stereo_mode(AVFormatContext *s, EbmlWriter *writer,
}
}
- stereo = (const AVStereo3D*)av_stream_get_side_data(st, AV_PKT_DATA_STEREO3D,
- NULL);
- if (stereo) {
+ sd = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_STEREO3D);
+ if (sd) {
+ const AVStereo3D *stereo = (const AVStereo3D*)sd->data;
switch (stereo->type) {
case AV_STEREO3D_2D:
format = MATROSKA_VIDEO_STEREOMODE_TYPE_MONO;
@@ -1605,8 +1603,11 @@ static void mkv_write_blockadditionmapping(AVFormatContext *s, MatroskaMuxContex
AVIOContext *pb, mkv_track *track, AVStream *st)
{
#if CONFIG_MATROSKA_MUXER
- AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *)
- av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF, NULL);
+ AVPacketSideData *sd = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_DOVI_CONF);
+ AVDOVIDecoderConfigurationRecord *dovi = NULL;
+
+ if (sd)
+ dovi = (AVDOVIDecoderConfigurationRecord *)sd->data;
if (IS_SEEKABLE(s->pb, mkv)) {
track->blockadditionmapping_offset = avio_tell(pb);
diff --git a/libavformat/mov.c b/libavformat/mov.c
index ac19b3157a..4669ab998c 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -799,6 +799,7 @@ static int mov_read_esds(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
AVStream *st;
+ AVPacketSideData *sd;
enum AVAudioServiceType *ast;
int ac3info, acmod, lfeon, bsmod;
uint64_t mask;
@@ -807,11 +808,12 @@ static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return 0;
st = c->fc->streams[c->fc->nb_streams-1];
- ast = (enum AVAudioServiceType*)av_stream_new_side_data(st, AV_PKT_DATA_AUDIO_SERVICE_TYPE,
+ sd = av_packet_new_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_AUDIO_SERVICE_TYPE,
sizeof(*ast));
- if (!ast)
+ if (!sd)
return AVERROR(ENOMEM);
+ ast = (enum AVAudioServiceType*)sd->data;
ac3info = avio_rb24(pb);
bsmod = (ac3info >> 14) & 0x7;
acmod = (ac3info >> 11) & 0x7;
@@ -833,6 +835,7 @@ static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
AVStream *st;
+ AVPacketSideData *sd;
enum AVAudioServiceType *ast;
int eac3info, acmod, lfeon, bsmod;
uint64_t mask;
@@ -841,11 +844,13 @@ static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return 0;
st = c->fc->streams[c->fc->nb_streams-1];
- ast = (enum AVAudioServiceType*)av_stream_new_side_data(st, AV_PKT_DATA_AUDIO_SERVICE_TYPE,
+ sd = av_packet_new_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_AUDIO_SERVICE_TYPE,
sizeof(*ast));
- if (!ast)
+ if (!sd)
return AVERROR(ENOMEM);
+ ast = (enum AVAudioServiceType*)sd->data;
+
/* No need to parse fields for additional independent substreams and its
* associated dependent substreams since libavcodec's E-AC-3 decoder
* does not support them yet. */
@@ -1747,7 +1752,6 @@ static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
AVStream *st;
- uint8_t *icc_profile;
char color_parameter_type[5] = { 0 };
uint16_t color_primaries, color_trc, color_matrix;
int ret;
@@ -1768,10 +1772,10 @@ static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
if (!strncmp(color_parameter_type, "prof", 4)) {
- icc_profile = av_stream_new_side_data(st, AV_PKT_DATA_ICC_PROFILE, atom.size - 4);
- if (!icc_profile)
+ AVPacketSideData *sd = av_packet_new_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_ICC_PROFILE, atom.size - 4);
+ if (!sd)
return AVERROR(ENOMEM);
- ret = ffio_read_size(pb, icc_profile, atom.size - 4);
+ ret = ffio_read_size(pb, sd->data, atom.size - 4);
if (ret < 0)
return ret;
} else {
@@ -6831,8 +6835,9 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom)
AVEncryptionInitInfo *info, *old_init_info;
uint8_t **key_ids;
AVStream *st;
- uint8_t *side_data, *extra_data, *old_side_data;
- size_t side_data_size, old_side_data_size;
+ AVPacketSideData *old_side_data;
+ uint8_t *side_data, *extra_data;
+ size_t side_data_size;
int ret = 0;
unsigned int version, kid_count, extra_data_size, alloc_size = 0;
@@ -6910,9 +6915,9 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom)
info->data_size = extra_data_size;
// If there is existing initialization data, append to the list.
- old_side_data = av_stream_get_side_data(st, AV_PKT_DATA_ENCRYPTION_INIT_INFO, &old_side_data_size);
+ old_side_data = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_ENCRYPTION_INIT_INFO);
if (old_side_data) {
- old_init_info = av_encryption_init_info_get_side_data(old_side_data, old_side_data_size);
+ old_init_info = av_encryption_init_info_get_side_data(old_side_data->data, old_side_data->size);
if (old_init_info) {
// Append to the end of the list.
for (AVEncryptionInitInfo *cur = old_init_info;; cur = cur->next) {
@@ -6934,7 +6939,7 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom)
ret = AVERROR(ENOMEM);
goto finish;
}
- ret = av_stream_add_side_data(st, AV_PKT_DATA_ENCRYPTION_INIT_INFO,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_ENCRYPTION_INIT_INFO,
side_data, side_data_size);
if (ret < 0)
av_free(side_data);
@@ -8713,7 +8718,7 @@ static int mov_read_header(AVFormatContext *s)
break;
case AVMEDIA_TYPE_VIDEO:
if (sc->display_matrix) {
- err = av_stream_add_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, (uint8_t*)sc->display_matrix,
+ err = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_DISPLAYMATRIX, (uint8_t*)sc->display_matrix,
sizeof(int32_t) * 9);
if (err < 0)
return err;
@@ -8721,7 +8726,7 @@ static int mov_read_header(AVFormatContext *s)
sc->display_matrix = NULL;
}
if (sc->stereo3d) {
- err = av_stream_add_side_data(st, AV_PKT_DATA_STEREO3D,
+ err = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_STEREO3D,
(uint8_t *)sc->stereo3d,
sizeof(*sc->stereo3d));
if (err < 0)
@@ -8730,7 +8735,7 @@ static int mov_read_header(AVFormatContext *s)
sc->stereo3d = NULL;
}
if (sc->spherical) {
- err = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL,
+ err = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_SPHERICAL,
(uint8_t *)sc->spherical,
sc->spherical_size);
if (err < 0)
@@ -8739,7 +8744,7 @@ static int mov_read_header(AVFormatContext *s)
sc->spherical = NULL;
}
if (sc->mastering) {
- err = av_stream_add_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
+ err = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
(uint8_t *)sc->mastering,
sizeof(*sc->mastering));
if (err < 0)
@@ -8748,7 +8753,7 @@ static int mov_read_header(AVFormatContext *s)
sc->mastering = NULL;
}
if (sc->coll) {
- err = av_stream_add_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
+ err = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
(uint8_t *)sc->coll,
sc->coll_size);
if (err < 0)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index f1cc80b1b3..06939d40d0 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -672,11 +672,11 @@ struct mpeg4_bit_rate_values {
static struct mpeg4_bit_rate_values calculate_mpeg4_bit_rates(MOVTrack *track)
{
- AVCPBProperties *props = track->st ?
- (AVCPBProperties*)av_stream_get_side_data(track->st,
- AV_PKT_DATA_CPB_PROPERTIES,
- NULL) :
+ AVPacketSideData *sd = track->st ?
+ av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set,
+ AV_PKT_DATA_CPB_PROPERTIES) :
NULL;
+ AVCPBProperties *props = sd ? (AVCPBProperties *)sd->data : NULL;
struct mpeg4_bit_rate_values bit_rates = { 0 };
bit_rates.avg_bit_rate = compute_avg_bitrate(track);
@@ -2127,18 +2127,16 @@ static int mov_write_colr_tag(AVIOContext *pb, MOVTrack *track, int prefer_icc)
// Ref (MOV): https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9
// Ref (MP4): ISO/IEC 14496-12:2012
- const uint8_t *icc_profile;
- size_t icc_profile_size;
-
if (prefer_icc) {
- icc_profile = av_stream_get_side_data(track->st, AV_PKT_DATA_ICC_PROFILE, &icc_profile_size);
+ AVPacketSideData *sd = av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set,
+ AV_PKT_DATA_ICC_PROFILE);
- if (icc_profile) {
- avio_wb32(pb, 12 + icc_profile_size);
+ if (sd) {
+ avio_wb32(pb, 12 + sd->size);
ffio_wfourcc(pb, "colr");
ffio_wfourcc(pb, "prof");
- avio_write(pb, icc_profile, icc_profile_size);
- return 12 + icc_profile_size;
+ avio_write(pb, sd->data, sd->size);
+ return 12 + sd->size;
}
else {
av_log(NULL, AV_LOG_INFO, "no ICC profile found, will write nclx/nclc colour info instead\n");
@@ -2171,14 +2169,14 @@ static int mov_write_colr_tag(AVIOContext *pb, MOVTrack *track, int prefer_icc)
static int mov_write_clli_tag(AVIOContext *pb, MOVTrack *track)
{
- const uint8_t *side_data;
+ const AVPacketSideData *side_data;
const AVContentLightMetadata *content_light_metadata;
- side_data = av_stream_get_side_data(track->st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, NULL);
+ side_data = av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set, AV_PKT_DATA_CONTENT_LIGHT_LEVEL);
if (!side_data) {
return 0;
}
- content_light_metadata = (const AVContentLightMetadata*)side_data;
+ content_light_metadata = (const AVContentLightMetadata*)side_data->data;
avio_wb32(pb, 12); // size
ffio_wfourcc(pb, "clli");
@@ -2196,11 +2194,12 @@ static int mov_write_mdcv_tag(AVIOContext *pb, MOVTrack *track)
{
const int chroma_den = 50000;
const int luma_den = 10000;
- const uint8_t *side_data;
- const AVMasteringDisplayMetadata *metadata;
+ const AVPacketSideData *side_data;
+ const AVMasteringDisplayMetadata *metadata = NULL;
- side_data = av_stream_get_side_data(track->st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL);
- metadata = (const AVMasteringDisplayMetadata*)side_data;
+ side_data = av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set, AV_PKT_DATA_MASTERING_DISPLAY_METADATA);
+ if (side_data)
+ metadata = (const AVMasteringDisplayMetadata*)side_data->data;
if (!metadata || !metadata->has_primaries || !metadata->has_luminance) {
return 0;
}
@@ -2419,7 +2418,7 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
track->par->color_trc != AVCOL_TRC_UNSPECIFIED &&
track->par->color_space != AVCOL_SPC_UNSPECIFIED;
if (has_color_info || mov->flags & FF_MOV_FLAG_WRITE_COLR ||
- av_stream_get_side_data(track->st, AV_PKT_DATA_ICC_PROFILE, NULL)) {
+ av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set, AV_PKT_DATA_ICC_PROFILE)) {
int prefer_icc = mov->flags & FF_MOV_FLAG_PREFER_ICC || !has_color_info;
mov_write_colr_tag(pb, track, prefer_icc);
}
@@ -2433,17 +2432,16 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
}
if (track->mode == MODE_MP4 && mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
- AVStereo3D* stereo_3d = (AVStereo3D*) av_stream_get_side_data(track->st, AV_PKT_DATA_STEREO3D, NULL);
- AVSphericalMapping* spherical_mapping = (AVSphericalMapping*)av_stream_get_side_data(track->st, AV_PKT_DATA_SPHERICAL, NULL);
- AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *)
- av_stream_get_side_data(track->st, AV_PKT_DATA_DOVI_CONF, NULL);
+ AVPacketSideData *stereo_3d = av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set, AV_PKT_DATA_STEREO3D);
+ AVPacketSideData *spherical_mapping = av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set, AV_PKT_DATA_SPHERICAL);
+ AVPacketSideData *dovi = av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set, AV_PKT_DATA_DOVI_CONF);
if (stereo_3d)
- mov_write_st3d_tag(s, pb, stereo_3d);
+ mov_write_st3d_tag(s, pb, (AVStereo3D*)stereo_3d->data);
if (spherical_mapping)
- mov_write_sv3d_tag(mov->fc, pb, spherical_mapping);
+ mov_write_sv3d_tag(mov->fc, pb, (AVSphericalMapping*)spherical_mapping->data);
if (dovi)
- mov_write_dvcc_dvvc_tag(s, pb, dovi);
+ mov_write_dvcc_dvvc_tag(s, pb, (AVDOVIDecoderConfigurationRecord *)dovi->data);
}
if (track->par->sample_aspect_ratio.den && track->par->sample_aspect_ratio.num) {
@@ -3390,7 +3388,6 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov,
int group = 0;
uint32_t *display_matrix = NULL;
- size_t display_matrix_size;
int i;
if (mov->mode == MODE_AVIF)
@@ -3400,15 +3397,15 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov,
duration *= mov->avif_loop_count;
if (st) {
+ AVPacketSideData *sd;
if (mov->per_stream_grouping)
group = st->index;
else
group = st->codecpar->codec_type;
- display_matrix = (uint32_t*)av_stream_get_side_data(st, AV_PKT_DATA_DISPLAYMATRIX,
- &display_matrix_size);
- if (display_matrix && display_matrix_size < 9 * sizeof(*display_matrix))
- display_matrix = NULL;
+ sd = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_DISPLAYMATRIX);
+ if (sd && sd->size == 9 * sizeof(*display_matrix))
+ display_matrix = (uint32_t *)sd->data;
}
if (track->flags & MOV_TRACK_ENABLED)
@@ -4606,12 +4603,10 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
track->tref_tag = MKTAG('h','i','n','t');
track->tref_id = mov->tracks[track->src_track].track_id;
} else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO) {
- size_t size;
- int *fallback;
- fallback = (int*)av_stream_get_side_data(track->st,
- AV_PKT_DATA_FALLBACK_TRACK,
- &size);
- if (fallback != NULL && size == sizeof(int)) {
+ AVPacketSideData *sd = av_packet_get_side_data_from_set(&track->st->codecpar->side_data_set,
+ AV_PKT_DATA_FALLBACK_TRACK );
+ if (sd && sd->size == sizeof(int)) {
+ int *fallback = (int *)sd->data;
if (*fallback >= 0 && *fallback < mov->nb_streams) {
track->tref_tag = MKTAG('f','a','l','l');
track->tref_id = mov->tracks[*fallback].track_id;
@@ -5444,7 +5439,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
if (st->codecpar->codec_id == AV_CODEC_ID_AC3 ||
st->codecpar->codec_id == AV_CODEC_ID_EAC3 ||
st->codecpar->codec_id == AV_CODEC_ID_TRUEHD ||
- av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF, NULL))
+ av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_DOVI_CONF))
has_dolby = 1;
}
diff --git a/libavformat/mp3enc.c b/libavformat/mp3enc.c
index 5e81f72a59..7b666b7db0 100644
--- a/libavformat/mp3enc.c
+++ b/libavformat/mp3enc.c
@@ -400,10 +400,10 @@ static int mp3_queue_flush(AVFormatContext *s)
static void mp3_update_xing(AVFormatContext *s)
{
MP3Context *mp3 = s->priv_data;
+ AVPacketSideData *sd;
AVReplayGain *rg;
uint16_t tag_crc;
uint8_t *toc;
- size_t rg_size;
int i;
int64_t old_pos = avio_tell(s->pb);
@@ -423,11 +423,11 @@ static void mp3_update_xing(AVFormatContext *s)
}
/* write replaygain */
- rg = (AVReplayGain*)av_stream_get_side_data(s->streams[0], AV_PKT_DATA_REPLAYGAIN,
- &rg_size);
- if (rg && rg_size >= sizeof(*rg)) {
+ sd = av_packet_get_side_data_from_set(&s->streams[0]->codecpar->side_data_set, AV_PKT_DATA_REPLAYGAIN);
+ if (sd && sd->size >= sizeof(*rg)) {
uint16_t val;
+ rg = (AVReplayGain *)sd->data;
AV_WB32(mp3->xing_frame + mp3->xing_offset + 131,
av_rescale(rg->track_peak, 1 << 23, 100000));
diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c
index c06e308296..b28486821b 100644
--- a/libavformat/mpegenc.c
+++ b/libavformat/mpegenc.c
@@ -342,8 +342,6 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx)
lpcm_id = LPCM_ID;
for (i = 0; i < ctx->nb_streams; i++) {
- AVCPBProperties *props;
-
st = ctx->streams[i];
stream = av_mallocz(sizeof(StreamInfo));
if (!stream)
@@ -431,12 +429,16 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx)
s->audio_bound++;
break;
case AVMEDIA_TYPE_VIDEO:
+ AVPacketSideData *sd;
+ AVCPBProperties *props = NULL;
if (st->codecpar->codec_id == AV_CODEC_ID_H264)
stream->id = h264_id++;
else
stream->id = mpv_id++;
- props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL);
+ sd = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_CPB_PROPERTIES);
+ if (sd)
+ props = (AVCPBProperties*)sd->data;
if (props && props->buffer_size)
stream->max_buffer_size = 6 * 1024 + props->buffer_size / 8;
else {
@@ -470,12 +472,15 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx)
audio_bitrate = 0;
video_bitrate = 0;
for (i = 0; i < ctx->nb_streams; i++) {
- AVCPBProperties *props;
+ AVPacketSideData *sd;
+ AVCPBProperties *props = NULL;
int codec_rate;
st = ctx->streams[i];
stream = (StreamInfo *)st->priv_data;
- props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL);
+ sd = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_CPB_PROPERTIES);
+ if (sd)
+ props = (AVCPBProperties*)sd->data;
if (props)
codec_rate = props->max_bitrate;
else
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 0b3edda817..093ee98447 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -2221,7 +2221,7 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
dovi->dv_bl_signal_compatibility_id = 0;
}
- ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_DOVI_CONF,
(uint8_t *)dovi, dovi_size);
if (ret < 0) {
av_free(dovi);
diff --git a/libavformat/mux.c b/libavformat/mux.c
index 415bd3948f..21ab32dc99 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -277,6 +277,25 @@ FF_ENABLE_DEPRECATION_WARNINGS
break;
}
+#if FF_API_AVSTREAM_SIDE_DATA
+FF_DISABLE_DEPRECATION_WARNINGS
+ /* if the caller is using the deprecated AVStream side_data API,
+ * copy its contents to AVStream.codecpar, giving it priority
+ over existing side data in the latter */
+ for (int i = 0; i < st->nb_side_data; i++) {
+ const AVPacketSideData *sd_src = &st->side_data[i];
+ AVPacketSideData *sd_dst;
+
+ sd_dst = av_packet_new_side_data_to_set(&st->codecpar->side_data_set, sd_src->type, sd_src->size);
+ if (!sd_dst) {
+ ret = AVERROR(EINVAL);
+ goto fail;
+ }
+ memcpy(sd_dst->data, sd_src->data, sd_src->size);
+ }
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
desc = avcodec_descriptor_get(par->codec_id);
if (desc && desc->props & AV_CODEC_PROP_REORDER)
sti->reorder = 1;
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index 34230ece98..bb542207d1 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -2577,10 +2577,11 @@ static int parse_mca_labels(MXFContext *mxf, MXFTrack *source_track, MXFDescript
if (service_type != AV_AUDIO_SERVICE_TYPE_NB && service_type != AV_AUDIO_SERVICE_TYPE_MAIN && !ambigous_service_type) {
enum AVAudioServiceType *ast;
- uint8_t* side_data = av_stream_new_side_data(st, AV_PKT_DATA_AUDIO_SERVICE_TYPE, sizeof(*ast));
+ AVPacketSideData *side_data = av_packet_new_side_data_to_set(&st->codecpar->side_data_set,
+ AV_PKT_DATA_AUDIO_SERVICE_TYPE, sizeof(*ast));
if (!side_data)
return AVERROR(ENOMEM);
- ast = (enum AVAudioServiceType*)side_data;
+ ast = (enum AVAudioServiceType*)side_data->data;
*ast = service_type;
}
@@ -2980,7 +2981,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
st->codecpar->color_trc = mxf_get_codec_ul(ff_mxf_color_trc_uls, &descriptor->color_trc_ul)->id;
st->codecpar->color_space = mxf_get_codec_ul(ff_mxf_color_space_uls, &descriptor->color_space_ul)->id;
if (descriptor->mastering) {
- ret = av_stream_add_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
(uint8_t *)descriptor->mastering,
sizeof(*descriptor->mastering));
if (ret < 0)
@@ -2988,7 +2989,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
descriptor->mastering = NULL;
}
if (descriptor->coll) {
- ret = av_stream_add_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
+ ret = av_packet_add_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
(uint8_t *)descriptor->coll,
descriptor->coll_size);
if (ret < 0)
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index d8252ed68f..8ed4b0a49f 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -556,7 +556,7 @@ static void mxf_write_primer_pack(AVFormatContext *s)
if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_H264 && !sc->avc_intra) {
will_have_avc_tags = 1;
}
- if (av_stream_get_side_data(s->streams[i], AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL)) {
+ if (av_packet_get_side_data_from_set(&s->streams[i]->codecpar->side_data_set, AV_PKT_DATA_MASTERING_DISPLAY_METADATA)) {
will_have_mastering_tags = 1;
}
if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_FFV1) {
@@ -1158,7 +1158,7 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
const MXFCodecUL *color_trc_ul;
const MXFCodecUL *color_space_ul;
int64_t pos = mxf_write_generic_desc(s, st, key);
- uint8_t *side_data;
+ AVPacketSideData *side_data;
color_primaries_ul = mxf_get_codec_ul_by_id(ff_mxf_color_primaries_uls, st->codecpar->color_primaries);
color_trc_ul = mxf_get_codec_ul_by_id(ff_mxf_color_trc_uls, st->codecpar->color_trc);
@@ -1344,9 +1344,9 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
avio_write(pb, *sc->codec_ul, 16);
// Mastering Display metadata
- side_data = av_stream_get_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL);
+ side_data = av_packet_get_side_data_from_set(&st->codecpar->side_data_set, AV_PKT_DATA_MASTERING_DISPLAY_METADATA);
if (side_data) {
- const AVMasteringDisplayMetadata *metadata = (const AVMasteringDisplayMetadata*)side_data;
+ const AVMasteringDisplayMetadata *metadata = (const AVMasteringDisplayMetadata*)side_data->data;
if (metadata->has_primaries) {
mxf_write_local_tag(s, 12, 0x8301);
avio_wb16(pb, rescale_mastering_chroma(metadata->display_primaries[0][0]));
diff --git a/libavformat/options.c b/libavformat/options.c
index e4a3aceed0..ef0b593d36 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -309,7 +309,9 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
st->sample_aspect_ratio = (AVRational) { 0, 1 };
+#if FF_API_AVSTREAM_SIDE_DATA
sti->inject_global_side_data = si->inject_global_side_data;
+#endif
sti->need_context_update = 1;
diff --git a/libavformat/replaygain.c b/libavformat/replaygain.c
index 915bcb2382..302bd75aec 100644
--- a/libavformat/replaygain.c
+++ b/libavformat/replaygain.c
@@ -69,16 +69,18 @@ static int32_t parse_value(const char *value, int32_t min)
int ff_replaygain_export_raw(AVStream *st, int32_t tg, uint32_t tp,
int32_t ag, uint32_t ap)
{
+ AVPacketSideData *sd;
AVReplayGain *replaygain;
if (tg == INT32_MIN && ag == INT32_MIN)
return 0;
- replaygain = (AVReplayGain*)av_stream_new_side_data(st, AV_PKT_DATA_REPLAYGAIN,
+ sd = av_packet_new_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_REPLAYGAIN,
sizeof(*replaygain));
- if (!replaygain)
+ if (!sd)
return AVERROR(ENOMEM);
+ replaygain = (AVReplayGain*)sd->data;
replaygain->track_gain = tg;
replaygain->track_peak = tp;
replaygain->album_gain = ag;
diff --git a/libavformat/seek.c b/libavformat/seek.c
index 386312cd3a..0180188595 100644
--- a/libavformat/seek.c
+++ b/libavformat/seek.c
@@ -745,8 +745,10 @@ void ff_read_frame_flush(AVFormatContext *s)
for (int j = 0; j < MAX_REORDER_DELAY + 1; j++)
sti->pts_buffer[j] = AV_NOPTS_VALUE;
+#if FF_API_AVSTREAM_SIDE_DATA
if (si->inject_global_side_data)
sti->inject_global_side_data = 1;
+#endif
sti->skip_samples = 0;
}
diff --git a/libavformat/version_major.h b/libavformat/version_major.h
index 293fbd3397..c348e3eb37 100644
--- a/libavformat/version_major.h
+++ b/libavformat/version_major.h
@@ -45,6 +45,7 @@
#define FF_API_GET_END_PTS (LIBAVFORMAT_VERSION_MAJOR < 61)
#define FF_API_AVIODIRCONTEXT (LIBAVFORMAT_VERSION_MAJOR < 61)
#define FF_API_AVFORMAT_IO_CLOSE (LIBAVFORMAT_VERSION_MAJOR < 61)
+#define FF_API_AVSTREAM_SIDE_DATA (LIBAVFORMAT_VERSION_MAJOR < 61)
#define FF_API_R_FRAME_RATE 1
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 04/13] fftools/ffmpeg: stop using AVStream.side_data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 02/13] avcodec/codec_par: add side data to AVCodecParameters James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 03/13] avformat/avformat: use the side data from AVStream.codecpar James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 05/13] fftools/ffplay: " James Almer
` (9 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
fftools/ffmpeg_demux.c | 11 +++++++----
fftools/ffmpeg_enc.c | 25 +++++++++++++------------
fftools/ffmpeg_filter.c | 5 ++++-
fftools/ffmpeg_mux_init.c | 16 ++++++++--------
4 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
index 48edbd7f6b..f984df7c95 100644
--- a/fftools/ffmpeg_demux.c
+++ b/fftools/ffmpeg_demux.c
@@ -482,8 +482,8 @@ static int input_packet_process(Demuxer *d, DemuxMsg *msg, AVPacket *src)
/* add the stream-global side data to the first packet */
if (ds->nb_packets == 1) {
- for (int i = 0; i < ist->st->nb_side_data; i++) {
- AVPacketSideData *src_sd = &ist->st->side_data[i];
+ for (int i = 0; i < ist->st->codecpar->side_data_set.nb_side_data; i++) {
+ AVPacketSideData *src_sd = &ist->st->codecpar->side_data_set.side_data[i];
uint8_t *dst_data;
if (src_sd->type == AV_PKT_DATA_DISPLAYMATRIX)
@@ -979,6 +979,7 @@ static int add_display_matrix_to_stream(const OptionsContext *o,
AVFormatContext *ctx, InputStream *ist)
{
AVStream *st = ist->st;
+ AVPacketSideData *sd;
double rotation = DBL_MAX;
int hflip = -1, vflip = -1;
int hflip_set = 0, vflip_set = 0, rotation_set = 0;
@@ -995,12 +996,14 @@ static int add_display_matrix_to_stream(const OptionsContext *o,
if (!rotation_set && !hflip_set && !vflip_set)
return 0;
- buf = (int32_t *)av_stream_new_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9);
- if (!buf) {
+ sd = av_packet_new_side_data_to_set(&st->codecpar->side_data_set, AV_PKT_DATA_DISPLAYMATRIX,
+ sizeof(int32_t) * 9);
+ if (!sd) {
av_log(ist, AV_LOG_FATAL, "Failed to generate a display matrix!\n");
return AVERROR(ENOMEM);
}
+ buf = (int32_t *)sd->data;
av_display_rotation_set(buf,
rotation_set ? -(rotation) : -0.0f);
diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c
index 96424272bf..f12024dff5 100644
--- a/fftools/ffmpeg_enc.c
+++ b/fftools/ffmpeg_enc.c
@@ -428,12 +428,12 @@ int enc_open(OutputStream *ost, AVFrame *frame)
for (i = 0; i < ost->enc_ctx->nb_coded_side_data; i++) {
const AVPacketSideData *sd_src = &ost->enc_ctx->coded_side_data[i];
- uint8_t *dst_data;
+ AVPacketSideData *sd_dst;
- dst_data = av_stream_new_side_data(ost->st, sd_src->type, sd_src->size);
- if (!dst_data)
+ sd_dst = av_packet_new_side_data_to_set(&ost->par_in->side_data_set, sd_src->type, sd_src->size);
+ if (!sd_dst)
return AVERROR(ENOMEM);
- memcpy(dst_data, sd_src->data, sd_src->size);
+ memcpy(sd_dst->data, sd_src->data, sd_src->size);
}
}
@@ -446,15 +446,16 @@ int enc_open(OutputStream *ost, AVFrame *frame)
*/
if (ist) {
int i;
- for (i = 0; i < ist->st->nb_side_data; i++) {
- AVPacketSideData *sd = &ist->st->side_data[i];
- if (sd->type != AV_PKT_DATA_CPB_PROPERTIES) {
- uint8_t *dst = av_stream_new_side_data(ost->st, sd->type, sd->size);
- if (!dst)
+ for (i = 0; i < ist->st->codecpar->side_data_set.nb_side_data; i++) {
+ AVPacketSideData *sd_src = &ist->st->codecpar->side_data_set.side_data[i];
+ if (sd_src->type != AV_PKT_DATA_CPB_PROPERTIES) {
+ AVPacketSideData *sd_dst = av_packet_new_side_data_to_set(&ost->par_in->side_data_set,
+ sd_src->type, sd_src->size);
+ if (!sd_dst)
return AVERROR(ENOMEM);
- memcpy(dst, sd->data, sd->size);
- if (ist->autorotate && sd->type == AV_PKT_DATA_DISPLAYMATRIX)
- av_display_rotation_set((int32_t *)dst, 0);
+ memcpy(sd_dst->data, sd_src->data, sd_src->size);
+ if (ist->autorotate && sd_src->type == AV_PKT_DATA_DISPLAYMATRIX)
+ av_display_rotation_set((int32_t *)sd_dst->data, 0);
}
}
}
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 925b5116cc..33bc96c8dd 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -1383,11 +1383,14 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
// TODO: insert hwaccel enabled filters like transpose_vaapi into the graph
if (ist->autorotate && !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
+ AVPacketSideData *sd = NULL;
int32_t *displaymatrix = ifp->displaymatrix;
double theta;
if (!ifp->displaymatrix_present)
- displaymatrix = (int32_t *)av_stream_get_side_data(ist->st, AV_PKT_DATA_DISPLAYMATRIX, NULL);
+ sd = av_packet_get_side_data_from_set(&ist->st->codecpar->side_data_set, AV_PKT_DATA_DISPLAYMATRIX);
+ if (sd)
+ displaymatrix = (int32_t *)sd->data;
theta = get_rotation(displaymatrix);
if (fabs(theta - 90) < 1.0) {
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 86521417ec..eb5dcf6543 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -1041,24 +1041,24 @@ static int streamcopy_init(const Muxer *mux, OutputStream *ost)
}
}
- for (int i = 0; i < ist->st->nb_side_data; i++) {
- const AVPacketSideData *sd_src = &ist->st->side_data[i];
- uint8_t *dst_data;
+ for (int i = 0; i < ist->st->codecpar->side_data_set.nb_side_data; i++) {
+ const AVPacketSideData *sd_src = &ist->st->codecpar->side_data_set.side_data[i];
+ AVPacketSideData *sd_dst;
- dst_data = av_stream_new_side_data(ost->st, sd_src->type, sd_src->size);
- if (!dst_data) {
+ sd_dst = av_packet_new_side_data_to_set(&ost->st->codecpar->side_data_set, sd_src->type, sd_src->size);
+ if (!sd_dst) {
ret = AVERROR(ENOMEM);
goto fail;
}
- memcpy(dst_data, sd_src->data, sd_src->size);
+ memcpy(sd_dst->data, sd_src->data, sd_src->size);
}
#if FFMPEG_ROTATION_METADATA
if (ost->rotate_overridden) {
- uint8_t *sd = av_stream_new_side_data(ost->st, AV_PKT_DATA_DISPLAYMATRIX,
+ AVPacketSideData *sd = av_packet_new_side_data_to_set(&ost->st->codecpar->side_data_set, AV_PKT_DATA_DISPLAYMATRIX,
sizeof(int32_t) * 9);
if (sd)
- av_display_rotation_set((int32_t *)sd, -ost->rotate_override_value);
+ av_display_rotation_set((int32_t *)sd->data, -ost->rotate_override_value);
}
#endif
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 05/13] fftools/ffplay: stop using AVStream.side_data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (2 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 04/13] fftools/ffmpeg: stop using AVStream.side_data James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 06/13] fftools/ffprobe: " James Almer
` (8 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
fftools/ffplay.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index 5212ad053e..c123511027 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -1904,8 +1904,12 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX);
if (sd)
displaymatrix = (int32_t *)sd->data;
- if (!displaymatrix)
- displaymatrix = (int32_t *)av_stream_get_side_data(is->video_st, AV_PKT_DATA_DISPLAYMATRIX, NULL);
+ if (!displaymatrix) {
+ AVPacketSideData *sd = av_packet_get_side_data_from_set(&is->video_st->codecpar->side_data_set,
+ AV_PKT_DATA_DISPLAYMATRIX);
+ if (sd)
+ displaymatrix = (int32_t *)sd->data;
+ }
theta = get_rotation(displaymatrix);
if (fabs(theta - 90) < 1.0) {
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 06/13] fftools/ffprobe: stop using AVStream.side_data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (3 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 05/13] fftools/ffplay: " James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data James Almer
` (7 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
fftools/ffprobe.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
index a39185f6fe..b60fd8eb1f 100644
--- a/fftools/ffprobe.c
+++ b/fftools/ffprobe.c
@@ -3186,8 +3186,9 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
if (do_show_stream_tags)
ret = show_tags(w, stream->metadata, in_program ? SECTION_ID_PROGRAM_STREAM_TAGS : SECTION_ID_STREAM_TAGS);
- if (stream->nb_side_data) {
- print_pkt_side_data(w, stream->codecpar, stream->side_data, stream->nb_side_data,
+ if (stream->codecpar->side_data_set.nb_side_data) {
+ print_pkt_side_data(w, stream->codecpar, stream->codecpar->side_data_set.side_data,
+ stream->codecpar->side_data_set.nb_side_data,
SECTION_ID_STREAM_SIDE_DATA_LIST,
SECTION_ID_STREAM_SIDE_DATA);
}
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (4 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 06/13] fftools/ffprobe: " James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-23 8:40 ` Andreas Rheinhardt
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 08/13] avcodec/decode: check for global side data " James Almer
` (6 subsequent siblings)
12 siblings, 1 reply; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/hevcdec.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index fcf19b4eb6..0d659e4c55 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -3403,8 +3403,12 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
}
sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
- if (sd && sd_size > 0)
+ if (sd && sd_size > 0) {
+ av_log(avctx, AV_LOG_WARNING,
+ "passing a DOVI configuration record through packet side data is "
+ "deprecated and will stop working soon. Use AVCodecContext side data\n");
ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd);
+ }
s->ref = NULL;
ret = decode_nal_units(s, avpkt->data, avpkt->size);
@@ -3707,12 +3711,18 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx)
atomic_init(&s->wpp_err, 0);
if (!avctx->internal->is_copy) {
+ AVPacketSideData *sd;
+
if (avctx->extradata_size > 0 && avctx->extradata) {
ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
if (ret < 0) {
return ret;
}
}
+
+ sd = av_packet_get_side_data_from_set(&avctx->side_data_set, AV_PKT_DATA_DOVI_CONF);
+ if (sd && sd->size > 0)
+ ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd->data);
}
return 0;
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 08/13] avcodec/decode: check for global side data in AVCodecContext side data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (5 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-23 12:57 ` [FFmpeg-devel] [PATCH v2 " James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 09/13] fftools/ffmpeg: stop injecting stream side data in packets James Almer
` (5 subsequent siblings)
12 siblings, 1 reply; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/decode.c | 56 +++++++++++++++++++++++++++++++++++++--------
libavcodec/decode.h | 2 +-
2 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index f0e6acc03e..66506b6dfb 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1396,25 +1396,30 @@ static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
return av_packet_unpack_dictionary(side_metadata, size, frame_md);
}
-int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
+static const struct {
+ enum AVPacketSideDataType packet;
+ enum AVFrameSideDataType frame;
+} sd_global_map[] = {
+ { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN },
+ { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL },
+ { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D },
+ { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
+ { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA },
+ { AV_PKT_DATA_CONTENT_LIGHT_LEVEL, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL },
+ { AV_PKT_DATA_ICC_PROFILE, AV_FRAME_DATA_ICC_PROFILE },
+ { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
+};
+
+int ff_decode_frame_props_from_pkt(AVCodecContext *avctx,
AVFrame *frame, const AVPacket *pkt)
{
static const struct {
enum AVPacketSideDataType packet;
enum AVFrameSideDataType frame;
} sd[] = {
- { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN },
- { AV_PKT_DATA_DISPLAYMATRIX, AV_FRAME_DATA_DISPLAYMATRIX },
- { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL },
- { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D },
- { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
- { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA },
- { AV_PKT_DATA_CONTENT_LIGHT_LEVEL, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL },
{ AV_PKT_DATA_A53_CC, AV_FRAME_DATA_A53_CC },
{ AV_PKT_DATA_AFD, AV_FRAME_DATA_AFD },
- { AV_PKT_DATA_ICC_PROFILE, AV_FRAME_DATA_ICC_PROFILE },
{ AV_PKT_DATA_S12M_TIMECODE, AV_FRAME_DATA_S12M_TIMECODE },
- { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
{ AV_PKT_DATA_SKIP_SAMPLES, AV_FRAME_DATA_SKIP_SAMPLES },
};
@@ -1427,6 +1432,23 @@ FF_DISABLE_DEPRECATION_WARNINGS
FF_ENABLE_DEPRECATION_WARNINGS
#endif
+ for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) {
+ size_t size;
+ uint8_t *packet_sd = av_packet_get_side_data(pkt, sd_global_map[i].packet, &size);
+ if (packet_sd) {
+ AVFrameSideData *frame_sd;
+
+ av_log(avctx, AV_LOG_WARNING,
+ "passing global side data through packet side data is "
+ "deprecated and will stop working soon. Use AVCodecContext side data\n");
+
+ av_frame_remove_side_data(frame, sd_global_map[i].frame);
+ frame_sd = av_frame_new_side_data(frame, sd_global_map[i].frame, size);
+ if (!frame_sd)
+ return AVERROR(ENOMEM);
+ memcpy(frame_sd->data, packet_sd, size);
+ }
+ }
for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
size_t size;
uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size);
@@ -1463,6 +1485,20 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
const AVPacket *pkt = avctx->internal->last_pkt_props;
int ret;
+ for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) {
+ AVPacketSideData *packet_sd = av_packet_get_side_data_from_set(&avctx->side_data_set,
+ sd_global_map[i].packet);
+ if (packet_sd) {
+ AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
+ sd_global_map[i].frame,
+ packet_sd->size);
+ if (!frame_sd)
+ return AVERROR(ENOMEM);
+
+ memcpy(frame_sd->data, packet_sd->data, packet_sd->size);
+ }
+ }
+
if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
ret = ff_decode_frame_props_from_pkt(avctx, frame, pkt);
if (ret < 0)
diff --git a/libavcodec/decode.h b/libavcodec/decode.h
index 2b9fe59907..0abbdf067c 100644
--- a/libavcodec/decode.h
+++ b/libavcodec/decode.h
@@ -67,7 +67,7 @@ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt);
/**
* Set various frame properties from the provided packet.
*/
-int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
+int ff_decode_frame_props_from_pkt(AVCodecContext *avctx,
AVFrame *frame, const AVPacket *pkt);
/**
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 09/13] fftools/ffmpeg: stop injecting stream side data in packets
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (6 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 08/13] avcodec/decode: check for global side data " James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 10/13] fftools/ffplay: " James Almer
` (4 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
This is no longer needed as the side data is available for decoders in the
AVCodecContext.
The tests affected reflect the removal of useless CPB and Stereo 3D side
data in packets.
Signed-off-by: James Almer <jamrial@gmail.com>
---
fftools/ffmpeg_demux.c | 22 -------------------
tests/ref/fate/autorotate | 4 ++--
tests/ref/fate/copy-trac3074 | 2 +-
tests/ref/fate/matroska-avoid-negative-ts | 2 +-
tests/ref/fate/matroska-dovi-write-config7 | 2 +-
tests/ref/fate/matroska-dovi-write-config8 | 2 +-
tests/ref/fate/matroska-encoding-delay | 2 +-
.../fate/matroska-mastering-display-metadata | 4 ++--
tests/ref/fate/matroska-spherical-mono-remux | 4 ++--
tests/ref/fate/matroska-vp8-alpha-remux | 2 +-
.../ref/fate/mov-mp4-disposition-mpegts-remux | 4 ++--
| 2 +-
tests/ref/fate/mxf-remux-applehdr10 | 2 +-
tests/ref/fate/vp9-superframe-bsf | 2 +-
14 files changed, 17 insertions(+), 39 deletions(-)
diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
index f984df7c95..16519b4b2b 100644
--- a/fftools/ffmpeg_demux.c
+++ b/fftools/ffmpeg_demux.c
@@ -480,28 +480,6 @@ static int input_packet_process(Demuxer *d, DemuxMsg *msg, AVPacket *src)
ds->data_size += pkt->size;
ds->nb_packets++;
- /* add the stream-global side data to the first packet */
- if (ds->nb_packets == 1) {
- for (int i = 0; i < ist->st->codecpar->side_data_set.nb_side_data; i++) {
- AVPacketSideData *src_sd = &ist->st->codecpar->side_data_set.side_data[i];
- uint8_t *dst_data;
-
- if (src_sd->type == AV_PKT_DATA_DISPLAYMATRIX)
- continue;
-
- if (av_packet_get_side_data(pkt, src_sd->type, NULL))
- continue;
-
- dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
- if (!dst_data) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
-
- memcpy(dst_data, src_sd->data, src_sd->size);
- }
- }
-
if (debug_ts) {
av_log(NULL, AV_LOG_INFO, "demuxer+ffmpeg -> ist_index:%d:%d type:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s off:%s off_time:%s\n",
f->index, pkt->stream_index,
diff --git a/tests/ref/fate/autorotate b/tests/ref/fate/autorotate
index dff628bbff..2aa29fafa7 100644
--- a/tests/ref/fate/autorotate
+++ b/tests/ref/fate/autorotate
@@ -11,8 +11,8 @@
#codec_id 1: ac3
#sample_rate 1: 44100
#channel_layout_name 1: mono
-0, -512, 0, 512, 6997, 0x55c700f6, S=1, 40
-1, -256, -256, 1536, 416, 0x92ddc529, S=2, 10, 4
+0, -512, 0, 512, 6997, 0x55c700f6
+1, -256, -256, 1536, 416, 0x92ddc529, S=1, 10
0, 0, 512, 512, 4847, 0xe74f522e, F=0x0
1, 1280, 1280, 1536, 418, 0x0a7fcd2d
0, 512, 1024, 512, 5281, 0xbd4a5dac, F=0x0
diff --git a/tests/ref/fate/copy-trac3074 b/tests/ref/fate/copy-trac3074
index b6d23f8c1c..53ba27e920 100644
--- a/tests/ref/fate/copy-trac3074
+++ b/tests/ref/fate/copy-trac3074
@@ -5,7 +5,7 @@
#codec_id 0: eac3
#sample_rate 0: 48000
#channel_layout_name 0: stereo
-0, 0, 0, 1536, 512, 0x2beaf79f, S=1, 4
+0, 0, 0, 1536, 512, 0x2beaf79f
0, 1536, 1536, 1536, 512, 0x29ddf9d6
0, 3072, 3072, 1536, 512, 0xba0afa79
0, 4608, 4608, 1536, 512, 0xe019f394
diff --git a/tests/ref/fate/matroska-avoid-negative-ts b/tests/ref/fate/matroska-avoid-negative-ts
index dcde937d52..aabc741827 100644
--- a/tests/ref/fate/matroska-avoid-negative-ts
+++ b/tests/ref/fate/matroska-avoid-negative-ts
@@ -11,7 +11,7 @@
#codec_id 1: mp3
#sample_rate 1: 44100
#channel_layout_name 1: mono
-0, -37, 43, 40, 9156, 0xe5bd034a, S=1, 40
+0, -37, 43, 40, 9156, 0xe5bd034a
1, 0, 0, 26, 417, 0x7198c15e
0, 3, 3, 40, 1740, 0x29ac4480, F=0x0
1, 26, 26, 26, 417, 0x3c67c32d
diff --git a/tests/ref/fate/matroska-dovi-write-config7 b/tests/ref/fate/matroska-dovi-write-config7
index ef4c87d885..a2f106340d 100644
--- a/tests/ref/fate/matroska-dovi-write-config7
+++ b/tests/ref/fate/matroska-dovi-write-config7
@@ -13,7 +13,7 @@
#dimensions 1: 1920x1080
#sar 1: 0/1
0, -83, 0, 41, 699, 0x728548f1
-1, -83, 0, 41, 1085, 0xfb2dba82, S=1, 8
+1, -83, 0, 41, 1085, 0xfb2dba82
0, -42, 167, 41, 95, 0xc0312044, F=0x0
1, -42, 167, 41, 481, 0xf23f91d5, F=0x0
0, 0, 83, 41, 99, 0x5e0a2221, F=0x0
diff --git a/tests/ref/fate/matroska-dovi-write-config8 b/tests/ref/fate/matroska-dovi-write-config8
index bb22563eee..cfde9d860c 100644
--- a/tests/ref/fate/matroska-dovi-write-config8
+++ b/tests/ref/fate/matroska-dovi-write-config8
@@ -12,7 +12,7 @@
#codec_id 1: aac
#sample_rate 1: 44100
#channel_layout_name 1: stereo
-0, -67, 0, 33, 63375, 0xc76606ab, S=1, 8
+0, -67, 0, 33, 63375, 0xc76606ab
0, -34, 133, 33, 46706, 0x0e08a7e5, F=0x0
0, 0, 67, 33, 29766, 0x753c031a, F=0x0
1, 0, 0, 23, 6, 0x031e0108
diff --git a/tests/ref/fate/matroska-encoding-delay b/tests/ref/fate/matroska-encoding-delay
index 437992468d..f8b12cca6f 100644
--- a/tests/ref/fate/matroska-encoding-delay
+++ b/tests/ref/fate/matroska-encoding-delay
@@ -12,7 +12,7 @@
#sample_rate 1: 48000
#channel_layout_name 1: stereo
1, -10, -10, 24, 1152, 0x724077b8
-0, 0, 0, 40, 237628, 0xeff25579, S=1, 40
+0, 0, 0, 40, 237628, 0xeff25579
1, 14, 14, 24, 1152, 0x80625572
1, 38, 38, 24, 1152, 0x7d7f4dce
0, 40, 40, 40, 238066, 0xb2265f41
diff --git a/tests/ref/fate/matroska-mastering-display-metadata b/tests/ref/fate/matroska-mastering-display-metadata
index c63365c181..6eb4a1e0fa 100644
--- a/tests/ref/fate/matroska-mastering-display-metadata
+++ b/tests/ref/fate/matroska-mastering-display-metadata
@@ -22,9 +22,9 @@ a4924bfe22ed0c72b0eddc353bbee10c *tests/data/fate/matroska-mastering-display-met
#codec_id 3: ffv1
#dimensions 3: 1280x720
#sar 3: 1/1
-0, 0, 0, 16, 57008, 0x43416399, S=2, 8, 88
+0, 0, 0, 16, 57008, 0x43416399
1, 0, 0, 16, 2403, 0xaa818522
-3, 0, 0, 16, 274117, 0xc439610f, S=2, 8, 88
+3, 0, 0, 16, 274117, 0xc439610f
0, 17, 17, 16, 57248, 0xa06cd7b5
1, 17, 17, 16, 2403, 0xe1a991e5
2, 17, 17, 16, 1602, 0x5d868171
diff --git a/tests/ref/fate/matroska-spherical-mono-remux b/tests/ref/fate/matroska-spherical-mono-remux
index 0940e3ea86..61e8447a96 100644
--- a/tests/ref/fate/matroska-spherical-mono-remux
+++ b/tests/ref/fate/matroska-spherical-mono-remux
@@ -12,8 +12,8 @@
#codec_id 1: h264
#dimensions 1: 1920x1080
#sar 1: 0/1
-0, -80, 0, 40, 69118, 0x73cb52f0, S=2, 12, 36
-1, -80, 0, 40, 69118, 0x73cb52f0, S=2, 12, 36
+0, -80, 0, 40, 69118, 0x73cb52f0
+1, -80, 0, 40, 69118, 0x73cb52f0
0, -40, 160, 40, 1103, 0x082a059f, F=0x0
1, -40, 160, 40, 1103, 0x082a059f, F=0x0
[STREAM]
diff --git a/tests/ref/fate/matroska-vp8-alpha-remux b/tests/ref/fate/matroska-vp8-alpha-remux
index 86024b3477..14f3efc895 100644
--- a/tests/ref/fate/matroska-vp8-alpha-remux
+++ b/tests/ref/fate/matroska-vp8-alpha-remux
@@ -5,7 +5,7 @@
#codec_id 0: vp8
#dimensions 0: 320x213
#sar 0: 1/1
-0, 0, 0, 33, 2108, 0x59b92a34, S=2, 1900, 12
+0, 0, 0, 33, 2108, 0x59b92a34, S=1, 1900
0, 32, 32, 33, 142, 0x2f2a3fed, F=0x0, S=1, 160
0, 65, 65, 33, 157, 0x17804767, F=0x0, S=1, 209
0, 99, 99, 33, 206, 0x537262ca, F=0x0, S=1, 317
diff --git a/tests/ref/fate/mov-mp4-disposition-mpegts-remux b/tests/ref/fate/mov-mp4-disposition-mpegts-remux
index efef043074..ba419843dc 100644
--- a/tests/ref/fate/mov-mp4-disposition-mpegts-remux
+++ b/tests/ref/fate/mov-mp4-disposition-mpegts-remux
@@ -10,9 +10,9 @@ adb3b95c07a5f3e0c86641dd62f01dae *tests/data/fate/mov-mp4-disposition-mpegts-rem
#codec_id 1: ac3
#sample_rate 1: 48000
#channel_layout_name 1: stereo
-1, 0, 0, 1536, 768, 0xa63778d4, S=1, 4
+1, 0, 0, 1536, 768, 0xa63778d4
1, 1536, 1536, 1536, 768, 0x7d577f3f
-0, 3072, 3072, 1536, 768, 0xc2867884, S=1, 4
+0, 3072, 3072, 1536, 768, 0xc2867884
1, 3072, 3072, 1536, 768, 0xd86b7c8f
0, 4608, 4608, 1536, 690, 0xa2714bf3
1, 4608, 4608, 1536, 626, 0x09f4382f
--git a/tests/ref/fate/mxf-d10-user-comments b/tests/ref/fate/mxf-d10-user-comments
index 1b59beec7c..ccfdc83f11 100644
--- a/tests/ref/fate/mxf-d10-user-comments
+++ b/tests/ref/fate/mxf-d10-user-comments
@@ -6,7 +6,7 @@
#codec_id 0: mpeg2video
#dimensions 0: 1280x720
#sar 0: 3/4
-0, -1, 0, 1, 150000, 0x0547870d, S=1, 40
+0, -1, 0, 1, 150000, 0x0547870d
0, 0, 1, 1, 150000, 0xe80a1612, F=0x0
0, 1, 2, 1, 150000, 0xc5c50e2f, F=0x0
0, 2, 3, 1, 150000, 0x51e28a04, F=0x0
diff --git a/tests/ref/fate/mxf-remux-applehdr10 b/tests/ref/fate/mxf-remux-applehdr10
index 29e0e03a72..9fbf8b60c7 100644
--- a/tests/ref/fate/mxf-remux-applehdr10
+++ b/tests/ref/fate/mxf-remux-applehdr10
@@ -10,7 +10,7 @@
#codec_id 1: pcm_s24le
#sample_rate 1: 48000
#channel_layout_name 1: mono
-0, 0, 0, 1, 57008, 0x43416399, S=1, 88
+0, 0, 0, 1, 57008, 0x43416399
1, 0, 0, 801, 2403, 0x00000000
0, 1, 1, 1, 57248, 0xa06cd7b5
1, 801, 801, 801, 2403, 0x00000000
diff --git a/tests/ref/fate/vp9-superframe-bsf b/tests/ref/fate/vp9-superframe-bsf
index d7985c6973..485644dfb2 100644
--- a/tests/ref/fate/vp9-superframe-bsf
+++ b/tests/ref/fate/vp9-superframe-bsf
@@ -3,7 +3,7 @@
#codec_id 0: vp9
#dimensions 0: 352x288
#sar 0: 1/1
-0, 0, 0, 33, 6958, 0x38e58ee6, S=1, 12
+0, 0, 0, 33, 6958, 0x38e58ee6
0, 33, 33, 33, 852, 0x3edf9ed0, F=0x0
0, 66, 66, 33, 27, 0x62d007e5, F=0x0
0, 100, 100, 33, 25, 0x51980749, F=0x0
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 10/13] fftools/ffplay: stop injecting stream side data in packets
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (7 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 09/13] fftools/ffmpeg: stop injecting stream side data in packets James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 11/13] avcodec/avcodec: deprecate coded_side_data James Almer
` (3 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
This is no longer needed as the side data is available for decoders in the
AVCodecContext.
Signed-off-by: James Almer <jamrial@gmail.com>
---
fftools/ffplay.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index c123511027..e902ba0f6b 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -2781,8 +2781,6 @@ static int read_thread(void *arg)
if (genpts)
ic->flags |= AVFMT_FLAG_GENPTS;
- av_format_inject_global_side_data(ic);
-
if (find_stream_info) {
AVDictionary **opts;
int orig_nb_streams = ic->nb_streams;
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 11/13] avcodec/avcodec: deprecate coded_side_data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (8 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 10/13] fftools/ffplay: " James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 12/13] avformat/demux: stop copying the internal AVCodecContext coded_side_data James Almer
` (2 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
In favor of AVCodecContext.side_data_set
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/avcodec.c | 34 ++++++++++++++++++++++++++++++++++
libavcodec/avcodec.h | 7 ++++++-
libavcodec/utils.c | 24 +++++++++---------------
libavcodec/version_major.h | 1 +
4 files changed, 50 insertions(+), 16 deletions(-)
diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 16869e97f2..2b9de43c78 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -334,6 +334,36 @@ FF_ENABLE_DEPRECATION_WARNINGS
avci->needs_close = 1;
}
+#if FF_API_CODED_SIDE_DATA
+FF_DISABLE_DEPRECATION_WARNINGS
+ if (av_codec_is_encoder(avctx->codec)) {
+ const AVPacketSideData *sd =
+ av_packet_get_side_data_from_set(&avctx->side_data_set, 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;
+ }
+ }
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
ret=0;
if (av_codec_is_decoder(avctx->codec)) {
@@ -469,10 +499,14 @@ av_cold int avcodec_close(AVCodecContext *avctx)
av_packet_free_side_data_set(&avctx->side_data_set);
+#if FF_API_CODED_SIDE_DATA
+FF_DISABLE_DEPRECATION_WARNINGS
for (i = 0; i < avctx->nb_coded_side_data; i++)
av_freep(&avctx->coded_side_data[i].data);
av_freep(&avctx->coded_side_data);
avctx->nb_coded_side_data = 0;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
av_buffer_unref(&avctx->hw_frames_ctx);
av_buffer_unref(&avctx->hw_device_ctx);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 2902ecf6cb..ba6cfc09a0 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1892,14 +1892,19 @@ typedef struct AVCodecContext {
#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002
#define FF_CODEC_PROPERTY_FILM_GRAIN 0x00000004
+#if FF_API_CODED_SIDE_DATA
/**
* Additional data associated with the entire coded stream.
*
* - decoding: unused
* - encoding: may be set by libavcodec after avcodec_open2().
+ * @deprecated use side_data_set
*/
+ attribute_deprecated
AVPacketSideData *coded_side_data;
+ attribute_deprecated
int nb_coded_side_data;
+#endif
/**
* A reference to the AVHWFramesContext describing the input (for encoding)
@@ -2107,7 +2112,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 side_data_set;
} AVCodecContext;
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 672eb15d98..01223de707 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1048,32 +1048,26 @@ AVCPBProperties *av_cpb_properties_alloc(size_t *size)
AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx)
{
- AVPacketSideData *tmp;
+ AVPacketSideData *sd;
AVCPBProperties *props;
size_t size;
- int i;
+ int ret;
- 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;
+ sd = av_packet_get_side_data_from_set(&avctx->side_data_set, AV_PKT_DATA_CPB_PROPERTIES);
+ if (sd)
+ return (AVCPBProperties *)sd->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);
+ ret = av_packet_add_side_data_to_set(&avctx->side_data_set, AV_PKT_DATA_CPB_PROPERTIES,
+ (uint8_t *)props, size);
+ if (ret < 0) {
+ av_free(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;
}
diff --git a/libavcodec/version_major.h b/libavcodec/version_major.h
index 95c5aec0c5..7b01300c4a 100644
--- a/libavcodec/version_major.h
+++ b/libavcodec/version_major.h
@@ -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)
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 12/13] avformat/demux: stop copying the internal AVCodecContext coded_side_data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (9 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 11/13] avcodec/avcodec: deprecate coded_side_data James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 13/13] fftools: stop propagating the encoder's coded_side_data James Almer
2023-07-22 22:49 ` [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
It's no longer needed
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/demux.c | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/libavformat/demux.c b/libavformat/demux.c
index 7253196a82..24bc8fce2a 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -2432,19 +2432,6 @@ static int extract_extradata(FFFormatContext *si, AVStream *st, const AVPacket *
return 0;
}
-static int add_coded_side_data(AVStream *st, AVCodecContext *avctx)
-{
- for (int i = 0; i < avctx->nb_coded_side_data; i++) {
- const AVPacketSideData *const sd_src = &avctx->coded_side_data[i];
- AVPacketSideData *sd_dst = av_packet_new_side_data_to_set(&st->codecpar->side_data_set,
- sd_src->type, sd_src->size);
- if (!sd_dst)
- return AVERROR(ENOMEM);
- memcpy(sd_dst->data, sd_src->data, sd_src->size);
- }
- return 0;
-}
-
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
{
FFFormatContext *const si = ffformatcontext(ic);
@@ -2972,9 +2959,6 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
ret = avcodec_parameters_from_context(st->codecpar, sti->avctx);
if (ret < 0)
goto find_stream_info_err;
- ret = add_coded_side_data(st, sti->avctx);
- if (ret < 0)
- goto find_stream_info_err;
}
#if FF_API_AVSTREAM_SIDE_DATA
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH 13/13] fftools: stop propagating the encoder's coded_side_data
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (10 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 12/13] avformat/demux: stop copying the internal AVCodecContext coded_side_data James Almer
@ 2023-07-20 20:34 ` James Almer
2023-07-22 22:49 ` [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-20 20:34 UTC (permalink / raw)
To: ffmpeg-devel
It's no longer needed
Signed-off-by: James Almer <jamrial@gmail.com>
---
fftools/ffmpeg_enc.c | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c
index f12024dff5..7efbfdafb3 100644
--- a/fftools/ffmpeg_enc.c
+++ b/fftools/ffmpeg_enc.c
@@ -423,20 +423,6 @@ int enc_open(OutputStream *ost, AVFrame *frame)
return ret;
}
- if (ost->enc_ctx->nb_coded_side_data) {
- int i;
-
- for (i = 0; i < ost->enc_ctx->nb_coded_side_data; i++) {
- const AVPacketSideData *sd_src = &ost->enc_ctx->coded_side_data[i];
- AVPacketSideData *sd_dst;
-
- sd_dst = av_packet_new_side_data_to_set(&ost->par_in->side_data_set, sd_src->type, sd_src->size);
- if (!sd_dst)
- return AVERROR(ENOMEM);
- memcpy(sd_dst->data, sd_src->data, sd_src->size);
- }
- }
-
/*
* Add global input side data. For now this is naive, and copies it
* from the input stream's global side data. All side data should
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
` (11 preceding siblings ...)
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 13/13] fftools: stop propagating the encoder's coded_side_data James Almer
@ 2023-07-22 22:49 ` James Almer
12 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-22 22:49 UTC (permalink / raw)
To: ffmpeg-devel
On 7/20/2023 5:34 PM, James Almer wrote:
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavcodec/avcodec.c | 2 ++
> libavcodec/avcodec.h | 8 +++++
> libavcodec/avpacket.c | 84 +++++++++++++++++++++++++++++++++++++++++++
> libavcodec/packet.h | 54 ++++++++++++++++++++++++++++
> 4 files changed, 148 insertions(+)
>
> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
> index 340abe830e..16869e97f2 100644
> --- a/libavcodec/avcodec.c
> +++ b/libavcodec/avcodec.c
> @@ -467,6 +467,8 @@ av_cold int avcodec_close(AVCodecContext *avctx)
> av_freep(&avctx->internal);
> }
>
> + av_packet_free_side_data_set(&avctx->side_data_set);
> +
> for (i = 0; i < avctx->nb_coded_side_data; i++)
> av_freep(&avctx->coded_side_data[i].data);
> av_freep(&avctx->coded_side_data);
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index fe41ecc3c9..2902ecf6cb 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -2102,6 +2102,14 @@ typedef struct AVCodecContext {
> * an error.
> */
> int64_t frame_num;
> +
> + /**
> + * Additional data associated with the entire stream.
> + *
> + * - decoding: set by user
> + * - encoding: unused
> + */
> + AVPacketSideDataSet side_data_set;
This name is also used in a patchset by Jan Ekström that added a similar
struct but for AVFrameSideData. I used it here for this first iteration,
but if his patchset also goes in, we need non conflicting names.
> } AVCodecContext;
>
> /**
> diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
> index 5fef65e97a..f569731403 100644
> --- a/libavcodec/avpacket.c
> +++ b/libavcodec/avpacket.c
> @@ -645,3 +645,87 @@ int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp)
>
> return 0;
> }
> +
> +AVPacketSideData *av_packet_get_side_data_from_set(const AVPacketSideDataSet *set,
> + enum AVPacketSideDataType type)
> +{
> + for (int i = 0; i < set->nb_side_data; i++)
> + if (set->side_data[i].type == type)
> + return &set->side_data[i];
> +
> + return NULL;
> +}
> +
> +static int add_side_data_to_set(AVPacketSideDataSet *set,
> + AVPacketSideData **psd,
> + enum AVPacketSideDataType type,
> + uint8_t *data, size_t size)
> +{
> + AVPacketSideData *sd, *tmp;
> +
> + for (int i = 0; i < set->nb_side_data; i++) {
> + sd = &set->side_data[i];
> +
> + if (sd->type == type) {
> + av_freep(&sd->data);
> + sd->data = data;
> + sd->size = size;
> + *psd = sd;
> + return 0;
> + }
> + }
> +
> + if (set->nb_side_data + 1U > FFMIN(INT_MAX, SIZE_MAX / sizeof(*tmp)))
> + return AVERROR(ERANGE);
> +
> + tmp = av_realloc_array(set->side_data, set->nb_side_data + 1, sizeof(*tmp));
> + if (!tmp)
> + return AVERROR(ENOMEM);
> +
> + set->side_data = tmp;
> + set->nb_side_data++;
> +
> + sd = &set->side_data[set->nb_side_data - 1];
> + sd->type = type;
> + sd->data = data;
> + sd->size = size;
> + *psd = sd;
> +
> + return 0;
> +}
> +
> +int av_packet_add_side_data_to_set(AVPacketSideDataSet *set,
> + enum AVPacketSideDataType type,
> + uint8_t *data, size_t size)
> +{
> + AVPacketSideData *sd;
> +
> + return add_side_data_to_set(set, &sd, type, data, size);
> +}
> +
> +AVPacketSideData *av_packet_new_side_data_to_set(AVPacketSideDataSet *set,
> + enum AVPacketSideDataType type,
> + size_t size)
> +{
> + AVPacketSideData *sd = NULL;
> + uint8_t *data = av_malloc(size);
> + int ret;
> +
> + if (!data)
> + return NULL;
> +
> + ret = add_side_data_to_set(set, &sd, type, data, size);
> + if (ret < 0)
> + av_freep(&data);
> +
> + return sd;
> +}
> +
> +void av_packet_free_side_data_set(AVPacketSideDataSet *set)
> +{
> + int i;
> + for (i = 0; i < set->nb_side_data; i++)
> + av_freep(&set->side_data[i].data);
> + av_freep(&set->side_data);
> + set->nb_side_data = 0;
> +}
> diff --git a/libavcodec/packet.h b/libavcodec/packet.h
> index f28e7e7011..590c2bf15a 100644
> --- a/libavcodec/packet.h
> +++ b/libavcodec/packet.h
> @@ -318,6 +318,14 @@ typedef struct AVPacketSideData {
> enum AVPacketSideDataType type;
> } AVPacketSideData;
>
> +/**
> + * Structure to hold a set of AVPacketSideDataSet
> + */
> +typedef struct AVPacketSideDataSet {
> + AVPacketSideData *side_data;
I can alternatively make this pointer to pointer, to be in line with
AVFrameSideData in AVFrame. It would make it simple to add a function to
remove a single entry from the array, but it may not be worth the extra
allocation overhead.
> + int nb_side_data;
> +} AVPacketSideDataSet;
The reason i introduced this struct is to simplify the helper functions
defined below, to be generic and usable for both the avctx and codecpar
side data arrays also introduced in this patchset.
I was told said helpers could take a pointer to pointer to
AVPacketSideData and a pointer to a size_t, essentially emulating the
struct as separate function arguments, but personally i find that pretty
ugly.
In the long run, AVPacket could use this struct too, to make it
consistent across the codebase. It would give us the chance to make
packet side data reference counted too, as we can't expect existing
users to change how they currently access avpacket->side_data, but
that's a discussion for another time.
> +
> /**
> * This structure stores compressed data. It is typically exported by demuxers
> * and then passed as input to decoders, or received as output from encoders and
> @@ -724,6 +732,52 @@ int av_packet_make_writable(AVPacket *pkt);
> */
> void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
>
> +/**
> + * Allocate a new side data entry into to a set.
> + *
> + * @param set a set to which the side data should be added
> + * @param type side data type
> + * @param size side data size
> + * @return pointer to freshly allocated side data entry or NULL otherwise.
> + */
> +AVPacketSideData *av_packet_new_side_data_to_set(AVPacketSideDataSet *set,
> + enum AVPacketSideDataType type,
> + size_t size);
Alternatively, these functions could be
av_packet_side_data_{new,add,get}(), to use a new namespace based on the
new struct. Opinions welcome.
> +
> +/**
> + * Wrap an existing array as a packet side data into a set.
> + *
> + * @param set a set to which the side data should be added
> + * @param type side information type
> + * @param data the side data array. It must be allocated with the av_malloc()
> + * family of functions. The ownership of the data is transferred to
> + * pkt.
> + * @param size side information size
> + * @return a non-negative number on success, a negative AVERROR code on
> + * failure. On failure, the set is unchanged and the data remains
> + * owned by the caller.
> + */
> +int av_packet_add_side_data_to_set(AVPacketSideDataSet *set,
> + enum AVPacketSideDataType type,
> + uint8_t *data, size_t size);
> +
> +/**
> + * Get side information from set.
> + *
> + * @param set a set from which the side data should be fetched
> + * @param type desired side information type
> + * @return pointer to side data if present or NULL otherwise
> + */
> +AVPacketSideData *av_packet_get_side_data_from_set(const AVPacketSideDataSet *set,
> + enum AVPacketSideDataType type);
> +
> +/**
> + * Convenience function to free all the side data stored in a set.
> + *
> + * @param set a set
> + */
> +void av_packet_free_side_data_set(AVPacketSideDataSet *set);
> +
> /**
> * @}
> */
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data James Almer
@ 2023-07-23 8:40 ` Andreas Rheinhardt
2023-07-23 11:48 ` James Almer
0 siblings, 1 reply; 20+ messages in thread
From: Andreas Rheinhardt @ 2023-07-23 8:40 UTC (permalink / raw)
To: ffmpeg-devel
James Almer:
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavcodec/hevcdec.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
> index fcf19b4eb6..0d659e4c55 100644
> --- a/libavcodec/hevcdec.c
> +++ b/libavcodec/hevcdec.c
> @@ -3403,8 +3403,12 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
> }
>
> sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
> - if (sd && sd_size > 0)
> + if (sd && sd_size > 0) {
> + av_log(avctx, AV_LOG_WARNING,
> + "passing a DOVI configuration record through packet side data is "
> + "deprecated and will stop working soon. Use AVCodecContext side data\n");
Doesn't this remove functionality that might be useful to some users
(namely the functionality to send new DOVI metadata)?
> ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd);
> + }
>
> s->ref = NULL;
> ret = decode_nal_units(s, avpkt->data, avpkt->size);
> @@ -3707,12 +3711,18 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx)
> atomic_init(&s->wpp_err, 0);
>
> if (!avctx->internal->is_copy) {
> + AVPacketSideData *sd;
> +
> if (avctx->extradata_size > 0 && avctx->extradata) {
> ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
> if (ret < 0) {
> return ret;
> }
> }
> +
> + sd = av_packet_get_side_data_from_set(&avctx->side_data_set, AV_PKT_DATA_DOVI_CONF);
> + if (sd && sd->size > 0)
> + ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd->data);
> }
>
> return 0;
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data
2023-07-23 8:40 ` Andreas Rheinhardt
@ 2023-07-23 11:48 ` James Almer
2023-07-23 12:17 ` Andreas Rheinhardt
0 siblings, 1 reply; 20+ messages in thread
From: James Almer @ 2023-07-23 11:48 UTC (permalink / raw)
To: ffmpeg-devel
On 7/23/2023 5:40 AM, Andreas Rheinhardt wrote:
> James Almer:
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>> libavcodec/hevcdec.c | 12 +++++++++++-
>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
>> index fcf19b4eb6..0d659e4c55 100644
>> --- a/libavcodec/hevcdec.c
>> +++ b/libavcodec/hevcdec.c
>> @@ -3403,8 +3403,12 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
>> }
>>
>> sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
>> - if (sd && sd_size > 0)
>> + if (sd && sd_size > 0) {
>> + av_log(avctx, AV_LOG_WARNING,
>> + "passing a DOVI configuration record through packet side data is "
>> + "deprecated and will stop working soon. Use AVCodecContext side data\n");
>
> Doesn't this remove functionality that might be useful to some users
> (namely the functionality to send new DOVI metadata)?
Is this a valid scenario? lavf only exports this side data during
read_header(). A change in DOVI profile would mean a brand new CVS, and
afaik we require a new decoder to be fired up for this.
>
>> ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd);
>> + }
>>
>> s->ref = NULL;
>> ret = decode_nal_units(s, avpkt->data, avpkt->size);
>> @@ -3707,12 +3711,18 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx)
>> atomic_init(&s->wpp_err, 0);
>>
>> if (!avctx->internal->is_copy) {
>> + AVPacketSideData *sd;
>> +
>> if (avctx->extradata_size > 0 && avctx->extradata) {
>> ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
>> if (ret < 0) {
>> return ret;
>> }
>> }
>> +
>> + sd = av_packet_get_side_data_from_set(&avctx->side_data_set, AV_PKT_DATA_DOVI_CONF);
>> + if (sd && sd->size > 0)
>> + ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd->data);
>> }
>>
>> return 0;
>
> _______________________________________________
> 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".
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data
2023-07-23 11:48 ` James Almer
@ 2023-07-23 12:17 ` Andreas Rheinhardt
2023-07-23 12:22 ` James Almer
2023-07-23 12:56 ` [FFmpeg-devel] [PATCH v2 " James Almer
0 siblings, 2 replies; 20+ messages in thread
From: Andreas Rheinhardt @ 2023-07-23 12:17 UTC (permalink / raw)
To: ffmpeg-devel
James Almer:
> On 7/23/2023 5:40 AM, Andreas Rheinhardt wrote:
>> James Almer:
>>> Signed-off-by: James Almer <jamrial@gmail.com>
>>> ---
>>> libavcodec/hevcdec.c | 12 +++++++++++-
>>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
>>> index fcf19b4eb6..0d659e4c55 100644
>>> --- a/libavcodec/hevcdec.c
>>> +++ b/libavcodec/hevcdec.c
>>> @@ -3403,8 +3403,12 @@ static int hevc_decode_frame(AVCodecContext
>>> *avctx, AVFrame *rframe,
>>> }
>>> sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF,
>>> &sd_size);
>>> - if (sd && sd_size > 0)
>>> + if (sd && sd_size > 0) {
>>> + av_log(avctx, AV_LOG_WARNING,
>>> + "passing a DOVI configuration record through packet
>>> side data is "
>>> + "deprecated and will stop working soon. Use
>>> AVCodecContext side data\n");
>>
>> Doesn't this remove functionality that might be useful to some users
>> (namely the functionality to send new DOVI metadata)?
>
> Is this a valid scenario? lavf only exports this side data during
> read_header(). A change in DOVI profile would mean a brand new CVS, and
> afaik we require a new decoder to be fired up for this.
>
Since when do we require this? I always thought that both H.264 and HEVC
decoders are supposed to allow new in-band extradata at any time.
>>
>>> ff_dovi_update_cfg(&s->dovi_ctx,
>>> (AVDOVIDecoderConfigurationRecord *) sd);
>>> + }
>>> s->ref = NULL;
>>> ret = decode_nal_units(s, avpkt->data, avpkt->size);
>>> @@ -3707,12 +3711,18 @@ static av_cold int
>>> hevc_decode_init(AVCodecContext *avctx)
>>> atomic_init(&s->wpp_err, 0);
>>> if (!avctx->internal->is_copy) {
>>> + AVPacketSideData *sd;
>>> +
>>> if (avctx->extradata_size > 0 && avctx->extradata) {
>>> ret = hevc_decode_extradata(s, avctx->extradata,
>>> avctx->extradata_size, 1);
>>> if (ret < 0) {
>>> return ret;
>>> }
>>> }
>>> +
>>> + sd = av_packet_get_side_data_from_set(&avctx->side_data_set,
>>> AV_PKT_DATA_DOVI_CONF);
>>> + if (sd && sd->size > 0)
>>> + ff_dovi_update_cfg(&s->dovi_ctx,
>>> (AVDOVIDecoderConfigurationRecord *) sd->data);
>>> }
>>> return 0;
>>
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data
2023-07-23 12:17 ` Andreas Rheinhardt
@ 2023-07-23 12:22 ` James Almer
2023-07-23 12:56 ` [FFmpeg-devel] [PATCH v2 " James Almer
1 sibling, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-23 12:22 UTC (permalink / raw)
To: ffmpeg-devel
On 7/23/2023 9:17 AM, Andreas Rheinhardt wrote:
> James Almer:
>> On 7/23/2023 5:40 AM, Andreas Rheinhardt wrote:
>>> James Almer:
>>>> Signed-off-by: James Almer <jamrial@gmail.com>
>>>> ---
>>>> libavcodec/hevcdec.c | 12 +++++++++++-
>>>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
>>>> index fcf19b4eb6..0d659e4c55 100644
>>>> --- a/libavcodec/hevcdec.c
>>>> +++ b/libavcodec/hevcdec.c
>>>> @@ -3403,8 +3403,12 @@ static int hevc_decode_frame(AVCodecContext
>>>> *avctx, AVFrame *rframe,
>>>> }
>>>> sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF,
>>>> &sd_size);
>>>> - if (sd && sd_size > 0)
>>>> + if (sd && sd_size > 0) {
>>>> + av_log(avctx, AV_LOG_WARNING,
>>>> + "passing a DOVI configuration record through packet
>>>> side data is "
>>>> + "deprecated and will stop working soon. Use
>>>> AVCodecContext side data\n");
>>>
>>> Doesn't this remove functionality that might be useful to some users
>>> (namely the functionality to send new DOVI metadata)?
>>
>> Is this a valid scenario? lavf only exports this side data during
>> read_header(). A change in DOVI profile would mean a brand new CVS, and
>> afaik we require a new decoder to be fired up for this.
>>
>
> Since when do we require this? I always thought that both H.264 and HEVC
> decoders are supposed to allow new in-band extradata at any time.
This is not something that would get propagated as new extradata type
side data, though. That's limited to new SPS/PPS/VPS.
I nonetheless agree that this was supported until now, and it suddenly
not working anymore when flushing the decoder and start decoding a new
CVS without closing the avctx may be possible is not nice, so I'll
remove this log message.
>
>>>
>>>> ff_dovi_update_cfg(&s->dovi_ctx,
>>>> (AVDOVIDecoderConfigurationRecord *) sd);
>>>> + }
>>>> s->ref = NULL;
>>>> ret = decode_nal_units(s, avpkt->data, avpkt->size);
>>>> @@ -3707,12 +3711,18 @@ static av_cold int
>>>> hevc_decode_init(AVCodecContext *avctx)
>>>> atomic_init(&s->wpp_err, 0);
>>>> if (!avctx->internal->is_copy) {
>>>> + AVPacketSideData *sd;
>>>> +
>>>> if (avctx->extradata_size > 0 && avctx->extradata) {
>>>> ret = hevc_decode_extradata(s, avctx->extradata,
>>>> avctx->extradata_size, 1);
>>>> if (ret < 0) {
>>>> return ret;
>>>> }
>>>> }
>>>> +
>>>> + sd = av_packet_get_side_data_from_set(&avctx->side_data_set,
>>>> AV_PKT_DATA_DOVI_CONF);
>>>> + if (sd && sd->size > 0)
>>>> + ff_dovi_update_cfg(&s->dovi_ctx,
>>>> (AVDOVIDecoderConfigurationRecord *) sd->data);
>>>> }
>>>> return 0;
>>>
>
> _______________________________________________
> 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".
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH v2 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data
2023-07-23 12:17 ` Andreas Rheinhardt
2023-07-23 12:22 ` James Almer
@ 2023-07-23 12:56 ` James Almer
1 sibling, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-23 12:56 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/hevcdec.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index fcf19b4eb6..4807ffcbb3 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -3403,8 +3403,15 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
}
sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
- if (sd && sd_size > 0)
+ if (sd && sd_size > 0) {
+ int old = s->dovi_ctx.dv_profile;
+
ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd);
+ if (old)
+ av_log(avctx, AV_LOG_DEBUG,
+ "New DOVI configuration record from input packet (profile %d -> %u).\n",
+ old, s->dovi_ctx.dv_profile);
+ }
s->ref = NULL;
ret = decode_nal_units(s, avpkt->data, avpkt->size);
@@ -3707,12 +3714,18 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx)
atomic_init(&s->wpp_err, 0);
if (!avctx->internal->is_copy) {
+ AVPacketSideData *sd;
+
if (avctx->extradata_size > 0 && avctx->extradata) {
ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
if (ret < 0) {
return ret;
}
}
+
+ sd = av_packet_get_side_data_from_set(&avctx->side_data_set, AV_PKT_DATA_DOVI_CONF);
+ if (sd && sd->size > 0)
+ ff_dovi_update_cfg(&s->dovi_ctx, (AVDOVIDecoderConfigurationRecord *) sd->data);
}
return 0;
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
* [FFmpeg-devel] [PATCH v2 08/13] avcodec/decode: check for global side data in AVCodecContext side data
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 08/13] avcodec/decode: check for global side data " James Almer
@ 2023-07-23 12:57 ` James Almer
0 siblings, 0 replies; 20+ messages in thread
From: James Almer @ 2023-07-23 12:57 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/decode.c | 56 +++++++++++++++++++++++++++++++++++++--------
libavcodec/decode.h | 2 +-
2 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index f0e6acc03e..a7ce1927bf 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1396,25 +1396,30 @@ static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
return av_packet_unpack_dictionary(side_metadata, size, frame_md);
}
-int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
+static const struct {
+ enum AVPacketSideDataType packet;
+ enum AVFrameSideDataType frame;
+} sd_global_map[] = {
+ { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN },
+ { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL },
+ { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D },
+ { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
+ { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA },
+ { AV_PKT_DATA_CONTENT_LIGHT_LEVEL, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL },
+ { AV_PKT_DATA_ICC_PROFILE, AV_FRAME_DATA_ICC_PROFILE },
+ { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
+};
+
+int ff_decode_frame_props_from_pkt(AVCodecContext *avctx,
AVFrame *frame, const AVPacket *pkt)
{
static const struct {
enum AVPacketSideDataType packet;
enum AVFrameSideDataType frame;
} sd[] = {
- { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN },
- { AV_PKT_DATA_DISPLAYMATRIX, AV_FRAME_DATA_DISPLAYMATRIX },
- { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL },
- { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D },
- { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
- { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA },
- { AV_PKT_DATA_CONTENT_LIGHT_LEVEL, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL },
{ AV_PKT_DATA_A53_CC, AV_FRAME_DATA_A53_CC },
{ AV_PKT_DATA_AFD, AV_FRAME_DATA_AFD },
- { AV_PKT_DATA_ICC_PROFILE, AV_FRAME_DATA_ICC_PROFILE },
{ AV_PKT_DATA_S12M_TIMECODE, AV_FRAME_DATA_S12M_TIMECODE },
- { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
{ AV_PKT_DATA_SKIP_SAMPLES, AV_FRAME_DATA_SKIP_SAMPLES },
};
@@ -1427,6 +1432,23 @@ FF_DISABLE_DEPRECATION_WARNINGS
FF_ENABLE_DEPRECATION_WARNINGS
#endif
+ for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) {
+ size_t size;
+ uint8_t *packet_sd = av_packet_get_side_data(pkt, sd_global_map[i].packet, &size);
+ if (packet_sd) {
+ AVFrameSideData *frame_sd;
+
+ av_log(avctx, AV_LOG_DEBUG,
+ "Overwriting global side data of type \"%s\" in output frame with side data "
+ "from input packet.\n", av_packet_side_data_name(sd_global_map[i].packet));
+
+ av_frame_remove_side_data(frame, sd_global_map[i].frame);
+ frame_sd = av_frame_new_side_data(frame, sd_global_map[i].frame, size);
+ if (!frame_sd)
+ return AVERROR(ENOMEM);
+ memcpy(frame_sd->data, packet_sd, size);
+ }
+ }
for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
size_t size;
uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size);
@@ -1463,6 +1485,20 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
const AVPacket *pkt = avctx->internal->last_pkt_props;
int ret;
+ for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) {
+ AVPacketSideData *packet_sd = av_packet_get_side_data_from_set(&avctx->side_data_set,
+ sd_global_map[i].packet);
+ if (packet_sd) {
+ AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
+ sd_global_map[i].frame,
+ packet_sd->size);
+ if (!frame_sd)
+ return AVERROR(ENOMEM);
+
+ memcpy(frame_sd->data, packet_sd->data, packet_sd->size);
+ }
+ }
+
if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
ret = ff_decode_frame_props_from_pkt(avctx, frame, pkt);
if (ret < 0)
diff --git a/libavcodec/decode.h b/libavcodec/decode.h
index 2b9fe59907..0abbdf067c 100644
--- a/libavcodec/decode.h
+++ b/libavcodec/decode.h
@@ -67,7 +67,7 @@ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt);
/**
* Set various frame properties from the provided packet.
*/
-int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
+int ff_decode_frame_props_from_pkt(AVCodecContext *avctx,
AVFrame *frame, const AVPacket *pkt);
/**
--
2.41.0
_______________________________________________
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".
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2023-07-23 12:57 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-20 20:34 [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 02/13] avcodec/codec_par: add side data to AVCodecParameters James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 03/13] avformat/avformat: use the side data from AVStream.codecpar James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 04/13] fftools/ffmpeg: stop using AVStream.side_data James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 05/13] fftools/ffplay: " James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 06/13] fftools/ffprobe: " James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 07/13] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data James Almer
2023-07-23 8:40 ` Andreas Rheinhardt
2023-07-23 11:48 ` James Almer
2023-07-23 12:17 ` Andreas Rheinhardt
2023-07-23 12:22 ` James Almer
2023-07-23 12:56 ` [FFmpeg-devel] [PATCH v2 " James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 08/13] avcodec/decode: check for global side data " James Almer
2023-07-23 12:57 ` [FFmpeg-devel] [PATCH v2 " James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 09/13] fftools/ffmpeg: stop injecting stream side data in packets James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 10/13] fftools/ffplay: " James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 11/13] avcodec/avcodec: deprecate coded_side_data James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 12/13] avformat/demux: stop copying the internal AVCodecContext coded_side_data James Almer
2023-07-20 20:34 ` [FFmpeg-devel] [PATCH 13/13] fftools: stop propagating the encoder's coded_side_data James Almer
2023-07-22 22:49 ` [FFmpeg-devel] [PATCH 01/13] avcodec/avcodec: add side data to AVCodecContext James Almer
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