Current code returned the number of channels as channel layout in that case,
and if nret is not set then unknown layouts are typically not supported.

Also use the common parsing code. This breaks a very specific case, using
af_pan with an unknown channel layout such as '13c', from now on, only '13C'
will work.

Signed-off-by: Marton Balint <c...@passwd.hu>
---
 libavfilter/formats.c         | 20 ++++++--------------
 libavfilter/tests/formats.c   |  3 +++
 tests/ref/fate/filter-formats |  5 ++++-
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index 840780d..8be606f 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -662,24 +662,16 @@ int ff_parse_sample_rate(int *ret, const char *arg, void 
*log_ctx)
 int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg,
                             void *log_ctx)
 {
-    char *tail;
     int64_t chlayout;
+    int nb_channels;
 
-    chlayout = av_get_channel_layout(arg);
-    if (chlayout == 0) {
-        chlayout = strtol(arg, &tail, 10);
-        if (!(*tail == '\0' || *tail == 'c' && *(tail + 1) == '\0') || 
chlayout <= 0 || chlayout > 63) {
-            av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout '%s'\n", 
arg);
-            return AVERROR(EINVAL);
-        }
-        if (nret) {
-            *nret = chlayout;
-            *ret = 0;
-            return 0;
-        }
+    if (av_get_extended_channel_layout(arg, &chlayout, &nb_channels) < 0 || 
(!chlayout && !nret)) {
+        av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout '%s'\n", arg);
+        return AVERROR(EINVAL);
     }
     *ret = chlayout;
     if (nret)
-        *nret = av_get_channel_layout_nb_channels(chlayout);
+        *nret = nb_channels;
+
     return 0;
 }
diff --git a/libavfilter/tests/formats.c b/libavfilter/tests/formats.c
index 0e8ba4a..5450742 100644
--- a/libavfilter/tests/formats.c
+++ b/libavfilter/tests/formats.c
@@ -39,6 +39,9 @@ int main(void)
         "-1c",
         "60c",
         "65c",
+        "2C",
+        "60C",
+        "65C",
         "5.1",
         "stereo",
         "1+1+1+1",
diff --git a/tests/ref/fate/filter-formats b/tests/ref/fate/filter-formats
index 4c303d8..17ff5b2 100644
--- a/tests/ref/fate/filter-formats
+++ b/tests/ref/fate/filter-formats
@@ -75,8 +75,11 @@ quad(side)
 0 = ff_parse_channel_layout(0000000000000004,  1, 1c);
 0 = ff_parse_channel_layout(0000000000000003,  2, 2c);
 -1 = ff_parse_channel_layout(FFFFFFFFFFFFFFFF, -1, -1c);
-0 = ff_parse_channel_layout(0000000000000000, 60, 60c);
+-1 = ff_parse_channel_layout(FFFFFFFFFFFFFFFF, -1, 60c);
 -1 = ff_parse_channel_layout(FFFFFFFFFFFFFFFF, -1, 65c);
+0 = ff_parse_channel_layout(0000000000000000,  2, 2C);
+0 = ff_parse_channel_layout(0000000000000000, 60, 60C);
+-1 = ff_parse_channel_layout(FFFFFFFFFFFFFFFF, -1, 65C);
 0 = ff_parse_channel_layout(000000000000003F,  6, 5.1);
 0 = ff_parse_channel_layout(0000000000000003,  2, stereo);
 0 = ff_parse_channel_layout(0000000000000001,  1, 1+1+1+1);
-- 
2.10.2

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

Reply via email to