* [FFmpeg-devel] [PATCH] iamf: add support for Projection type ambisonic Audio Elements (PR #21303)
@ 2025-12-27 21:29 James Almer via ffmpeg-devel
0 siblings, 0 replies; only message in thread
From: James Almer via ffmpeg-devel @ 2025-12-27 21:29 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: James Almer
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 <jamrial@gmail.com>
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 <jamrial@gmail.com>
---
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 -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-12-27 21:30 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-27 21:29 [FFmpeg-devel] [PATCH] iamf: add support for Projection type ambisonic Audio Elements (PR #21303) James Almer via ffmpeg-devel
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git