diff mbox series

[FFmpeg-devel,280/281] opus: export mapping family 2 (Ambisonic) as Ambisonic layout

Message ID 20220113020913.870-11-jamrial@gmail.com
State New
Headers show
Series New channel layout API
Related show

Commit Message

James Almer Jan. 13, 2022, 2:09 a.m. UTC
From: Anton Khirnov <anton@khirnov.net>

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/opus.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/libavcodec/opus.c b/libavcodec/opus.c
index c18ff47f71..474ae427aa 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_mallocz_array(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;