summaryrefslogtreecommitdiff
path: root/libavcodec/libopusenc.c
diff options
context:
space:
mode:
authorFelicia Lim <flim@google.com>2018-07-30 12:59:44 -0700
committerMichael Niedermayer <michael@niedermayer.cc>2018-11-29 00:07:35 +0100
commit4cd6f08d2005c20a03ccd53a0a6f8a115c5ebe2e (patch)
treed3e3fc2685f4c5f0cad8d19faf7379f0dd8b9fd8 /libavcodec/libopusenc.c
parent271a00043ef3116d9561e45fa5773a0d9a0993c2 (diff)
downloadffmpeg-4cd6f08d2005c20a03ccd53a0a6f8a115c5ebe2e.tar.gz
avcodec/libopusenc: Fix warning when encoding ambisonics with channel mapping 2
Also adds checks on the number of channels. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/libopusenc.c')
-rw-r--r--libavcodec/libopusenc.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
index 7c025a66d7..50d843ebc5 100644
--- a/libavcodec/libopusenc.c
+++ b/libavcodec/libopusenc.c
@@ -27,6 +27,7 @@
#include "bytestream.h"
#include "internal.h"
#include "libopus.h"
+#include "mathops.h"
#include "vorbis.h"
#include "audio_frame_queue.h"
@@ -200,6 +201,21 @@ static int libopus_check_vorbis_layout(AVCodecContext *avctx, int mapping_family
return 0;
}
+static int libopus_check_ambisonics_channels(AVCodecContext *avctx) {
+ int channels = avctx->channels;
+ int ambisonic_order = ff_sqrt(channels) - 1;
+ if (channels != ((ambisonic_order + 1) * (ambisonic_order + 1)) &&
+ channels != ((ambisonic_order + 1) * (ambisonic_order + 1) + 2)) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Ambisonics coding is only specified for channel counts"
+ " which can be written as (n + 1)^2 or (n + 1)^2 + 2"
+ " for nonnegative integer n\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+ return 0;
+}
+
static int libopus_validate_layout_and_get_channel_map(
AVCodecContext *avctx,
int mapping_family,
@@ -231,6 +247,12 @@ static int libopus_validate_layout_and_get_channel_map(
channel_map = ff_vorbis_channel_layout_offsets[avctx->channels - 1];
}
break;
+ case 2:
+ ret = libopus_check_max_channels(avctx, 227);
+ if (ret == 0) {
+ ret = libopus_check_ambisonics_channels(avctx);
+ }
+ break;
case 255:
ret = libopus_check_max_channels(avctx, 254);
break;