This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 8cd4d4cb0bab973f0f45d99b1ce01fa85e1a7333
Author:     James Almer <[email protected]>
AuthorDate: Sat Dec 27 17:11:30 2025 -0300
Commit:     James Almer <[email protected]>
CommitDate: Mon Dec 29 12:02:02 2025 -0300

    avformat/iamf_writer: add support for Projection mode ambisonic Audio 
elements
    
    Signed-off-by: James Almer <[email protected]>
---
 Changelog                 |  1 +
 libavformat/iamf_writer.c | 13 +++++++++++--
 libavformat/version.h     |  2 +-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/Changelog b/Changelog
index 569c7ffad8..2f97b280cb 100644
--- a/Changelog
+++ b/Changelog
@@ -18,6 +18,7 @@ version <next>:
 - JPEG-XS parser
 - JPEG-XS decoder and encoder through libsvtjpegxs
 - JPEG-XS raw bitstream muxer and demuxer
+- IAMF Projection mode Ambisonic Audio Elements muxing and demuxing
 
 
 version 8.0:
diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c
index fc8e492c66..0a03367fbb 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;
         }
@@ -665,16 +665,25 @@ static int ambisonics_config(const IAMFAudioElement 
*audio_element,
     if (audio_element->nb_substreams != ilayer->substream_count)
         return AVERROR(EINVAL);
 
-    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 (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;
 }
diff --git a/libavformat/version.h b/libavformat/version.h
index 392211f6b0..1d3a53875a 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,7 +32,7 @@
 #include "version_major.h"
 
 #define LIBAVFORMAT_VERSION_MINOR   8
-#define LIBAVFORMAT_VERSION_MICRO 101
+#define LIBAVFORMAT_VERSION_MICRO 102
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \

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

Reply via email to