James Almer:
> Signed-off-by: James Almer
> ---
> libavformat/movenc.c | 349 +++
> libavformat/movenc.h | 6 +
> 2 files changed, 293 insertions(+), 62 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index c71a9983ed..cd63b353b8 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -32,6 +32,7 @@
> #include "dovi_isom.h"
> #include "riff.h"
> #include "avio.h"
> +#include "iamf_writer.h"
> #include "isom.h"
> #include "av1.h"
> #include "avc.h"
> @@ -41,12 +42,14 @@
> #include "libavcodec/flac.h"
> #include "libavcodec/get_bits.h"
>
> +#include "libavcodec/bsf.h"
> #include "libavcodec/internal.h"
> #include "libavcodec/put_bits.h"
> #include "libavcodec/vc1_common.h"
> #include "libavcodec/raw.h"
> #include "internal.h"
> #include "libavutil/avstring.h"
> +#include "libavutil/bprint.h"
> #include "libavutil/channel_layout.h"
> #include "libavutil/csp.h"
> #include "libavutil/intfloat.h"
> @@ -316,6 +319,32 @@ static int mov_write_sdtp_tag(AVIOContext *pb, MOVTrack
> *track)
> return update_size(pb, pos);
> }
>
> +static int mov_write_iacb_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack
> *track)
> +{
> +AVIOContext *dyn_bc;
> +int64_t pos = avio_tell(pb);
> +uint8_t *dyn_buf = NULL;
> +int dyn_size;
> +int ret = avio_open_dyn_buf(_bc);
> +if (ret < 0)
> +return ret;
> +
> +avio_wb32(pb, 0);
> +ffio_wfourcc(pb, "iacb");
> +avio_w8(pb, 1); // configurationVersion
> +
> +ret = ff_iamf_write_descriptors(track->iamf, dyn_bc, s);
> +if (ret < 0)
> +return ret;
> +
> +dyn_size = avio_close_dyn_buf(dyn_bc, _buf);
> +ffio_write_leb(pb, dyn_size);
> +avio_write(pb, dyn_buf, dyn_size);
> +av_free(dyn_buf);
> +
> +return update_size(pb, pos);
> +}
> +
> static int mov_write_amr_tag(AVIOContext *pb, MOVTrack *track)
> {
> avio_wb32(pb, 0x11); /* size */
> @@ -1358,6 +1387,8 @@ static int mov_write_audio_tag(AVFormatContext *s,
> AVIOContext *pb, MOVMuxContex
> ret = mov_write_wave_tag(s, pb, track);
> else if (track->tag == MKTAG('m','p','4','a'))
> ret = mov_write_esds_tag(pb, track);
> +else if (track->tag == MKTAG('i','a','m','f'))
> +ret = mov_write_iacb_tag(mov->fc, pb, track);
> else if (track->par->codec_id == AV_CODEC_ID_AMR_NB)
> ret = mov_write_amr_tag(pb, track);
> else if (track->par->codec_id == AV_CODEC_ID_AC3)
> @@ -2529,7 +2560,7 @@ static int mov_write_video_tag(AVFormatContext *s,
> AVIOContext *pb, MOVMuxContex
>
> if (track->mode == MODE_AVIF) {
> mov_write_ccst_tag(pb);
> -if (s->nb_streams > 0 && track == >tracks[1])
> +if (mov->nb_streams > 0 && track == >tracks[1])
> mov_write_aux_tag(pb, "auxi");
> }
>
> @@ -3124,9 +3155,9 @@ static int mov_write_iloc_tag(AVIOContext *pb,
> MOVMuxContext *mov, AVFormatConte
> avio_wb32(pb, 0); /* Version & flags */
> avio_w8(pb, (4 << 4) + 4); /* offset_size(4) and length_size(4) */
> avio_w8(pb, 0); /* base_offset_size(4) and reserved(4) */
> -avio_wb16(pb, s->nb_streams); /* item_count */
> +avio_wb16(pb, mov->nb_streams); /* item_count */
>
> -for (int i = 0; i < s->nb_streams; i++) {
> +for (int i = 0; i < mov->nb_streams; i++) {
> avio_wb16(pb, i + 1); /* item_id */
> avio_wb16(pb, 0); /* data_reference_index */
> avio_wb16(pb, 1); /* extent_count */
> @@ -3145,9 +3176,9 @@ static int mov_write_iinf_tag(AVIOContext *pb,
> MOVMuxContext *mov, AVFormatConte
> avio_wb32(pb, 0); /* size */
> ffio_wfourcc(pb, "iinf");
> avio_wb32(pb, 0); /* Version & flags */
> -avio_wb16(pb, s->nb_streams); /* entry_count */
> +avio_wb16(pb, mov->nb_streams); /* entry_count */
>
> -for (int i = 0; i < s->nb_streams; i++) {
> +for (int i = 0; i < mov->nb_streams; i++) {
> int64_t infe_pos = avio_tell(pb);
> avio_wb32(pb, 0); /* size */
> ffio_wfourcc(pb, "infe");
> @@ -3216,7 +3247,7 @@ static int mov_write_ipco_tag(AVIOContext *pb,
> MOVMuxContext *mov, AVFormatConte
> int64_t pos = avio_tell(pb);
> avio_wb32(pb, 0); /* size */
> ffio_wfourcc(pb, "ipco");
> -for (int i = 0; i < s->nb_streams; i++) {
> +for (int i = 0; i < mov->nb_streams; i++) {
> mov_write_ispe_tag(pb, mov, s, i);
> mov_write_pixi_tag(pb, mov, s, i);
> mov_write_av1c_tag(pb, >tracks[i]);
> @@ -3234,9 +3265,9 @@ static int mov_write_ipma_tag(AVIOContext *pb,
> MOVMuxContext *mov, AVFormatConte
> avio_wb32(pb, 0); /* size */
> ffio_wfourcc(pb, "ipma");
> avio_wb32(pb, 0); /* Version & flags */
> -avio_wb32(pb, s->nb_streams); /* entry_count */
> +avio_wb32(pb, mov->nb_streams); /* entry_count */
>
> -for (int i = 0, index = 1; i < s->nb_streams; i++) {
> +for (int i = 0, index = 1; i <