[FFmpeg-devel] [PATCH 02/13] avcodec/codec_par: add side data to AVCodecParameters

James Almer jamrial at gmail.com
Thu Jul 20 23:34:04 EEST 2023


Signed-off-by: James Almer <jamrial at 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



More information about the ffmpeg-devel mailing list