PR #21303 opened by James Almer (jamrial)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21303
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21303.patch


>From ce1d2a98c1e09f3080bc216713b7cae87195a4bb Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 17:05:51 -0300
Subject: [PATCH 1/8] avutil/iamf: add an AVOption for
 AVIAMFLayer.demixing_matrix

Plus a length field, to fulfill the requirements of AV_OPT_TYPE_FLAG_ARRAY 
options.

Signed-off-by: James Almer <[email protected]>
---
 libavutil/iamf.c |  4 ++++
 libavutil/iamf.h | 11 +++++++----
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/libavutil/iamf.c b/libavutil/iamf.c
index 791954d951..c18069220e 100644
--- a/libavutil/iamf.c
+++ b/libavutil/iamf.c
@@ -239,6 +239,8 @@ AVIAMFParamDefinition *av_iamf_param_definition_alloc(enum 
AVIAMFParamDefinition
 //
 // Audio Element
 //
+static const AVOptionArrayDef demixing_matrix_def = { .def = "0|0", .size_max 
= (255 + 255) * 255, .sep = '|' };
+
 #undef OFFSET
 #define OFFSET(x) offsetof(AVIAMFLayer, x)
 static const AVOption layer_options[] = {
@@ -269,6 +271,8 @@ static const AVOption layer_options[] = {
                    { .i64 = AV_IAMF_AMBISONICS_MODE_MONO },       .unit = 
"ambisonics_mode" },
         { "projection", NULL, 0, AV_OPT_TYPE_CONST,
                    { .i64 = AV_IAMF_AMBISONICS_MODE_PROJECTION }, .unit = 
"ambisonics_mode" },
+    { "demixing_matrix", "set demixing_matrix", OFFSET(demixing_matrix), 
AV_OPT_TYPE_RATIONAL | AV_OPT_TYPE_FLAG_ARRAY,
+            { .arr = &demixing_matrix_def }, -1.0, 1.0, FLAGS },
     { NULL },
 };
 
diff --git a/libavutil/iamf.h b/libavutil/iamf.h
index 855f64280a..a755e7d682 100644
--- a/libavutil/iamf.h
+++ b/libavutil/iamf.h
@@ -330,14 +330,17 @@ typedef struct AVIAMFLayer {
     /**
      * Demixing matrix as defined in section 3.6.3 of IAMF.
      *
-     * The length of the array is ch_layout.nb_channels multiplied by the sum 
of
-     * the amount of streams in the group plus the amount of streams in the 
group
-     * that are stereo.
-     *
      * May be set only if @ref ambisonics_mode == 
AV_IAMF_AMBISONICS_MODE_PROJECTION,
      * must be NULL otherwise.
      */
     AVRational *demixing_matrix;
+
+    /**
+     * The length of the Demixing matrix array. Must be ch_layout.nb_channels 
multiplied
+     * by the sum of the amount of streams in the group plus the amount of 
streams in
+     * the group that are stereo.
+     */
+    unsigned int nb_demixing_matrix;
 } AVIAMFLayer;
 
 
-- 
2.49.1


>From 2899dffac22a26d124aa413d581fb01ae1c68a29 Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 17:08:30 -0300
Subject: [PATCH 2/8] avformat/iamf_parse: fix setting denominator in
 AVIAMFLayer.demixing_matrix

The format of demixing_matrix is Q15 fixed point values.

Signed-off-by: James Almer <[email protected]>
---
 libavformat/iamf_parse.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavformat/iamf_parse.c b/libavformat/iamf_parse.c
index b9f24c0d6a..b7d6c64b70 100644
--- a/libavformat/iamf_parse.c
+++ b/libavformat/iamf_parse.c
@@ -587,7 +587,7 @@ static int ambisonics_config(void *s, AVIOContext *pb,
             return AVERROR(ENOMEM);
 
         for (int i = 0; i < demixing_matrix_size; i++)
-            layer->demixing_matrix[i] = av_make_q(sign_extend(avio_rb16(pb), 
16), 1 << 8);
+            layer->demixing_matrix[i] = av_make_q(sign_extend(avio_rb16(pb), 
16), 1 << 15);
 
         for (int i = 0; i < substream_count; i++) {
             IAMFSubStream *substream = &audio_element->substreams[i];
-- 
2.49.1


>From 458222b350b22d37d84e082e5ff2f11cf3cb3cc9 Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 17:10:35 -0300
Subject: [PATCH 3/8] avformat/iamf_parse: set AVIAMFLayer.nb_demixing_matrix

Signed-off-by: James Almer <[email protected]>
---
 libavformat/iamf_parse.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/libavformat/iamf_parse.c b/libavformat/iamf_parse.c
index b7d6c64b70..a31f7689b3 100644
--- a/libavformat/iamf_parse.c
+++ b/libavformat/iamf_parse.c
@@ -576,17 +576,19 @@ static int ambisonics_config(void *s, AVIOContext *pb,
             return ret;
     } else {
         int coupled_substream_count = avio_r8(pb);  // M
-        int nb_demixing_matrix = substream_count + coupled_substream_count;
-        int demixing_matrix_size = nb_demixing_matrix * output_channel_count;
+        int count = substream_count + coupled_substream_count;
+        int nb_demixing_matrix = count * output_channel_count;
 
         audio_element->layers->coupled_substream_count = 
coupled_substream_count;
 
         layer->ch_layout = (AVChannelLayout){ .order = 
AV_CHANNEL_ORDER_AMBISONIC, .nb_channels = output_channel_count };
-        layer->demixing_matrix = av_malloc_array(demixing_matrix_size, 
sizeof(*layer->demixing_matrix));
+        layer->demixing_matrix = av_malloc_array(nb_demixing_matrix, 
sizeof(*layer->demixing_matrix));
         if (!layer->demixing_matrix)
             return AVERROR(ENOMEM);
 
-        for (int i = 0; i < demixing_matrix_size; i++)
+        layer->nb_demixing_matrix = nb_demixing_matrix;
+
+        for (int i = 0; i < layer->nb_demixing_matrix; i++)
             layer->demixing_matrix[i] = av_make_q(sign_extend(avio_rb16(pb), 
16), 1 << 15);
 
         for (int i = 0; i < substream_count; i++) {
-- 
2.49.1


>From 1e17297ca568197321a4b11e6381d814c488994a Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 18:06:32 -0300
Subject: [PATCH 4/8] avformat/iamf_writer: fix writting some ambisonics fields
 in Audio Elements

The fields are defined as 8 bit long unsigned ints. Fortunately, writing most 
sane values
as leb is equivalent, which is why no tests are affected.

Signed-off-by: James Almer <[email protected]>
---
 libavformat/iamf_writer.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c
index b917a15978..44a32f0ce0 100644
--- a/libavformat/iamf_writer.c
+++ b/libavformat/iamf_writer.c
@@ -662,8 +662,8 @@ static int ambisonics_config(const IAMFAudioElement 
*audio_element,
     const AVIAMFLayer *layer = element->layers[0];
 
     ffio_write_leb(dyn_bc, 0); // ambisonics_mode
-    ffio_write_leb(dyn_bc, layer->ch_layout.nb_channels); // 
output_channel_count
-    ffio_write_leb(dyn_bc, audio_element->nb_substreams); // substream_count
+    avio_w8(dyn_bc, layer->ch_layout.nb_channels); // output_channel_count
+    avio_w8(dyn_bc, audio_element->nb_substreams); // substream_count
 
     if (layer->ch_layout.order == AV_CHANNEL_ORDER_AMBISONIC)
         for (int i = 0; i < layer->ch_layout.nb_channels; i++)
-- 
2.49.1


>From 8d82cc2a1caf19830c88b341ca13099a65bfe2ce Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 17:11:30 -0300
Subject: [PATCH 5/8] avformat/iamf_writer: add support for Projection type
 ambisonic Audio elements

Signed-off-by: James Almer <[email protected]>
---
 libavformat/iamf_writer.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c
index 44a32f0ce0..38b8879a0d 100644
--- a/libavformat/iamf_writer.c
+++ b/libavformat/iamf_writer.c
@@ -235,7 +235,7 @@ int ff_iamf_add_audio_element(IAMFContext *iamf, const 
AVStreamGroup *stg, void
             av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout for 
SCENE_BASED audio element\n");
             return AVERROR(EINVAL);
         }
-        if (layer->ambisonics_mode >= AV_IAMF_AMBISONICS_MODE_PROJECTION) {
+        if (layer->ambisonics_mode > AV_IAMF_AMBISONICS_MODE_PROJECTION) {
             av_log(log_ctx, AV_LOG_ERROR, "Unsupported ambisonics mode %d\n", 
layer->ambisonics_mode);
             return AVERROR_PATCHWELCOME;
         }
@@ -659,18 +659,28 @@ static int ambisonics_config(const IAMFAudioElement 
*audio_element,
                              AVIOContext *dyn_bc)
 {
     const AVIAMFAudioElement *element = audio_element->celement;
+    const IAMFLayer *ilayer = &audio_element->layers[0];
     const AVIAMFLayer *layer = element->layers[0];
 
-    ffio_write_leb(dyn_bc, 0); // ambisonics_mode
+    ffio_write_leb(dyn_bc, layer->ambisonics_mode);
     avio_w8(dyn_bc, layer->ch_layout.nb_channels); // output_channel_count
     avio_w8(dyn_bc, audio_element->nb_substreams); // substream_count
 
+    if (layer->ambisonics_mode == AV_IAMF_AMBISONICS_MODE_MONO) {
     if (layer->ch_layout.order == AV_CHANNEL_ORDER_AMBISONIC)
         for (int i = 0; i < layer->ch_layout.nb_channels; i++)
             avio_w8(dyn_bc, i);
     else
         for (int i = 0; i < layer->ch_layout.nb_channels; i++)
             avio_w8(dyn_bc, layer->ch_layout.u.map[i].id);
+    } else {
+        int nb_demixing_matrix = (ilayer->coupled_substream_count + 
ilayer->substream_count) * layer->ch_layout.nb_channels;
+        if (audio_element->nb_substreams != ilayer->substream_count || 
nb_demixing_matrix != layer->nb_demixing_matrix)
+            return AVERROR(EINVAL);
+        avio_w8(dyn_bc, ilayer->coupled_substream_count);
+        for (int i = 0; i < layer->nb_demixing_matrix; i++)
+            avio_wb16(dyn_bc, rescale_rational(layer->demixing_matrix[i], 1 << 
15));
+    }
 
     return 0;
 }
-- 
2.49.1


>From 91ceedcbf7ff67f81d9fcbd11f75205e35432204 Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 18:09:03 -0300
Subject: [PATCH 6/8] avformat/iamf_writer: reindent after the previous change

Signed-off-by: James Almer <[email protected]>
---
 libavformat/iamf_writer.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c
index 38b8879a0d..5fc92b282a 100644
--- a/libavformat/iamf_writer.c
+++ b/libavformat/iamf_writer.c
@@ -667,12 +667,12 @@ static int ambisonics_config(const IAMFAudioElement 
*audio_element,
     avio_w8(dyn_bc, audio_element->nb_substreams); // substream_count
 
     if (layer->ambisonics_mode == AV_IAMF_AMBISONICS_MODE_MONO) {
-    if (layer->ch_layout.order == AV_CHANNEL_ORDER_AMBISONIC)
-        for (int i = 0; i < layer->ch_layout.nb_channels; i++)
-            avio_w8(dyn_bc, i);
-    else
-        for (int i = 0; i < layer->ch_layout.nb_channels; i++)
-            avio_w8(dyn_bc, layer->ch_layout.u.map[i].id);
+        if (layer->ch_layout.order == AV_CHANNEL_ORDER_AMBISONIC)
+            for (int i = 0; i < layer->ch_layout.nb_channels; i++)
+                avio_w8(dyn_bc, i);
+        else
+            for (int i = 0; i < layer->ch_layout.nb_channels; i++)
+                avio_w8(dyn_bc, layer->ch_layout.u.map[i].id);
     } else {
         int nb_demixing_matrix = (ilayer->coupled_substream_count + 
ilayer->substream_count) * layer->ch_layout.nb_channels;
         if (audio_element->nb_substreams != ilayer->substream_count || 
nb_demixing_matrix != layer->nb_demixing_matrix)
-- 
2.49.1


>From ac2d7f4ac5b8a46da9390a7d62bc5776b33425ec Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 17:12:57 -0300
Subject: [PATCH 7/8] fftools/ffprobe: print demixing_matrix in Projection type
 ambisonic IAMF Audio Element groups

Signed-off-by: James Almer <[email protected]>
---
 fftools/ffprobe.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
index 17e0191844..ddd5654796 100644
--- a/fftools/ffprobe.c
+++ b/fftools/ffprobe.c
@@ -2078,6 +2078,10 @@ static void 
print_iamf_param_definition(AVTextFormatContext *tfc, const char *na
 static void print_iamf_audio_element_params(AVTextFormatContext *tfc, const 
AVStreamGroup *stg,
                                             const AVIAMFAudioElement 
*audio_element)
 {
+    AVBPrint pbuf;
+
+    av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED);
+
     avtext_print_section_header(tfc, stg, SECTION_ID_STREAM_GROUP_COMPONENT);
     print_int("nb_layers",          audio_element->nb_layers);
     print_int("audio_element_type", audio_element->audio_element_type);
@@ -2092,8 +2096,12 @@ static void 
print_iamf_audio_element_params(AVTextFormatContext *tfc, const AVSt
         if (audio_element->audio_element_type == 
AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL) {
             print_int("output_gain_flags", layer->output_gain_flags);
             print_q("output_gain",         layer->output_gain, '/');
-        } else if (audio_element->audio_element_type == 
AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE)
+        } else if (audio_element->audio_element_type == 
AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE) {
             print_int("ambisonics_mode",   layer->ambisonics_mode);
+            if (layer->ambisonics_mode == AV_IAMF_AMBISONICS_MODE_PROJECTION)
+                print_list_fmt("demixing_matrix", "%d/%d", 
layer->nb_demixing_matrix, 1, layer->demixing_matrix[idx].num,
+                                                                               
          layer->demixing_matrix[idx].den);
+        }
         avtext_print_section_footer(tfc); // 
SECTION_ID_STREAM_GROUP_SUBCOMPONENT
     }
     if (audio_element->demixing_info)
@@ -2104,6 +2112,8 @@ static void 
print_iamf_audio_element_params(AVTextFormatContext *tfc, const AVSt
                                     SECTION_ID_STREAM_GROUP_SUBCOMPONENT);
     avtext_print_section_footer(tfc); // SECTION_ID_STREAM_GROUP_SUBCOMPONENTS
     avtext_print_section_footer(tfc); // SECTION_ID_STREAM_GROUP_COMPONENT
+
+    av_bprint_finalize(&pbuf, NULL);
 }
 
 static void print_iamf_submix_params(AVTextFormatContext *tfc, const 
AVIAMFSubmix *submix)
-- 
2.49.1


>From 5bef1c9ff45630bd7e09aa3b23c51a2155f24b3a Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sat, 27 Dec 2025 17:13:56 -0300
Subject: [PATCH 8/8] tests/fate/iamf: add tests for Projection type ambisonic
 Audio Elements

Signed-off-by: James Almer <[email protected]>
---
 tests/fate/iamf.mak                           |  20 ++
 tests/ref/fate/iamf-ambisonic_1-projection    | 317 ++++++++++++++++++
 .../ref/fate/iamf-ambisonic_1-projection-copy | 275 +++++++++++++++
 .../fate/iamf-ambisonic_1-projection-demux    | 275 +++++++++++++++
 .../audio_element-ambisonic_1-projection      |   2 +
 5 files changed, 889 insertions(+)
 create mode 100644 tests/ref/fate/iamf-ambisonic_1-projection
 create mode 100644 tests/ref/fate/iamf-ambisonic_1-projection-copy
 create mode 100644 tests/ref/fate/iamf-ambisonic_1-projection-demux
 create mode 100644 tests/streamgroups/audio_element-ambisonic_1-projection

diff --git a/tests/fate/iamf.mak b/tests/fate/iamf.mak
index eddea66ba1..a686be7952 100644
--- a/tests/fate/iamf.mak
+++ b/tests/fate/iamf.mak
@@ -48,6 +48,16 @@ fate-iamf-ambisonic_1: CMD = transcode wav $(SRC) iamf 
"-auto_conversion_filters
   -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 -map [MONO0] -map 
[MONO1] -map [MONO2] -map [MONO3] -c:a flac -t 1" "-c:a copy -map 0" \
   "-show_entries 
stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id:stream_group_stream_disposition"
 
+FATE_IAMF-$(call TRANSCODE, FLAC, IAMF, WAV_DEMUXER PCM_S16LE_DECODER 
ARESAMPLE_FILTER) += fate-iamf-ambisonic_1-projection
+fate-iamf-ambisonic_1-projection: tests/data/asynth-44100-4.wav 
tests/data/filtergraphs/iamf_ambisonic_1 
tests/data/streamgroups/audio_element-ambisonic_1-projection 
tests/data/streamgroups/mix_presentation-ambisonic_1
+fate-iamf-ambisonic_1-projection: SRC = 
$(TARGET_PATH)/tests/data/asynth-44100-4.wav
+fate-iamf-ambisonic_1-projection: CMD = transcode wav $(SRC) iamf 
"-auto_conversion_filters \
+  -/filter_complex $(TARGET_PATH)/tests/data/filtergraphs/iamf_ambisonic_1 \
+  -/stream_group 
$(TARGET_PATH)/tests/data/streamgroups/audio_element-ambisonic_1-projection \
+  -/stream_group 
$(TARGET_PATH)/tests/data/streamgroups/mix_presentation-ambisonic_1 \
+  -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 -map [MONO0] -map 
[MONO1] -map [MONO2] -map [MONO3] -c:a flac -t 1" "-c:a copy -map 0" \
+  "-show_entries 
stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id:stream_group_stream_disposition"
+
 FATE_IAMF_SAMPLES-$(call FRAMECRC, IAMF, OPUS) += fate-iamf-stereo-demux
 fate-iamf-stereo-demux: CMD = stream_demux iamf 
$(TARGET_SAMPLES)/iamf/test_000076.iamf "" \
   "-c:a copy -frames:a 0 -map 0:g:\#42" \
@@ -63,6 +73,16 @@ fate-iamf-5_1-copy: CMD = stream_remux iamf 
$(TARGET_SAMPLES)/iamf/test_000059.i
   "-map 0 -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group 
map=0=1:stg=0 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3" "" "-c:a 
copy -frames:a 0 -map 0:g:i:42" \
   "-show_entries 
stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id:stream_group_stream_disposition"
 
+FATE_IAMF_SAMPLES-$(call FRAMECRC, IAMF, OPUS) += 
fate-iamf-ambisonic_1-projection-demux
+fate-iamf-ambisonic_1-projection-demux: CMD = stream_demux iamf 
$(TARGET_SAMPLES)/iamf/test_000113.iamf "" \
+  "-c:a copy -frames:a 0 -map 0:g:\#300" \
+  "-show_entries 
stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id:stream_group_stream_disposition"
+
+FATE_IAMF_SAMPLES-$(call REMUX, IAMF, OPUS_DECODER) += 
fate-iamf-ambisonic_1-projection-copy
+fate-iamf-ambisonic_1-projection-copy: CMD = stream_remux iamf 
$(TARGET_SAMPLES)/iamf/test_000113.iamf "" iamf \
+  "-map 0 -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group 
map=0=1:stg=0 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3" "" "-c:a 
copy -frames:a 0 -map 0:g:i:300" \
+  "-show_entries 
stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id:stream_group_stream_disposition"
+
 FATE_IAMF += $(FATE_IAMF-yes)
 FATE_IAMF_SAMPLES += $(FATE_IAMF_SAMPLES-yes)
 
diff --git a/tests/ref/fate/iamf-ambisonic_1-projection 
b/tests/ref/fate/iamf-ambisonic_1-projection
new file mode 100644
index 0000000000..78b5a743b6
--- /dev/null
+++ b/tests/ref/fate/iamf-ambisonic_1-projection
@@ -0,0 +1,317 @@
+b87b28ca89da92d540047e8ad30bd470 
*tests/data/fate/iamf-ambisonic_1-projection.iamf
+57035 tests/data/fate/iamf-ambisonic_1-projection.iamf
+#extradata 0:       34, 0xad120cfe
+#extradata 1:       34, 0xad120cfe
+#extradata 2:       34, 0xad120cfe
+#extradata 3:       34, 0xad120cfe
+#tb 0: 1/44100
+#media_type 0: audio
+#codec_id 0: flac
+#sample_rate 0: 44100
+#channel_layout_name 0: mono
+#tb 1: 1/44100
+#media_type 1: audio
+#codec_id 1: flac
+#sample_rate 1: 44100
+#channel_layout_name 1: mono
+#tb 2: 1/44100
+#media_type 2: audio
+#codec_id 2: flac
+#sample_rate 2: 44100
+#channel_layout_name 2: mono
+#tb 3: 1/44100
+#media_type 3: audio
+#codec_id 3: flac
+#sample_rate 3: 44100
+#channel_layout_name 3: mono
+0,          0,          0,     4608,     1396, 0x0dcb5677
+1,          0,          0,     4608,     1396, 0x0dcb5677
+2,          0,          0,     4608,     1396, 0x0dcb5677
+3,          0,          0,     4608,     1396, 0x0dcb5677
+0,       4608,       4608,     4608,     1439, 0xc46b5ac5
+1,       4608,       4608,     4608,     1439, 0xc46b5ac5
+2,       4608,       4608,     4608,     1439, 0xc46b5ac5
+3,       4608,       4608,     4608,     1439, 0xc46b5ac5
+0,       9216,       9216,     4608,     1377, 0x5b2a55fe
+1,       9216,       9216,     4608,     1377, 0x5b2a55fe
+2,       9216,       9216,     4608,     1377, 0x5b2a55fe
+3,       9216,       9216,     4608,     1377, 0x5b2a55fe
+0,      13824,      13824,     4608,     1380, 0x045550d3
+1,      13824,      13824,     4608,     1380, 0x045550d3
+2,      13824,      13824,     4608,     1380, 0x045550d3
+3,      13824,      13824,     4608,     1380, 0x045550d3
+0,      18432,      18432,     4608,     1568, 0xa2bc45f4
+1,      18432,      18432,     4608,     1568, 0xa2bc45f4
+2,      18432,      18432,     4608,     1568, 0xa2bc45f4
+3,      18432,      18432,     4608,     1568, 0xa2bc45f4
+0,      23040,      23040,     4608,     1388, 0x96c85007
+1,      23040,      23040,     4608,     1388, 0x96c85007
+2,      23040,      23040,     4608,     1388, 0x96c85007
+3,      23040,      23040,     4608,     1388, 0x96c85007
+0,      27648,      27648,     4608,     1419, 0x4d4d466a
+1,      27648,      27648,     4608,     1419, 0x4d4d466a
+2,      27648,      27648,     4608,     1419, 0x4d4d466a
+3,      27648,      27648,     4608,     1419, 0x4d4d466a
+0,      32256,      32256,     4608,     1765, 0xacb84b24
+1,      32256,      32256,     4608,     1765, 0xacb84b24
+2,      32256,      32256,     4608,     1765, 0xacb84b24
+3,      32256,      32256,     4608,     1765, 0xacb84b24
+0,      36864,      36864,     4608,     1531, 0x996458aa
+1,      36864,      36864,     4608,     1531, 0x996458aa
+2,      36864,      36864,     4608,     1531, 0x996458aa
+3,      36864,      36864,     4608,     1531, 0x996458aa
+0,      41472,      41472,     4608,      923, 0xa7225edf
+1,      41472,      41472,     4608,      923, 0xa7225edf
+2,      41472,      41472,     4608,      923, 0xa7225edf
+3,      41472,      41472,     4608,      923, 0xa7225edf
+[STREAM_GROUP]
+index=0
+id=0x1
+nb_streams=4
+type=IAMF Audio Element
+[COMPONENT]
+nb_layers=1
+audio_element_type=1
+default_w=0
+[SUBCOMPONENT]
+channel_layout=ambisonic 1
+ambisonics_mode=1
+demixing_matrix=32767/32768 0/32768 0/32768 0/32768 0/32768 32767/32768 
0/32768 0/32768 0/32768 0/32768 32767/32768 0/32768 0/32768 0/32768 0/32768 
32767/32768
+[/SUBCOMPONENT]
+[/COMPONENT]
+[STREAM]
+index=0
+id=0x0
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=1
+id=0x1
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x2
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[/STREAM_GROUP]
+[STREAM_GROUP]
+index=1
+id=0x2
+nb_streams=4
+type=IAMF Mix Presentation
+[COMPONENT]
+nb_submixes=1
+[SUBCOMPONENT]
+en-us=Mix_Presentation
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+nb_elements=1
+nb_layouts=1
+default_mix_gain=0/256
+[PIECE]
+stream_id=1
+default_mix_gain=0/256
+headphones_rendering_mode=0
+[SUBPIECE]
+en-us=Stereo_Submix
+[/SUBPIECE]
+[SUBPIECE]
+name=element_mix_config
+nb_subblocks=0
+type=0
+parameter_id=100
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/SUBPIECE]
+[/PIECE]
+[PIECE]
+name=output_mix_config
+nb_subblocks=0
+type=0
+parameter_id=100
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/PIECE]
+[PIECE]
+sound_system=stereo
+integrated_loudness=0/256
+digital_peak=0/256
+true_peak=0/1
+dialogue_anchored_loudness=0/1
+album_anchored_loudness=0/1
+[/PIECE]
+[/SUBCOMPONENT]
+[/COMPONENT]
+[STREAM]
+index=0
+id=0x0
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=1
+id=0x1
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x2
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[/STREAM_GROUP]
diff --git a/tests/ref/fate/iamf-ambisonic_1-projection-copy 
b/tests/ref/fate/iamf-ambisonic_1-projection-copy
new file mode 100644
index 0000000000..f38d0f7117
--- /dev/null
+++ b/tests/ref/fate/iamf-ambisonic_1-projection-copy
@@ -0,0 +1,275 @@
+#extradata 0:       19, 0x3a04048f
+#extradata 1:       19, 0x3a04048f
+#extradata 2:       19, 0x3a04048f
+#extradata 3:       19, 0x3a04048f
+#tb 0: 1/48000
+#media_type 0: audio
+#codec_id 0: opus
+#sample_rate 0: 48000
+#channel_layout_name 0: mono
+#tb 1: 1/48000
+#media_type 1: audio
+#codec_id 1: opus
+#sample_rate 1: 48000
+#channel_layout_name 1: mono
+#tb 2: 1/48000
+#media_type 2: audio
+#codec_id 2: opus
+#sample_rate 2: 48000
+#channel_layout_name 2: mono
+#tb 3: 1/48000
+#media_type 3: audio
+#codec_id 3: opus
+#sample_rate 3: 48000
+#channel_layout_name 3: mono
+[STREAM_GROUP]
+index=0
+id=0x12c
+nb_streams=4
+type=IAMF Audio Element
+[COMPONENT]
+nb_layers=1
+audio_element_type=1
+default_w=0
+[SUBCOMPONENT]
+channel_layout=ambisonic 1
+ambisonics_mode=1
+demixing_matrix=32767/32768 0/32768 0/32768 0/32768 0/32768 32767/32768 
0/32768 0/32768 0/32768 0/32768 32767/32768 0/32768 0/32768 0/32768 0/32768 
32767/32768
+[/SUBCOMPONENT]
+[/COMPONENT]
+[STREAM]
+index=0
+id=0x0
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=1
+id=0x1
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x2
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[/STREAM_GROUP]
+[STREAM_GROUP]
+index=1
+id=0x2a
+nb_streams=4
+type=IAMF Mix Presentation
+[COMPONENT]
+nb_submixes=1
+[SUBCOMPONENT]
+en-us=test_mix_pres
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+nb_elements=1
+nb_layouts=1
+default_mix_gain=0/256
+[PIECE]
+stream_id=300
+default_mix_gain=0/256
+headphones_rendering_mode=0
+[SUBPIECE]
+en-us=test_sub_mix_0_audio_element_0
+[/SUBPIECE]
+[SUBPIECE]
+name=element_mix_config
+nb_subblocks=0
+type=0
+parameter_id=999
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/SUBPIECE]
+[/PIECE]
+[PIECE]
+name=output_mix_config
+nb_subblocks=0
+type=0
+parameter_id=998
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/PIECE]
+[PIECE]
+sound_system=stereo
+integrated_loudness=-2631/256
+digital_peak=0/256
+true_peak=0/1
+dialogue_anchored_loudness=0/1
+album_anchored_loudness=0/1
+[/PIECE]
+[/SUBCOMPONENT]
+[/COMPONENT]
+[STREAM]
+index=0
+id=0x0
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=1
+id=0x1
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x2
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[/STREAM_GROUP]
diff --git a/tests/ref/fate/iamf-ambisonic_1-projection-demux 
b/tests/ref/fate/iamf-ambisonic_1-projection-demux
new file mode 100644
index 0000000000..f38d0f7117
--- /dev/null
+++ b/tests/ref/fate/iamf-ambisonic_1-projection-demux
@@ -0,0 +1,275 @@
+#extradata 0:       19, 0x3a04048f
+#extradata 1:       19, 0x3a04048f
+#extradata 2:       19, 0x3a04048f
+#extradata 3:       19, 0x3a04048f
+#tb 0: 1/48000
+#media_type 0: audio
+#codec_id 0: opus
+#sample_rate 0: 48000
+#channel_layout_name 0: mono
+#tb 1: 1/48000
+#media_type 1: audio
+#codec_id 1: opus
+#sample_rate 1: 48000
+#channel_layout_name 1: mono
+#tb 2: 1/48000
+#media_type 2: audio
+#codec_id 2: opus
+#sample_rate 2: 48000
+#channel_layout_name 2: mono
+#tb 3: 1/48000
+#media_type 3: audio
+#codec_id 3: opus
+#sample_rate 3: 48000
+#channel_layout_name 3: mono
+[STREAM_GROUP]
+index=0
+id=0x12c
+nb_streams=4
+type=IAMF Audio Element
+[COMPONENT]
+nb_layers=1
+audio_element_type=1
+default_w=0
+[SUBCOMPONENT]
+channel_layout=ambisonic 1
+ambisonics_mode=1
+demixing_matrix=32767/32768 0/32768 0/32768 0/32768 0/32768 32767/32768 
0/32768 0/32768 0/32768 0/32768 32767/32768 0/32768 0/32768 0/32768 0/32768 
32767/32768
+[/SUBCOMPONENT]
+[/COMPONENT]
+[STREAM]
+index=0
+id=0x0
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=1
+id=0x1
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x2
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[/STREAM_GROUP]
+[STREAM_GROUP]
+index=1
+id=0x2a
+nb_streams=4
+type=IAMF Mix Presentation
+[COMPONENT]
+nb_submixes=1
+[SUBCOMPONENT]
+en-us=test_mix_pres
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+nb_elements=1
+nb_layouts=1
+default_mix_gain=0/256
+[PIECE]
+stream_id=300
+default_mix_gain=0/256
+headphones_rendering_mode=0
+[SUBPIECE]
+en-us=test_sub_mix_0_audio_element_0
+[/SUBPIECE]
+[SUBPIECE]
+name=element_mix_config
+nb_subblocks=0
+type=0
+parameter_id=999
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/SUBPIECE]
+[/PIECE]
+[PIECE]
+name=output_mix_config
+nb_subblocks=0
+type=0
+parameter_id=998
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/PIECE]
+[PIECE]
+sound_system=stereo
+integrated_loudness=-2631/256
+digital_peak=0/256
+true_peak=0/1
+dialogue_anchored_loudness=0/1
+album_anchored_loudness=0/1
+[/PIECE]
+[/SUBCOMPONENT]
+[/COMPONENT]
+[STREAM]
+index=0
+id=0x0
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=1
+id=0x1
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x2
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
+[/STREAM]
+[/STREAM_GROUP]
diff --git a/tests/streamgroups/audio_element-ambisonic_1-projection 
b/tests/streamgroups/audio_element-ambisonic_1-projection
new file mode 100644
index 0000000000..18a75babd6
--- /dev/null
+++ b/tests/streamgroups/audio_element-ambisonic_1-projection
@@ -0,0 +1,2 @@
+type=iamf_audio_element:id=1:st=0:st=1:st=2:st=3:audio_element_type=scene,
+layer=ch_layout=ambisonic 
1:ambisonics_mode=projection:demixing_matrix=32767/32768|0/32768|0/32768|0/32768|0/32768|32767/32768|0/32768|0/32768|0/32768|0/32768|32767/32768|0/32768|0/32768|0/32768|0/32768|32767/32768,
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to