summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-05-28 14:54:51 +0200
committerJames Almer <jamrial@gmail.com>2022-03-15 09:42:47 -0300
commite6358ec1ac4ccabccff20c7dfcb8bb2e1200f5f5 (patch)
treee01aaf2769d08c5137233315365548b31375803c /libavcodec
parent886847afa029cca3e10ceae2b2f5da0cf7a36d5c (diff)
opus: export mapping family 2 (Ambisonic) as Ambisonic layout
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/opus.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/libavcodec/opus.c b/libavcodec/opus.c
index c18ff47f71..7eccc17e80 100644
--- a/libavcodec/opus.c
+++ b/libavcodec/opus.c
@@ -398,8 +398,22 @@ av_cold int ff_opus_parse_extradata(AVCodecContext *avctx,
ret = AVERROR_INVALIDDATA;
goto fail;
}
- layout.order = AV_CHANNEL_ORDER_UNSPEC;
+
layout.nb_channels = channels;
+ if (channels == (ambisonic_order + 1) * (ambisonic_order + 1)) {
+ layout.order = AV_CHANNEL_ORDER_AMBISONIC;
+ } else {
+ layout.order = AV_CHANNEL_ORDER_CUSTOM;
+ layout.u.map = av_calloc(channels, sizeof(*layout.u.map));
+ if (!layout.u.map) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ for (i = 0; i < channels - 2; i++)
+ layout.u.map[i].id = AV_CHAN_AMBISONIC_BASE + i;
+ layout.u.map[channels - 2].id = AV_CHAN_FRONT_LEFT;
+ layout.u.map[channels - 1].id = AV_CHAN_FRONT_RIGHT;
+ }
} else {
layout.order = AV_CHANNEL_ORDER_UNSPEC;
layout.nb_channels = channels;
@@ -450,8 +464,10 @@ av_cold int ff_opus_parse_extradata(AVCodecContext *avctx,
}
}
- av_channel_layout_uninit(&avctx->ch_layout);
- avctx->ch_layout = layout;
+ ret = av_channel_layout_copy(&avctx->ch_layout, &layout);
+ if (ret < 0)
+ goto fail;
+
s->nb_streams = streams;
s->nb_stereo_streams = stereo_streams;