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

Submitted by pkv.stream on Aug. 24, 2017, 9:10 p.m.

Details

Message ID 91b7982c-743c-cb1a-c51b-c1a93a6399e7@gmail.com
State New
Headers show

Commit Message

pkv.stream Aug. 24, 2017, 9:10 p.m.
Thanks a lot Martin !!! all sorted out thanks to your kind help.
I had run fate previously but obviously missed something; so re-run and 
it's ok.

I created two tests per your advice testing for a third channel in a 
stereo file and then in a 2.1 file.
Instead of CRC, I've used MD5 because the extant mapchan fate tests were 
using it.

Updated patch in attachment.

Michael: would that be OK or do you see other changes to make ?
From 5c3b0fed39b713b19ed53b5704b1fce63b2742ad Mon Sep 17 00:00:00 2001
From: pkviet <pkv.stream@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 ++++++++++++++++++---
 tests/fate/ffmpeg.mak                               |  8 ++++++++
 tests/ref/fate/mapchan-2ch-extract-ch0-ch2-trailing |  1 +
 tests/ref/fate/mapchan-3ch-extract-ch0-ch2-trailing |  1 +
 5 files changed, 40 insertions(+), 4 deletions(-)
 create mode 100644 tests/ref/fate/mapchan-2ch-extract-ch0-ch2-trailing
 create mode 100644 tests/ref/fate/mapchan-3ch-extract-ch0-ch2-trailing

Comments

Michael Niedermayer Aug. 25, 2017, 9:42 p.m.
On Thu, Aug 24, 2017 at 11:10:49PM +0200, pkv.stream wrote:
> Thanks a lot Martin !!! all sorted out thanks to your kind help.
> I had run fate previously but obviously missed something; so re-run
> and it's ok.
> 
> I created two tests per your advice testing for a third channel in a
> stereo file and then in a 2.1 file.
> Instead of CRC, I've used MD5 because the extant mapchan fate tests
> were using it.
> 
> Updated patch in attachment.
> 
> Michael: would that be OK or do you see other changes to make ?
> 
> 
> 

>  doc/ffmpeg.texi                                     |   13 +++++++++++-
>  ffmpeg_opt.c                                        |   21 +++++++++++++++++---
>  tests/fate/ffmpeg.mak                               |    8 +++++++
>  tests/ref/fate/mapchan-2ch-extract-ch0-ch2-trailing |    1 
>  tests/ref/fate/mapchan-3ch-extract-ch0-ch2-trailing |    1 
>  5 files changed, 40 insertions(+), 4 deletions(-)
> 1d35047c00f25dc1391a541eb704a03a9c9198de  0001-ffmpeg-options-Enable-trailing-for-map_channel.patch
> From 5c3b0fed39b713b19ed53b5704b1fce63b2742ad Mon Sep 17 00:00:00 2001
> From: pkviet <pkv.stream@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).

added missing av_free()
applied

thanks

[...]
pkv.stream Aug. 25, 2017, 10:56 p.m.
Thanks a lot Michael. (and for spotting the avfree I missed)

Le 25 août 2017 11:44 PM, "Michael Niedermayer" <michael@niedermayer.cc> a
écrit :

On Thu, Aug 24, 2017 at 11:10:49PM +0200, pkv.stream wrote:
> Thanks a lot Martin !!! all sorted out thanks to your kind help.
> I had run fate previously but obviously missed something; so re-run
> and it's ok.
>
> I created two tests per your advice testing for a third channel in a
> stereo file and then in a 2.1 file.
> Instead of CRC, I've used MD5 because the extant mapchan fate tests
> were using it.
>
> Updated patch in attachment.
>
> Michael: would that be OK or do you see other changes to make ?
>
>
>

