summaryrefslogtreecommitdiff
path: root/libavformat/avformat.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-05-07 05:20:30 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-05-10 07:46:51 +0200
commit21f3dc0ad646e21ba0130f83ad304cc2c3baf000 (patch)
tree0d1b03a0d425b97e02071bc13a80f684ac46d612 /libavformat/avformat.c
parent703318b350247ca629461a40ee0eb96c9922c463 (diff)
avformat/utils: Move av_stream_*_side_data API to avformat.c
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavformat/avformat.c')
-rw-r--r--libavformat/avformat.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/libavformat/avformat.c b/libavformat/avformat.c
index 88acae018e..baad2acde1 100644
--- a/libavformat/avformat.c
+++ b/libavformat/avformat.c
@@ -128,3 +128,71 @@ void avformat_free_context(AVFormatContext *s)
av_freep(&s->url);
av_free(s);
}
+
+uint8_t *av_stream_get_side_data(const AVStream *st,
+ enum AVPacketSideDataType type, size_t *size)
+{
+ for (int i = 0; i < st->nb_side_data; i++) {
+ if (st->side_data[i].type == type) {
+ if (size)
+ *size = st->side_data[i].size;
+ return st->side_data[i].data;
+ }
+ }
+ if (size)
+ *size = 0;
+ return NULL;
+}
+
+int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
+ uint8_t *data, size_t size)
+{
+ AVPacketSideData *sd, *tmp;
+
+ for (int i = 0; i < st->nb_side_data; i++) {
+ sd = &st->side_data[i];
+
+ if (sd->type == type) {
+ av_freep(&sd->data);
+ sd->data = data;
+ sd->size = size;
+ return 0;
+ }
+ }
+
+ if (st->nb_side_data + 1U > FFMIN(INT_MAX, SIZE_MAX / sizeof(*tmp)))
+ return AVERROR(ERANGE);
+
+ tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp));
+ if (!tmp) {
+ return AVERROR(ENOMEM);
+ }
+
+ st->side_data = tmp;
+ st->nb_side_data++;
+
+ sd = &st->side_data[st->nb_side_data - 1];
+ sd->type = type;
+ sd->data = data;
+ sd->size = size;
+
+ return 0;
+}
+
+uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
+ size_t size)
+{
+ int ret;
+ uint8_t *data = av_malloc(size);
+
+ if (!data)
+ return NULL;
+
+ ret = av_stream_add_side_data(st, type, data, size);
+ if (ret < 0) {
+ av_freep(&data);
+ return NULL;
+ }
+
+ return data;
+}