[FFmpeg-cvslog] avconv: use default channel layouts when they are unknown

Justin Ruggles git at videolan.org
Tue Apr 10 23:07:21 CEST 2012


ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Thu Apr  5 18:11:28 2012 -0400| [d3c59d5003a483f1a23e225fc71c19bd1116d11c] | committer: Justin Ruggles

avconv: use default channel layouts when they are unknown

If either input or output layout is known and the channel counts match,
use the known layout for both. Otherwise choose the default layout based on
av_get_default_channel_layout().

Changed some FATE references due to some WAVE files now having a non-zero
channel mask.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d3c59d5003a483f1a23e225fc71c19bd1116d11c
---

 avconv.c                     |   56 ++++++++++++++++++++++++++++++++++++++++++
 tests/ref/acodec/pcm_f32le   |    2 +-
 tests/ref/acodec/pcm_f64le   |    2 +-
 tests/ref/acodec/pcm_s24daud |    2 +-
 tests/ref/acodec/pcm_s24le   |    2 +-
 tests/ref/acodec/pcm_s32le   |    2 +-
 6 files changed, 61 insertions(+), 5 deletions(-)

diff --git a/avconv.c b/avconv.c
index 2090565..2cefe5d 100644
--- a/avconv.c
+++ b/avconv.c
@@ -2145,6 +2145,51 @@ static void print_sdp(OutputFile *output_files, int n)
     av_freep(&avc);
 }
 
+static void get_default_channel_layouts(OutputStream *ost, InputStream *ist)
+{
+    char layout_name[256];
+    AVCodecContext *enc = ost->st->codec;
+    AVCodecContext *dec = ist->st->codec;
+
+    if (!dec->channel_layout) {
+        if (enc->channel_layout && dec->channels == enc->channels) {
+            dec->channel_layout = enc->channel_layout;
+        } else {
+            dec->channel_layout = av_get_default_channel_layout(dec->channels);
+
+            if (!dec->channel_layout) {
+                av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
+                       "layout for Input Stream #%d.%d\n", ist->file_index,
+                       ist->st->index);
+                exit_program(1);
+            }
+        }
+        av_get_channel_layout_string(layout_name, sizeof(layout_name),
+                                     dec->channels, dec->channel_layout);
+        av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for  Input Stream "
+               "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
+    }
+    if (!enc->channel_layout) {
+        if (dec->channels == enc->channels) {
+            enc->channel_layout = dec->channel_layout;
+            return;
+        } else {
+            enc->channel_layout = av_get_default_channel_layout(enc->channels);
+        }
+        if (!enc->channel_layout) {
+            av_log(NULL, AV_LOG_FATAL, "Unable to find default channel layout "
+                   "for Output Stream #%d.%d\n", ost->file_index,
+                   ost->st->index);
+            exit_program(1);
+        }
+        av_get_channel_layout_string(layout_name, sizeof(layout_name),
+                                     enc->channels, enc->channel_layout);
+        av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Output Stream "
+               "#%d.%d : %s\n", ost->file_index, ost->st->index, layout_name);
+    }
+}
+
+
 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
                              char *error, int error_len)
 {
@@ -2183,6 +2228,17 @@ static int init_input_stream(int ist_index, OutputStream *output_streams, int nb
         }
         assert_codec_experimental(ist->st->codec, 0);
         assert_avoptions(ist->opts);
+
+        if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
+            for (i = 0; i < nb_output_streams; i++) {
+                OutputStream *ost = &output_streams[i];
+                if (ost->source_index == ist_index) {
+                    if (!ist->st->codec->channel_layout || !ost->st->codec->channel_layout)
+                        get_default_channel_layouts(ost, ist);
+                    break;
+                }
+            }
+        }
     }
 
     ist->last_dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
diff --git a/tests/ref/acodec/pcm_f32le b/tests/ref/acodec/pcm_f32le
index 38e5c0b..eb6ea93 100644
--- a/tests/ref/acodec/pcm_f32le
+++ b/tests/ref/acodec/pcm_f32le
@@ -1,4 +1,4 @@
-46f44f86a18984a832206ab9e29a79f2 *./tests/data/acodec/pcm_f32le.wav
+653d82a64b7bd96ac193e105e9f92d4c *./tests/data/acodec/pcm_f32le.wav
 2116880 ./tests/data/acodec/pcm_f32le.wav
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f32le.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/pcm_f64le b/tests/ref/acodec/pcm_f64le
index 42875a8..2f0576b 100644
--- a/tests/ref/acodec/pcm_f64le
+++ b/tests/ref/acodec/pcm_f64le
@@ -1,4 +1,4 @@
-ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav
+48b4cd378f47a50dc902aa03cc8280ed *./tests/data/acodec/pcm_f64le.wav
 4233680 ./tests/data/acodec/pcm_f64le.wav
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f64le.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/pcm_s24daud b/tests/ref/acodec/pcm_s24daud
index eab6f8d..fb7cad1 100644
--- a/tests/ref/acodec/pcm_s24daud
+++ b/tests/ref/acodec/pcm_s24daud
@@ -1,4 +1,4 @@
 8168a5c1343553ef027541830f2cb879 *./tests/data/acodec/pcm_s24daud.302
 10368730 ./tests/data/acodec/pcm_s24daud.302
-f552afadfdfcd6348a07095da6382de5 *./tests/data/pcm_s24daud.acodec.out.wav
+7ce988d6c5b2bf0ebf0216ba15bc5cee *./tests/data/pcm_s24daud.acodec.out.wav
 stddev: 9416.28 PSNR: 16.85 MAXDIFF:42744 bytes:  6911796/  1058400
diff --git a/tests/ref/acodec/pcm_s24le b/tests/ref/acodec/pcm_s24le
index a724e8c..0d86d1e 100644
--- a/tests/ref/acodec/pcm_s24le
+++ b/tests/ref/acodec/pcm_s24le
@@ -1,4 +1,4 @@
-a85380fb79b0d4fff38e24ac1e34bb94 *./tests/data/acodec/pcm_s24le.wav
+18ea73985dbdf59e23f5aba66145e6fe *./tests/data/acodec/pcm_s24le.wav
 1587668 ./tests/data/acodec/pcm_s24le.wav
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24le.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/pcm_s32le b/tests/ref/acodec/pcm_s32le
index 8677750..2b81c29 100644
--- a/tests/ref/acodec/pcm_s32le
+++ b/tests/ref/acodec/pcm_s32le
@@ -1,4 +1,4 @@
-da6ed80f4f40f0082577dea80827e014 *./tests/data/acodec/pcm_s32le.wav
+8d8849fa5c5d91b9cb74f5c74e937faf *./tests/data/acodec/pcm_s32le.wav
 2116868 ./tests/data/acodec/pcm_s32le.wav
 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32le.acodec.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400



More information about the ffmpeg-cvslog mailing list