Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBela Bodecs <bodecsb@vivanet.hu>2015-10-10 22:29:12 +0300
committerNicolas George <george@nsup.org>2015-10-12 17:56:58 +0300
commit1f3a29e999b635fee913680402977eb1d51a8461 (patch)
tree59dc5cc3478b3b7a09dd5590097ab8067ec781c6 /libavformat/tee.c
parentb3deaece87b5b0216382e6d700854edb8d3727fb (diff)
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>
Diffstat (limited to 'libavformat/tee.c')
-rw-r--r--libavformat/tee.c33
1 files changed, 27 insertions, 6 deletions
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;
}