[FFmpeg-devel] [PATCHv2 3/3] avfilter/formats: do not allow unknown layouts in ff_parse_channel_layout if nret is not set
Marton Balint
cus at passwd.hu
Wed Jan 11 00:43:59 EET 2017
On Mon, 2 Jan 2017, Marton Balint wrote:
> 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 at passwd.hu>
> ---
> 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 840780d..d4de862 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 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..ea85eed 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);
Ping...
Thanks,
Marton
More information about the ffmpeg-devel
mailing list