[FFmpeg-devel] [PATCH 1/2] lavf/avformat: add support for passing options to nested input
Zhang Rui
bbcallen at gmail.com
Thu Mar 5 11:59:58 CET 2015
---
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
More information about the ffmpeg-devel
mailing list