--- libavformat/avformat.h | 5 +++++ libavformat/utils.c | 14 ++++++++++++-- libavformat/version.h | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 4211a95..035e2d4 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -638,6 +638,11 @@ typedef struct AVInputFormat { int (*read_header)(struct AVFormatContext *); /** + * Used by format which open further nested input. + */ + int (*read_header2)(struct AVFormatContext *, AVDictionary **options); + + /** * Read one packet and put it in 'pkt'. pts and flags are also * set. 'avformat_new_stream' can be called only if the flag * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a diff --git a/libavformat/utils.c b/libavformat/utils.c index 17ae300..6a962c7 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -404,6 +404,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, AVFormatContext *s = *ps; int ret = 0; AVDictionary *tmp = NULL; + AVDictionary *tmp2 = NULL; ID3v2ExtraMeta *id3v2_extra_meta = NULL; if (!s && !(s = avformat_alloc_context())) @@ -462,9 +463,16 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, if (s->pb) ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0); - if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header) - if ((ret = s->iformat->read_header(s)) < 0) + if (!(s->flags&AVFMT_FLAG_PRIV_OPT)) { + if (s->iformat->read_header2) { + if (options) + av_dict_copy(&tmp2, *options, 0); + + if ((ret = s->iformat->read_header2(s, &tmp2)) < 0) + goto fail; + } else if (s->iformat->read_header && (ret = s->iformat->read_header(s)) < 0) goto fail; + } if (id3v2_extra_meta) { if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") || @@ -487,6 +495,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, if (options) { av_dict_free(options); *options = tmp; + av_dict_free(&tmp2); } *ps = s; return 0; @@ -494,6 +503,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, fail: ff_id3v2_free_extra_meta(&id3v2_extra_meta); av_dict_free(&tmp); + av_dict_free(&tmp2); if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO)) avio_closep(&s->pb); avformat_free_context(s); diff --git a/libavformat/version.h b/libavformat/version.h index ba4c7c8..81fb7b2 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFORMAT_VERSION_MAJOR 56 -#define LIBAVFORMAT_VERSION_MINOR 25 +#define LIBAVFORMAT_VERSION_MINOR 26 #define LIBAVFORMAT_VERSION_MICRO 101 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ -- 2.0.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel