From 977fd8841921f0109bee220e1f99dd662c166ae1 Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Mon, 26 Dec 2016 02:03:37 +0100 Subject: avfilter/formats: do not allow unknown layouts in ff_parse_channel_layout if nret is not set 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 --- libavfilter/formats.c | 26 +++++++++++++++----------- libavfilter/tests/formats.c | 3 +++ 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); -- cgit v1.2.3