From 79ff9935ae4ae90a4dd485bd9a3a440281d866b2 Mon Sep 17 00:00:00 2001 From: James Almer Date: Tue, 22 Nov 2016 17:16:48 -0500 Subject: [PATCH 1/3] utils: Add av_stream_add_side_data() Functionally similar to av_packet_add_side_data(). Allows the use of an already allocated buffer as stream side data. Signed-off-by: James Almer Signed-off-by: Vittorio Giovara --- doc/APIchanges | 3 +++ libavformat/avformat.h | 15 +++++++++++++++ libavformat/utils.c | 37 +++++++++++++++++++++++++++---------- libavformat/version.h | 2 +- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 6e0d27d993..90c6500764 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,9 @@ libavutil: 2015-08-28 API changes, most recent first: +2016-xx-xx - xxxxxxx - lavf 57.10.0 - avformat.h + Add av_stream_add_side_data(). + 2016-xx-xx - xxxxxxx - lavu 55.28.0 - pixfmt.h Add AV_PIX_FMT_GRAY12(LE/BE). diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 65c3d90d4b..547b88b2f1 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1399,6 +1399,21 @@ const AVClass *avformat_get_class(void); */ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @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 + * st. + * @param size side information size + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + /** * Allocate new information from stream. * diff --git a/libavformat/utils.c b/libavformat/utils.c index 37ba5a8626..8fa89eb790 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3388,15 +3388,11 @@ uint8_t *av_stream_get_side_data(AVStream *st, enum AVPacketSideDataType type, return NULL; } -uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, - int size) +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size) { AVPacketSideData *sd, *tmp; int i; - uint8_t *data = av_malloc(size); - - if (!data) - return NULL; for (i = 0; i < st->nb_side_data; i++) { sd = &st->side_data[i]; @@ -3405,14 +3401,16 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, av_freep(&sd->data); sd->data = data; sd->size = size; - return sd->data; + return 0; } } - tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp)); + if ((unsigned) st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data)) + return AVERROR(ERANGE); + + tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp)); if (!tmp) { - av_freep(&data); - return NULL; + return AVERROR(ENOMEM); } st->side_data = tmp; @@ -3422,6 +3420,25 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, sd->type = type; sd->data = data; sd->size = size; + + return 0; +} + +uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, + int 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; } diff --git a/libavformat/version.h b/libavformat/version.h index c329c2f302..c6085f8591 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFORMAT_VERSION_MAJOR 57 -#define LIBAVFORMAT_VERSION_MINOR 9 +#define LIBAVFORMAT_VERSION_MINOR 10 #define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ From 1893495e1d023365b4aa24e5e1bd1b24ad5d34fd Mon Sep 17 00:00:00 2001 From: James Almer Date: Mon, 21 Nov 2016 18:54:29 -0500 Subject: [PATCH 2/3] mov: Use av_stream_add_side_data() for displaymatrix side data Signed-off-by: James Almer Signed-off-by: Vittorio Giovara --- libavformat/mov.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index df29f2a605..28adce76c3 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -3545,20 +3545,12 @@ static int mov_read_header(AVFormatContext *s) break; case AVMEDIA_TYPE_VIDEO: if (sc->display_matrix) { - AVPacketSideData *sd, *tmp; + err = av_stream_add_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, + (uint8_t *)sc->display_matrix, + sizeof(int32_t) * 9); + if (err < 0) + return err; - 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 = AV_PKT_DATA_DISPLAYMATRIX; - sd->size = sizeof(int32_t) * 9; - sd->data = (uint8_t*)sc->display_matrix; sc->display_matrix = NULL; } break; From 12ab667e219e7fbf8e9aef3731039b75c822df25 Mon Sep 17 00:00:00 2001 From: James Almer Date: Tue, 22 Nov 2016 15:50:28 -0500 Subject: [PATCH 3/3] matroska: use av_stream_add_side_data() for stereo3d side data Signed-off-by: James Almer Signed-off-by: Vittorio Giovara --- libavformat/matroska.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/libavformat/matroska.c b/libavformat/matroska.c index 8842d7c464..a8f5e981b5 100644 --- a/libavformat/matroska.c +++ b/libavformat/matroska.c @@ -115,26 +115,13 @@ const AVMetadataConv ff_mkv_metadata_conv[] = { int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode) { - AVPacketSideData *sd, *tmp; AVStereo3D *stereo; + int ret; stereo = av_stereo3d_alloc(); if (!stereo) return AVERROR(ENOMEM); - tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp)); - if (!tmp) { - av_freep(&stereo); - return AVERROR(ENOMEM); - } - st->side_data = tmp; - st->nb_side_data++; - - sd = &st->side_data[st->nb_side_data - 1]; - sd->type = AV_PKT_DATA_STEREO3D; - sd->data = (uint8_t *)stereo; - sd->size = sizeof(*stereo); - // note: the missing breaks are intentional switch (stereo_mode) { case MATROSKA_VIDEO_STEREOMODE_TYPE_MONO: @@ -172,5 +159,12 @@ 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, + sizeof(*stereo)); + if (ret < 0) { + av_freep(&stereo); + return ret; + } + return 0; }