diff --git a/configure b/configure index 2d46ef0b9c..1c5b4f3fa4 100755 --- a/configure +++ b/configure @@ -140,6 +140,7 @@ Component options: --disable-error-resilience disable error resilience code --disable-lsp disable LSP code --disable-faan disable floating point AAN (I)DCT code + --disable-iamf disable support for Immersive Audio Model --disable-pixelutils disable pixel utils in libavutil Individual component options: @@ -2070,6 +2071,7 @@ SUBSYSTEM_LIST=" error_resilience faan fast_unaligned + iamf lsp pixelutils network @@ -2851,6 +2853,8 @@ h264_sei_select="atsc_a53 golomb" hevcparse_select="golomb" hevc_sei_select="atsc_a53 golomb" frame_thread_encoder_deps="encoders threads" +iamfdec_deps="iamf" +iamfenc_deps="iamf" inflate_wrapper_deps="zlib" intrax8_select="blockdsp wmv2dsp" iso_media_select="mpeg4audio" @@ -3590,8 +3594,8 @@ gxf_muxer_select="pcm_rechunk_bsf" hds_muxer_select="flv_muxer" hls_demuxer_select="aac_demuxer ac3_demuxer adts_header ac3_parser eac3_demuxer mov_demuxer mpegts_demuxer" hls_muxer_select="mov_muxer mpegts_muxer" -iamf_demuxer_select="iamfdec" -iamf_muxer_select="iamfenc" +iamf_demuxer_deps="iamfdec" +iamf_muxer_deps="iamfenc" image2_alias_pix_demuxer_select="image2_demuxer" image2_brender_pix_demuxer_select="image2_demuxer" imf_demuxer_deps="libxml2" @@ -3606,9 +3610,9 @@ matroska_demuxer_suggest="bzlib zlib" matroska_muxer_select="mpeg4audio riffenc aac_adtstoasc_bsf pgs_frame_merge_bsf vp9_superframe_bsf" mlp_demuxer_select="mlp_parser" mmf_muxer_select="riffenc" -mov_demuxer_select="iso_media riffdec iamfdec" +mov_demuxer_select="iso_media riffdec" mov_demuxer_suggest="zlib" -mov_muxer_select="iso_media riffenc rtpenc_chain vp9_superframe_bsf aac_adtstoasc_bsf ac3_parser iamfenc" +mov_muxer_select="iso_media riffenc rtpenc_chain vp9_superframe_bsf aac_adtstoasc_bsf ac3_parser" mp3_demuxer_select="mpegaudio_parser" mp3_muxer_select="mpegaudioheader" mp4_muxer_select="mov_muxer" @@ -4079,6 +4083,7 @@ enable asm enable debug enable doc enable faan faandct faanidct +enable iamf iamfdec iamfenc enable large_tests enable optimizations enable ptx_compression diff --git a/libavformat/mov.c b/libavformat/mov.c index b96a02b0d9..0c892b56c8 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -863,6 +863,7 @@ static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +#if CONFIG_IAMFDEC static int mov_read_iacb(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; @@ -1042,6 +1043,7 @@ fail: return ret; } +#endif static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom) { @@ -4810,6 +4812,7 @@ static void fix_timescale(MOVContext *c, MOVStreamContext *sc) } } +#if CONFIG_IAMFDEC static int mov_update_iamf_streams(MOVContext *c, const AVStream *st) { const MOVStreamContext *sc = st->priv_data; @@ -4853,6 +4856,7 @@ static int mov_update_iamf_streams(MOVContext *c, const AVStream *st) return 0; } +#endif static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) { @@ -4917,11 +4921,13 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) mov_build_index(c, st); +#if CONFIG_IAMFDEC if (sc->iamf) { ret = mov_update_iamf_streams(c, st); if (ret < 0) return ret; } +#endif if (sc->dref_id-1 < sc->drefs_count && sc->drefs[sc->dref_id-1].path) { MOVDref *dref = &sc->drefs[sc->dref_id - 1]; @@ -8573,7 +8579,9 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('i','p','r','p'), mov_read_iprp }, { MKTAG('i','i','n','f'), mov_read_iinf }, { MKTAG('a','m','v','e'), mov_read_amve }, /* ambient viewing environment box */ +#if CONFIG_IAMFDEC { MKTAG('i','a','c','b'), mov_read_iacb }, +#endif { 0, NULL } }; @@ -9045,8 +9053,10 @@ static void mov_free_stream_context(AVFormatContext *s, AVStream *st) av_freep(&sc->coll); av_freep(&sc->ambient); +#if CONFIG_IAMFDEC if (sc->iamf) ff_iamf_read_deinit(sc->iamf); +#endif av_freep(&sc->iamf); } @@ -9951,6 +9961,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) if (st->codecpar->codec_id == AV_CODEC_ID_EIA_608 && sample->size > 8) ret = get_eia608_packet(sc->pb, pkt, sample->size); +#if CONFIG_IAMFDEC else if (sc->iamf) { int64_t pts, dts, pos, duration; int flags, size = sample->size; @@ -9973,7 +9984,9 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) } if (!ret) return FFERROR_REDO; - } else + } +#endif + else ret = av_get_packet(sc->pb, pkt, sample->size); if (ret < 0) { if (should_retry(sc->pb, ret)) { diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 46a5b3a62f..15b65dcf96 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -318,6 +318,7 @@ static int mov_write_sdtp_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } +#if CONFIG_IAMFENC static int mov_write_iacb_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) { AVIOContext *dyn_bc; @@ -343,6 +344,7 @@ static int mov_write_iacb_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra return update_size(pb, pos); } +#endif static int mov_write_amr_tag(AVIOContext *pb, MOVTrack *track) { @@ -1386,8 +1388,10 @@ 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); +#if CONFIG_IAMFENC else if (track->tag == MKTAG('i','a','m','f')) ret = mov_write_iacb_tag(mov->fc, pb, track); +#endif 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) @@ -5520,6 +5524,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) int has_h264 = 0, has_av1 = 0, has_video = 0, has_dolby = 0; int has_iamf = 0; +#if CONFIG_IAMFENC for (int i = 0; i < s->nb_stream_groups; i++) { const AVStreamGroup *stg = s->stream_groups[i]; @@ -5529,6 +5534,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) break; } } +#endif for (int i = 0; i < mov->nb_streams; i++) { AVStream *st = mov->tracks[i].st; if (is_cover_image(st)) @@ -6655,6 +6661,7 @@ static int mov_write_subtitle_end_packet(AVFormatContext *s, return ret; } +#if CONFIG_IAMFENC static int mov_build_iamf_packet(AVFormatContext *s, MOVTrack *trk, AVPacket *pkt) { int ret; @@ -6705,6 +6712,7 @@ static int mov_build_iamf_packet(AVFormatContext *s, MOVTrack *trk, AVPacket *pk return ret; } +#endif static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) { @@ -6718,6 +6726,7 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk = s->streams[pkt->stream_index]->priv_data; +#if CONFIG_IAMFENC if (trk->iamf) { int ret = mov_build_iamf_packet(s, trk, pkt); if (ret < 0) { @@ -6728,6 +6737,7 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) return ret; } } +#endif if (is_cover_image(trk->st)) { int ret; @@ -7067,10 +7077,12 @@ static void mov_free(AVFormatContext *s) ff_mov_cenc_free(&track->cenc); ffio_free_dyn_buf(&track->mdat_buf); +#if CONFIG_IAMFENC ffio_free_dyn_buf(&track->iamf_buf); if (track->iamf) ff_iamf_uninit_context(track->iamf); av_freep(&track->iamf); +#endif avpriv_packet_list_free(&track->squashed_packet_queue); } @@ -7145,6 +7157,7 @@ static int mov_create_dvd_sub_decoder_specific_info(MOVTrack *track, return 0; } +#if CONFIG_IAMFENC static int mov_init_iamf_track(AVFormatContext *s) { MOVMuxContext *mov = s->priv_data; @@ -7204,6 +7217,7 @@ static int mov_init_iamf_track(AVFormatContext *s) return 0; } +#endif static int mov_init(AVFormatContext *s) { @@ -7342,6 +7356,7 @@ static int mov_init(AVFormatContext *s) s->streams[0]->disposition |= AV_DISPOSITION_DEFAULT; } +#if CONFIG_IAMFENC for (i = 0; i < s->nb_stream_groups; i++) { AVStreamGroup *stg = s->stream_groups[i]; @@ -7362,6 +7377,7 @@ static int mov_init(AVFormatContext *s) if (!mov->nb_tracks) // We support one track for the entire IAMF structure mov->nb_tracks++; } +#endif for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; @@ -7447,9 +7463,11 @@ static int mov_init(AVFormatContext *s) } } +#if CONFIG_IAMFENC ret = mov_init_iamf_track(s); if (ret < 0) return ret; +#endif for (int j = 0, i = 0; j < s->nb_streams; j++) { AVStream *st = s->streams[j];