diff options
-rw-r--r-- | libavfilter/formats.c | 26 | ||||
-rw-r--r-- | libavfilter/tests/formats.c | 3 | ||||
-rw-r--r-- | tests/ref/fate/filter-formats | 3 |
3 files changed, 21 insertions, 11 deletions
diff --git a/libavfilter/formats.c b/libavfilter/formats.c index 840780d562..d4de862237 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -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; } diff --git a/libavfilter/tests/formats.c b/libavfilter/tests/formats.c index 0e8ba4ad15..5450742b68 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 4c303d86ef..ea85eed23d 100644 --- a/tests/ref/fate/filter-formats +++ b/tests/ref/fate/filter-formats @@ -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); |