>  doc/ffmpeg.texi                                     |   13 +++++++++++-
>  ffmpeg_opt.c                                        |   21
+++++++++++++++++---
>  tests/fate/ffmpeg.mak                               |    8 +++++++
>  tests/ref/fate/mapchan-2ch-extract-ch0-ch2-trailing |    1
>  tests/ref/fate/mapchan-3ch-extract-ch0-ch2-trailing |    1
>  5 files changed, 40 insertions(+), 4 deletions(-)
> 1d35047c00f25dc1391a541eb704a03a9c9198de  0001-ffmpeg-options-Enable-
trailing-for-map_channel.patch
> From 5c3b0fed39b713b19ed53b5704b1fce63b2742ad Mon Sep 17 00:00:00 2001
> From: pkviet <pkv.stream@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).

added missing av_free()
applied

thanks

[...]

--
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Asymptotically faster algorithms should always be preferred if you have
asymptotical amounts of data

Patch hide | download patch | download mbox

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.
 
-@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}]
+@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][?][:@var{output_file_id}.@var{stream_specifier}]
 Map an audio channel from a given input to an output. If
 @var{output_file_id}.@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}.@var{stream_specifier}.@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:
+@example
+ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
+@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;
 }
diff --git a/tests/fate/ffmpeg.mak b/tests/fate/ffmpeg.mak
index 0ec5a34..f3fbc84 100644
--- a/tests/fate/ffmpeg.mak
+++ b/tests/fate/ffmpeg.mak
@@ -10,6 +10,14 @@  FATE_MAPCHAN-$(CONFIG_CHANNELMAP_FILTER) += fate-mapchan-silent-mono
 fate-mapchan-silent-mono: tests/data/asynth-22050-1.wav
 fate-mapchan-silent-mono: CMD = md5 -i $(TARGET_PATH)/tests/data/asynth-22050-1.wav -map_channel -1 -map_channel 0.0.0 -fflags +bitexact -f wav
 
+FATE_MAPCHAN-$(CONFIG_CHANNELMAP_FILTER) += fate-mapchan-2ch-extract-ch0-ch2-trailing
+fate-mapchan-2ch-extract-ch0-ch2-trailing: tests/data/asynth-44100-2.wav
+fate-mapchan-2ch-extract-ch0-ch2-trailing: CMD = md5 -i $(TARGET_PATH)/tests/data/asynth-44100-2.wav -map_channel 0.0.0 -map_channel 0.0.2? -fflags +bitexact -f wav
+
+FATE_MAPCHAN-$(CONFIG_CHANNELMAP_FILTER) += fate-mapchan-3ch-extract-ch0-ch2-trailing
+fate-mapchan-3ch-extract-ch0-ch2-trailing: tests/data/asynth-44100-3.wav
+fate-mapchan-3ch-extract-ch0-ch2-trailing: CMD = md5 -i $(TARGET_PATH)/tests/data/asynth-44100-3.wav -map_channel 0.0.0 -map_channel 0.0.2? -fflags +bitexact -f wav
+
 FATE_MAPCHAN = $(FATE_MAPCHAN-yes)
 
 FATE_FFMPEG += $(FATE_MAPCHAN)
diff --git a/tests/ref/fate/mapchan-2ch-extract-ch0-ch2-trailing b/tests/ref/fate/mapchan-2ch-extract-ch0-ch2-trailing
new file mode 100644
index 0000000..a540037
--- /dev/null
+++ b/tests/ref/fate/mapchan-2ch-extract-ch0-ch2-trailing
@@ -0,0 +1 @@ 
+b6e1d142b4e484221562e7b66b9bbbdc
diff --git a/tests/ref/fate/mapchan-3ch-extract-ch0-ch2-trailing b/tests/ref/fate/mapchan-3ch-extract-ch0-ch2-trailing
new file mode 100644
index 0000000..6237a98
--- /dev/null
+++ b/tests/ref/fate/mapchan-3ch-extract-ch0-ch2-trailing
@@ -0,0 +1 @@ 
+ae533985186cab287309c04f6b3e866c