]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/formats: do not allow unknown layouts in ff_parse_channel_layout if nret...
authorMarton Balint <cus@passwd.hu>
Mon, 26 Dec 2016 01:03:37 +0000 (02:03 +0100)
committerMarton Balint <cus@passwd.hu>
Tue, 24 Jan 2017 22:51:36 +0000 (23:51 +0100)
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. Use a temporary workaround to parse an
unknown channel layout such as '13c', after a 1 year grace period only '13C'
will work.

Signed-off-by: Marton Balint <cus@passwd.hu>
libavfilter/formats.c
libavfilter/tests/formats.c
tests/ref/fate/filter-formats

index 840780d562288909713b527afa2914484cac93ec..d4de86223750373006311fa058147c6ddee85ad7 100644 (file)
@@ -664,22 +664,26 @@ int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg,
 {
     char *tail;
     int64_t chlayout;
-
-    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) {
+    int nb_channels;
+
+    if (av_get_extended_channel_layout(arg, &chlayout, &nb_channels) < 0) {
+        /* [TEMPORARY 2016-12 -> 2017-12]*/
+        nb_channels = strtol(arg, &tail, 10);
+        if (!errno && *tail == 'c' && *(tail + 1) == '\0' && nb_channels > 0 && nb_channels < 64) {
+            chlayout = 0;
+            av_log(log_ctx, AV_LOG_WARNING, "Deprecated channel count specification '%s'. This will stop working in releases made in 2018 and after.\n", arg);
+        } else {
             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 (!chlayout && !nret) {
+        av_log(log_ctx, AV_LOG_ERROR, "Unknown channel layout '%s' is not supported.\n", arg);
+        return AVERROR(EINVAL);
     }
     *ret = chlayout;
     if (nret)
-        *nret = av_get_channel_layout_nb_channels(chlayout);
+        *nret = nb_channels;
+
     return 0;
 }
index 0e8ba4ad158cf5fb2f3c8e847e797e83fcb48199..5450742b687e0cb3bbf2c541a9b524b7f610f6b7 100644 (file)
@@ -39,6 +39,9 @@ int main(void)
         "-1c",
         "60c",
         "65c",
+        "2C",
+        "60C",
+        "65C",
         "5.1",
         "stereo",
         "1+1+1+1",
index 4c303d86efd2c583a03a2f4c5a2ae05976b0ff0a..ea85eed23d3f9591ccecf0d69841be1744bbab98 100644 (file)
@@ -77,6 +77,9 @@ quad(side)
 -1 = ff_parse_channel_layout(FFFFFFFFFFFFFFFF, -1, -1c);
 0 = ff_parse_channel_layout(0000000000000000, 60, 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);