[FFmpeg-devel] [PATCH] ffmpeg options: Enable trailing ? for map_channel

pkv.stream pkv.stream at gmail.com
Thu Aug 24 09:17:58 EEST 2017


Le 24/08/2017 à 2:30 AM, Michael Niedermayer a écrit :
> On Wed, Aug 23, 2017 at 06:48:14PM +0200, pkv.stream wrote:
>> Hello,
>>
>> the following patch allows one to add a trailing ? to -map_channel
>> as in -map option.
>>
>> E.g: -map_channel 0.0.2? so that if the channel does not exist, the
>> command does not stop.
>>
>> This is similar to what one can do with -map.
>>
>> Thanks for any input.
>>
>>
>>   ffmpeg_opt.c |   24 ++++++++++++++++++++----
>>   1 file changed, 20 insertions(+), 4 deletions(-)
>> 28689933986d73050286e700752ace032df6dc1b  0001-ffmpeg-options-Enable-trailing-for-map_channel.patch
>>  From 07959dfe79816d03c30b8027f45b41d60078b3fa Mon Sep 17 00:00:00 2001
>> From: pkviet <pkv.stream at gmail.com>
>> Date: Tue, 22 Aug 2017 11:30:45 +0200
>> Subject: [PATCH] ffmpeg options: Enable trailing ? for map_channel
>>
>> The -map option allows for a trailing ? so that an error is not thrown if
>> the input stream does not exist.
>> This capability is extended to the map_channel option.
>> This allows a ffmpeg command not to break if an input channel does not
>> exist, which can be of use (for instance, scripts processing audio
>> channels with sources having unset number of audio channels).
>> ---
>>   ffmpeg_opt.c | 24 ++++++++++++++++++++----
>>   1 file changed, 20 insertions(+), 4 deletions(-)
> the patch contains tabs (cannot be pushed to git master)
> and this is missing an update to the documentation

thanks Michael.
Patch corrected per your instructions.
Updated doc , provided an example and removed all tabs !


>
> [...]
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


-------------- next part --------------
From 110ab5a6393639be565820b98fe6b1a51524f796 Mon Sep 17 00:00:00 2001
From: pkviet <pkv.stream at gmail.com>
Date: Tue, 22 Aug 2017 11:30:45 +0200
Subject: [PATCH] ffmpeg options: Enable trailing ? for map_channel

The -map option allows for a trailing ? so that an error is not thrown if
the input stream does not exist.
This capability is extended to the map_channel option.
This allows a ffmpeg command not to break if an input channel does not
exist, which can be of use (for instance, scripts processing audio
channels with sources having unset number of audio channels).
---
 doc/ffmpeg.texi | 13 ++++++++++++-
 ffmpeg_opt.c    | 21 ++++++++++++++++++---
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 4616a42..de6d3f1 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -996,7 +996,7 @@ such streams is attempted.
 Allow input streams with unknown type to be copied instead of failing if copying
 such streams is attempted.
 
- at item -map_channel [@var{input_file_id}. at var{stream_specifier}. at var{channel_id}|-1][:@var{output_file_id}. at var{stream_specifier}]
+ at item -map_channel [@var{input_file_id}. at var{stream_specifier}. at var{channel_id}|-1][?][:@var{output_file_id}. at var{stream_specifier}]
 Map an audio channel from a given input to an output. If
 @var{output_file_id}. at var{stream_specifier} is not set, the audio channel will
 be mapped on all the audio streams.
@@ -1005,6 +1005,10 @@ Using "-1" instead of
 @var{input_file_id}. at var{stream_specifier}. at var{channel_id} will map a muted
 channel.
 
+A trailing @code{?} will allow the map_channel to be
+optional: if the map_channel matches no channel the map_channel will be ignored instead
+of failing.
+
 For example, assuming @var{INPUT} is a stereo audio file, you can switch the
 two audio channels with the following command:
 @example
@@ -1052,6 +1056,13 @@ video stream), you can use the following command:
 ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
 @end example
 
+To map the first two audio channels from the first input, and using the
+trailing @code{?}, ignore the audio channel mapping if the first input is
+mono instead of stereo:
+ at example
+ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
+ at end example
+
 @item -map_metadata[:@var{metadata_spec_out}] @var{infile}[:@var{metadata_spec_in}] (@emph{output,per-metadata})
 Set metadata information of the next output file from @var{infile}. Note that
 those are file indices (zero-based), not filenames.
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 1c4a11e..2f6bfc9 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -405,6 +405,11 @@ static int opt_map_channel(void *optctx, const char *opt, const char *arg)
     int n;
     AVStream *st;
     AudioChannelMap *m;
+    char *allow_unused;
+    char *mapchan;
+    mapchan = av_strdup(arg);
+    if (!mapchan)
+        return AVERROR(ENOMEM);
 
     GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
     m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
@@ -450,10 +455,20 @@ static int opt_map_channel(void *optctx, const char *opt, const char *arg)
                m->file_idx, m->stream_idx);
         exit_program(1);
     }
+    /* allow trailing ? to map_channel */
+    if (allow_unused = strchr(mapchan, '?'))
+        *allow_unused = 0;
     if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels) {
-        av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
-               m->file_idx, m->stream_idx, m->channel_idx);
-        exit_program(1);
+        if (allow_unused) {
+            av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
+                    m->file_idx, m->stream_idx, m->channel_idx);
+        } else {
+            av_log(NULL, AV_LOG_FATAL,  "mapchan: invalid audio channel #%d.%d.%d\n"
+                    "To ignore this, add a trailing '?' to the map_channel.\n",
+                    m->file_idx, m->stream_idx, m->channel_idx);
+            exit_program(1);
+        }
+
     }
     return 0;
 }
-- 
2.10.1.windows.1



More information about the ffmpeg-devel mailing list