The branch, master has been updated via 9d037c54f209958d47ac376d2a9561608f98dfae (commit) from cd21fa41c70bdc03660e0566649e9cf2bd7441b7 (commit)
- Log ----------------------------------------------------------------- commit 9d037c54f209958d47ac376d2a9561608f98dfae Author: nilfm <nil.f...@gmail.com> AuthorDate: Wed Jul 2 14:37:24 2025 -0400 Commit: Kyle Swanson <kswan...@netflix.com> CommitDate: Wed Sep 3 10:44:02 2025 -0700 avformat/demux: avoid unconditional ID3v2 tag consumption ID3v2 headers are now only parsed for formats that explicitly support them, avoiding premature data consumption that broke demuxing in other formats. Introduces AVFMT_FLAG_ID3V2_AUTO and applies it to mp3, aac, tta, and wav. Signed-off-by: nilfm <nil.f...@gmail.com> diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c index 0b4bd69dd2..21d63ce189 100644 --- a/libavformat/aacdec.c +++ b/libavformat/aacdec.c @@ -208,7 +208,7 @@ retry: const FFInputFormat ff_aac_demuxer = { .p.name = "aac", .p.long_name = NULL_IF_CONFIG_SMALL("raw ADTS AAC (Advanced Audio Coding)"), - .p.flags = AVFMT_GENERIC_INDEX, + .p.flags = AVFMT_GENERIC_INDEX | AVFMT_FLAG_ID3V2_AUTO, .p.extensions = "aac", .p.mime_type = "audio/aac,audio/aacp,audio/x-aac", .read_probe = adts_aac_probe, diff --git a/libavformat/avformat.h b/libavformat/avformat.h index be6e532387..75c8a4703b 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1435,6 +1435,7 @@ typedef struct AVFormatContext { #define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) #define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats #define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Add bitstream filters as requested by the muxer +#define AVFMT_FLAG_ID3V2_AUTO 0x400000 ///< Automatically parse ID3v2 metadata /** * Maximum number of bytes read from input in order to determine stream diff --git a/libavformat/demux.c b/libavformat/demux.c index 3749ab67a3..dfc146d9c4 100644 --- a/libavformat/demux.c +++ b/libavformat/demux.c @@ -214,6 +214,10 @@ static int update_stream_avctx(AVFormatContext *s) return 0; } +static av_always_inline int is_id3v2_format(const AVInputFormat *fmt) { + return fmt->flags & AVFMT_FLAG_ID3V2_AUTO; +} + int avformat_open_input(AVFormatContext **ps, const char *filename, const AVInputFormat *fmt, AVDictionary **options) { @@ -302,7 +306,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, } /* e.g. AVFMT_NOFILE formats will not have an AVIOContext */ - if (s->pb) + if (s->pb && is_id3v2_format(s->iformat)) ff_id3v2_read_dict(s->pb, &si->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta); if (ffifmt(s->iformat)->read_header) @@ -321,8 +325,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, } if (id3v2_extra_meta) { - if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") || - !strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) { + if (is_id3v2_format(s->iformat)) { if ((ret = ff_id3v2_parse_apic(s, id3v2_extra_meta)) < 0) goto close; if ((ret = ff_id3v2_parse_chapters(s, id3v2_extra_meta)) < 0) diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c index 31eeb68ebb..9cfc711493 100644 --- a/libavformat/mp3dec.c +++ b/libavformat/mp3dec.c @@ -618,7 +618,7 @@ static const AVClass demuxer_class = { const FFInputFormat ff_mp3_demuxer = { .p.name = "mp3", .p.long_name = NULL_IF_CONFIG_SMALL("MP2/3 (MPEG audio layer 2/3)"), - .p.flags = AVFMT_GENERIC_INDEX, + .p.flags = AVFMT_GENERIC_INDEX | AVFMT_FLAG_ID3V2_AUTO, .p.extensions = "mp2,mp3,m2a,mpa", /* XXX: use probe */ .p.priv_class = &demuxer_class, .p.mime_type = "audio/mpeg", diff --git a/libavformat/tta.c b/libavformat/tta.c index fdc18216c8..26335202c7 100644 --- a/libavformat/tta.c +++ b/libavformat/tta.c @@ -191,6 +191,7 @@ static int tta_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp const FFInputFormat ff_tta_demuxer = { .p.name = "tta", .p.long_name = NULL_IF_CONFIG_SMALL("TTA (True Audio)"), + .p.flags = AVFMT_FLAG_ID3V2_AUTO, .p.extensions = "tta", .priv_data_size = sizeof(TTAContext), .read_probe = tta_probe, diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c index c65e0a2723..4c47a5f05c 100644 --- a/libavformat/wavdec.c +++ b/libavformat/wavdec.c @@ -1011,7 +1011,7 @@ static const AVClass w64_demuxer_class = { const FFInputFormat ff_w64_demuxer = { .p.name = "w64", .p.long_name = NULL_IF_CONFIG_SMALL("Sony Wave64"), - .p.flags = AVFMT_GENERIC_INDEX, + .p.flags = AVFMT_GENERIC_INDEX | AVFMT_FLAG_ID3V2_AUTO, .p.codec_tag = ff_wav_codec_tags_list, .p.priv_class = &w64_demuxer_class, .priv_data_size = sizeof(WAVDemuxContext), ----------------------------------------------------------------------- Summary of changes: libavformat/aacdec.c | 2 +- libavformat/avformat.h | 1 + libavformat/demux.c | 9 ++++++--- libavformat/mp3dec.c | 2 +- libavformat/tta.c | 1 + libavformat/wavdec.c | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) hooks/post-receive -- _______________________________________________ ffmpeg-cvslog mailing list -- ffmpeg-cvslog@ffmpeg.org To unsubscribe send an email to ffmpeg-cvslog-le...@ffmpeg.org