[FFmpeg-devel] [PATCH 2/2] lavf/concatdef: pass options to nested input
Zhang Rui
bbcallen at gmail.com
Thu Mar 5 11:59:59 CET 2015
---
libavformat/concatdec.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
index f07cfd7..a6bf6ee 100644
--- a/libavformat/concatdec.c
+++ b/libavformat/concatdec.c
@@ -56,6 +56,7 @@ typedef struct {
int seekable;
ConcatMatchMode stream_match_mode;
unsigned auto_convert;
+ AVDictionary *options;
} ConcatContext;
static int concat_probe(AVProbeData *probe)
@@ -280,6 +281,7 @@ static int open_file(AVFormatContext *avf, unsigned fileno)
ConcatContext *cat = avf->priv_data;
ConcatFile *file = &cat->files[fileno];
int ret;
+ AVDictionary *tmp = NULL;
if (cat->avf)
avformat_close_input(&cat->avf);
@@ -293,11 +295,14 @@ static int open_file(AVFormatContext *avf, unsigned fileno)
if ((ret = ff_copy_whitelists(cat->avf, avf)) < 0)
return ret;
- if ((ret = avformat_open_input(&cat->avf, file->url, NULL, NULL)) < 0 ||
- (ret = avformat_find_stream_info(cat->avf, NULL)) < 0) {
+ if (cat->options)
+ av_dict_copy(&tmp, cat->options, 0);
+
+ if ((ret = avformat_open_input(&cat->avf, file->url, NULL, &tmp)) < 0 ||
+ (ret = avformat_find_stream_info(cat->avf, &tmp)) < 0) {
av_log(avf, AV_LOG_ERROR, "Impossible to open '%s'\n", file->url);
avformat_close_input(&cat->avf);
- return ret;
+ goto fail;
}
cat->cur_file = file;
if (file->start_time == AV_NOPTS_VALUE)
@@ -305,8 +310,10 @@ static int open_file(AVFormatContext *avf, unsigned fileno)
cat->files[fileno - 1].start_time +
cat->files[fileno - 1].duration;
if ((ret = match_streams(avf)) < 0)
- return ret;
- return 0;
+ goto fail;
+fail:
+ av_dict_free(&tmp);
+ return ret;
}
static int concat_read_close(AVFormatContext *avf)
@@ -320,11 +327,12 @@ static int concat_read_close(AVFormatContext *avf)
av_freep(&cat->files[i].url);
av_freep(&cat->files[i].streams);
}
+ av_dict_free(&cat->options);
av_freep(&cat->files);
return 0;
}
-static int concat_read_header(AVFormatContext *avf)
+static int concat_read_header(AVFormatContext *avf, AVDictionary **options)
{
ConcatContext *cat = avf->priv_data;
uint8_t buf[4096];
@@ -412,6 +420,8 @@ static int concat_read_header(AVFormatContext *avf)
cat->stream_match_mode = avf->nb_streams ? MATCH_EXACT_ID :
MATCH_ONE_TO_ONE;
+ if (options)
+ av_dict_copy(&cat->options, *options, 0);
if ((ret = open_file(avf, 0)) < 0)
goto fail;
return 0;
@@ -644,7 +654,7 @@ AVInputFormat ff_concat_demuxer = {
.long_name = NULL_IF_CONFIG_SMALL("Virtual concatenation script"),
.priv_data_size = sizeof(ConcatContext),
.read_probe = concat_probe,
- .read_header = concat_read_header,
+ .read_header2 = concat_read_header,
.read_packet = concat_read_packet,
.read_close = concat_read_close,
.read_seek2 = concat_seek,
--
2.0.0
More information about the ffmpeg-devel
mailing list