Hi All,

currently, select option of tee pseudo muxer may contain only one stream specifier. Sometimes I need to use more than one stream specifier. So I made the following patch. It makes possible to put multiple stream specifier into select option separated by comma.
eg. select=\'a:0,v\'
(I choose the comma character as separator because it is similar to tee's bsf option separator. bsf option allows multiple value separated by comma)

Please consider that put this patch into the official ffmpeg source tree.




thank you,

Bela Bodecs


p.s.:the documentation/web also should alter by this, but I do not know where to send this:

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.

+++
You may use multiple stream specifiers separated by commas (,) eg.: a:0,v


Patch description:


 diff -u tee.c.orig tee.c
--- tee.c.orig  2015-07-09 22:22:27.000000000 +0200
+++ tee.c       2015-09-25 13:15:15.763273903 +0200
@@ -47,6 +47,7 @@
 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,7 +143,9 @@
     AVFormatContext *avf2 = NULL;
     AVStream *st, *st2;
     int stream_count;
-
+    int fullret;
+    char *subselect = NULL, *next_subselect = NULL, *first_subselect;
+
     if ((ret = parse_slave_options(avf, slave, &options, &filename)) < 0)
         return ret;

@@ -172,15 +175,26 @@
     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);
-                goto end;
-            }
+            fullret = 0;
+            first_subselect = select;
+            next_subselect = NULL;
+ while (subselect = strtok_r(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;
+                }

-            if (ret == 0) { /* no match */
+            }
+            if (fullret == 0) { /* no match */
                 tee_slave->stream_map[i] = -1;
                 continue;
             }

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to