From 92f27c6728fe08c36b3e09cc64421b8c7388634b Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Tue, 15 Mar 2022 20:31:45 +0100 Subject: [PATCH] avutil/channel_layout: fix av_channel_layout_describe_bprint with custom and ambisonic channels bp->len cannot be used to detect if try_describe_ambisonic was successful because the bprint buffer might contain other data as well. Also describing an invalid ambisonic layout should not return 0 but AVERROR(EINVAL) instead, so change try_describe_ambisonic to actually return error on invalid ambisonics. This also allows us to fix the first issue. Signed-off-by: Marton Balint --- libavutil/channel_layout.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavutil/channel_layout.c b/libavutil/channel_layout.c index c61d612fd8..f107a2dbd8 100644 --- a/libavutil/channel_layout.c +++ b/libavutil/channel_layout.c @@ -690,14 +690,14 @@ static int ambisonic_order(const AVChannelLayout *channel_layout) /** * If the custom layout is n-th order standard-order ambisonic, with optional * extra non-diegetic channels at the end, write its string description in bp. - * Return a negative error code on error. + * Return a negative error code otherwise. */ static int try_describe_ambisonic(AVBPrint *bp, const AVChannelLayout *channel_layout) { int nb_ambi_channels; int order = ambisonic_order(channel_layout); if (order < 0) - return 0; + return order; av_bprintf(bp, "ambisonic %d", order); @@ -749,8 +749,8 @@ int av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout, case AV_CHANNEL_ORDER_CUSTOM: if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM) { int res = try_describe_ambisonic(bp, channel_layout); - if (res < 0 || bp->len) - return res; + if (res >= 0) + return 0; } if (channel_layout->nb_channels) av_bprintf(bp, "%d channels (", channel_layout->nb_channels);