diff --git a/doc/APIchanges b/doc/APIchanges index cfa3068c6d..120ba8339d 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,10 @@ libavutil: 2013-12-xx API changes, most recent first: +2014-02-xx - xxxxxxx - lavf 55.13.0 - avformat.h + Add AVStream.side_data and AVStream.nb_side_data for exporting stream-global + side data (e.g. replaygain tags, video rotation) + 2014-02-xx - xxxxxxx - lavc 55.35.0 - avcodec.h Give the name AVPacketSideData to the previously anonymous struct used for AVPacket.side_data. diff --git a/libavformat/avformat.h b/libavformat/avformat.h index ec9c2627cb..02ee6ba178 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -755,6 +755,28 @@ typedef struct AVStream { */ AVPacket attached_pic; + /** + * An array of side data that applies to the whole stream (i.e. the + * container does not allow it to change between packets). + * + * There may be no overlap between the side data in this array and side data + * in the packets. I.e. a given side data is either exported by the muxer + * (demuxing) / set by the caller (muxing) in this array, then it never + * appears in the packets, or the side data is exported / sent through + * the packets (always in the first packet where the value becomes known or + * changes), then it does not appear in this array. + * + * - demuxing: Set by libavformat when the stream is created. + * - muxing: May be set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVPacketSideData *side_data; + /** + * The number of elements in the AVStream.side_data array. + */ + int nb_side_data; + /***************************************************************** * All fields below this line are not part of the public API. They * may not be used outside of libavformat and can be changed and diff --git a/libavformat/utils.c b/libavformat/utils.c index 3f400e33a7..164cdd7a6a 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2595,7 +2595,7 @@ int av_read_pause(AVFormatContext *s) void avformat_free_context(AVFormatContext *s) { - int i; + int i, j; AVStream *st; av_opt_free(s); @@ -2605,6 +2605,12 @@ void avformat_free_context(AVFormatContext *s) for (i = 0; i < s->nb_streams; i++) { /* free all data in a stream component */ st = s->streams[i]; + + for (j = 0; j < st->nb_side_data; j++) + av_freep(&st->side_data[j].data); + av_freep(&st->side_data); + st->nb_side_data = 0; + if (st->parser) { av_parser_close(st->parser); } diff --git a/libavformat/version.h b/libavformat/version.h index 3d1e21f17b..ef5a148deb 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFORMAT_VERSION_MAJOR 55 -#define LIBAVFORMAT_VERSION_MINOR 12 +#define LIBAVFORMAT_VERSION_MINOR 13 #define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \