diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2022-05-07 05:20:30 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2022-05-10 07:46:51 +0200 |
commit | 21f3dc0ad646e21ba0130f83ad304cc2c3baf000 (patch) | |
tree | 0d1b03a0d425b97e02071bc13a80f684ac46d612 /libavformat/avformat.c | |
parent | 703318b350247ca629461a40ee0eb96c9922c463 (diff) | |
download | ffmpeg-21f3dc0ad646e21ba0130f83ad304cc2c3baf000.tar.gz |
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.c | 68 |
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; +} |