diff options
author | Bela Bodecs <bodecsb@vivanet.hu> | 2015-10-10 21:29:12 +0200 |
---|---|---|
committer | Nicolas George <george@nsup.org> | 2015-10-12 16:56:58 +0200 |
commit | 1f3a29e999b635fee913680402977eb1d51a8461 (patch) | |
tree | 59dc5cc3478b3b7a09dd5590097ab8067ec781c6 | |
parent | b3deaece87b5b0216382e6d700854edb8d3727fb (diff) | |
download | ffmpeg-1f3a29e999b635fee913680402977eb1d51a8461.tar.gz |
lavf/tee: allow multiple stream specifiers in select.
It makes possible to put multiple stream specifier into the select
option separated by comma.
eg. select=\'a:0,v\'
Signed-off-by: Bela Bodecs <bodecsb@vivanet.hu>
Signed-off-by: Nicolas George <george@nsup.org>
-rw-r--r-- | doc/muxers.texi | 3 | ||||
-rw-r--r-- | libavformat/tee.c | 33 |
2 files changed, 29 insertions, 7 deletions
diff --git a/doc/muxers.texi b/doc/muxers.texi index 91d131f9bd..06483fa4ae 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -1272,7 +1272,8 @@ Several bitstream filters can be specified, separated by ",". @item select Select the streams that should be mapped to the slave output, specified by a stream specifier. If not specified, this defaults to -all the input streams. +all the input streams. You may use multiple stream specifiers +separated by commas (@code{,}) e.g.: @code{a:0,v} @end table @subsection Examples diff --git a/libavformat/tee.c b/libavformat/tee.c index c619eae5db..e9fccc17d6 100644 --- a/libavformat/tee.c +++ b/libavformat/tee.c @@ -47,6 +47,7 @@ static const char *const slave_opt_open = "["; static const char *const slave_opt_close = "]"; static const char *const slave_opt_delim = ":]"; /* must have the close too */ static const char *const slave_bsfs_spec_sep = "/"; +static const char *const slave_select_sep = ","; static const AVClass tee_muxer_class = { .class_name = "Tee muxer", @@ -142,6 +143,8 @@ static int open_slave(AVFormatContext *avf, char *slave, TeeSlave *tee_slave) AVFormatContext *avf2 = NULL; AVStream *st, *st2; int stream_count; + int fullret; + char *subselect = NULL, *next_subselect = NULL, *first_subselect = NULL, *tmp_select = NULL; if ((ret = parse_slave_options(avf, slave, &options, &filename)) < 0) return ret; @@ -172,15 +175,32 @@ static int open_slave(AVFormatContext *avf, char *slave, TeeSlave *tee_slave) for (i = 0; i < avf->nb_streams; i++) { st = avf->streams[i]; if (select) { - ret = avformat_match_stream_specifier(avf, avf->streams[i], select); - if (ret < 0) { - av_log(avf, AV_LOG_ERROR, - "Invalid stream specifier '%s' for output '%s'\n", - select, slave); + tmp_select = av_strdup(select); // av_strtok is destructive so we regenerate it in each loop + if (!tmp_select) { + ret = AVERROR(ENOMEM); goto end; } + fullret = 0; + first_subselect = tmp_select; + next_subselect = NULL; + while (subselect = av_strtok(first_subselect, slave_select_sep, &next_subselect)) { + first_subselect = NULL; + + ret = avformat_match_stream_specifier(avf, avf->streams[i], subselect); + if (ret < 0) { + av_log(avf, AV_LOG_ERROR, + "Invalid stream specifier '%s' for output '%s'\n", + subselect, slave); + goto end; + } + if (ret != 0) { + fullret = 1; // match + break; + } + } + av_freep(&tmp_select); - if (ret == 0) { /* no match */ + if (fullret == 0) { /* no match */ tee_slave->stream_map[i] = -1; continue; } @@ -282,6 +302,7 @@ end: av_free(format); av_free(select); av_dict_free(&options); + av_freep(&tmp_select); return ret; } |