summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavfilter/formats.c26
-rw-r--r--libavfilter/tests/formats.c3
-rw-r--r--tests/ref/fate/filter-formats3
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);