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]
