PR #25811 opened by luoye-cpu URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25811 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25811.patch
## Summary `get_score()` returns 0 as soon as an IA Sequence Header OBU does not start with the "iamf" magic. `iamf_probe()` stops its loop on any non-negative return value, so the Audio Frame OBUs that follow can never raise the score to `AVPROBE_SCORE_EXTENSION + 1`. A stream with an initial IA Sequence Header carrying the "iamf" 4CC and a later unknown ia_code in the descriptor section can be handled by the current demuxer, but is not detectable from its content: the same bytes score 1 from the `.iamf` extension and are rejected as "Invalid data found" when named `.bin`. Once the probe has seen an IA Sequence Header carrying the "iamf" 4CC, a later type-31 OBU with an unknown ia_code should not prematurely end content probing before an Audio Frame OBU provides positive evidence for IAMF. This change lets the probe continue past such an OBU (while still rejecting an unknown *first* header and a truncated header), so the Audio Frame OBUs below can be scored. ## Root cause `read_descriptors()` in `iamf_parse.c` dispatches only Codec Config, Audio Element and Mix Presentation OBUs and falls through to `default: avio_skip(pb, obu_size)` for type 31, so the demuxer skips otherwise unhandled type-31 OBUs during descriptor parsing without validating ia_code. The probe, in contrast, returned 0 on the first unknown ia_code after a valid first header. This change extends probe acceptance to match the existing demuxer's treatment of otherwise unhandled type-31 OBUs as skippable during descriptor parsing. It does not change descriptor parsing or introduce a new parsing path; it only lets the following Audio Frame OBU be scored. This is a probe policy choice, not a conformance requirement or a logical consequence of the parser's behaviour: probing, descriptor parsing and packet reading may legitimately differ in how tolerant they are. It does not handle the start of a new IA Sequence. In particular it does not claim that the test fixture is a conformant stream. ## Conformance IAMF v2.0.0 permits IA Sequence Header OBUs to appear repeatedly within one IA Sequence (section 3.4): when a stream does so, all occurrences after the first SHALL be marked as redundant, and a later non-redundant IA Sequence Header received after a previous one indicates the start of a new IA Sequence. The spec defines ia_code as the 4CC "iamf" and gives no rule for other values. Both positive fixtures below are deliberately non-conformant; this change does not claim otherwise. Skipping such a header is this demuxer's existing tolerance, not a conformance requirement. ## Testing Three self-contained FATE cases are added. A short IAMF sequence is muxed locally from the checked-in streamgroups and audiogen, then turned into a .bin with a later unknown ia_code that must still be probed (`probe_score=51`), or an unknown first ia_code that must still fail. No fate-suite sample and no unmerged series is needed. The `.bin` extension keeps the score purely content based. The positive cases exercise probe control flow (reaching the Audio Frame OBU); they do not establish that an unknown ia_code or a new IA Sequence is conformant. Truncated headers and the `buf_size < 4` path are deliberately unchanged. On the build host (`git-2026-11-06-5d85b7bfb2`, mingw64 gcc 16.2.0) all three new cases pass, `fate-iamf-stereo` still passes, and restoring the old `get_score()` makes both positive cases fail. The references were produced by FATE GEN and normalised to LF. Sample-based IAMF cases and a full `make fate` run were not run on the host because the fate-suite samples are not available there. ## Relation to other work This patch is independent of PR #25632 by the same author. That series exports IAMF profile metadata; this one only fixes `get_score()` in the `iamf_probe()` loop. No code, fixture or helper from that series is used, and this patch applies to current master on its own. ## Known limitations Pre-existing and unchanged by this patch: `get_score()` bounds the 4CC read by the bytes left in the probe buffer, not by the current OBU's payload, so `AV_RB32` can read into the next OBU and cause a false positive. A separate fix needs to bound that check by the OBU's own payload size (`obu_size`) while keeping the probe-buffer limit, and add a short-payload regression test. This change does not touch that path and does not claim it is harmless. >From ae373c4733b54edcb038b0dc75c3d850d30859b0 Mon Sep 17 00:00:00 2001 From: luoye-cpu <[email protected]> Date: Fri, 6 Nov 2026 21:48:28 +0800 Subject: [PATCH] avformat/iamfdec: probe past unknown ia_code headers get_score() returns 0 as soon as an IA Sequence Header OBU does not start with the "iamf" magic. iamf_probe() stops its loop on any non-negative return value, so the Audio Frame OBUs that follow can never raise the score to AVPROBE_SCORE_EXTENSION + 1. A stream with an initial IA Sequence Header carrying the "iamf" 4CC and a later unknown ia_code in the descriptor section can be handled by the current demuxer, but is not detectable from its content: the same bytes score 1 from the .iamf extension and are rejected as "Invalid data found" when named .bin. Once the probe has seen an IA Sequence Header carrying the "iamf" 4CC, a later type-31 OBU with an unknown ia_code should not prematurely end content probing before an Audio Frame OBU provides positive evidence for IAMF. read_descriptors() in iamf_parse.c dispatches only Codec Config, Audio Element and Mix Presentation OBUs and falls through to "default: avio_skip(pb, obu_size)" for type 31, so the demuxer skips every later Sequence Header without validating ia_code. This change extends probe acceptance to match the existing demuxer's treatment of otherwise unhandled type-31 OBUs as skippable during descriptor parsing. It does not change descriptor parsing or introduce a new parsing path; it only lets the following Audio Frame OBU be scored. This is a probe policy choice, not a conformance requirement or a logical consequence of the parser's behaviour: probing, descriptor parsing and packet reading may legitimately differ in how tolerant they are. It does not handle the start of a new IA Sequence. In particular it does not claim that the fixture is a conformant stream. IAMF v2.0.0 permits IA Sequence Header OBUs to appear repeatedly within one IA Sequence (section 3.4): when a stream does so, all occurrences after the first SHALL be marked as redundant, and a later non-redundant IA Sequence Header received after a previous one indicates the start of a new IA Sequence. The spec defines ia_code as the 4CC "iamf" and gives no rule for other values. Both positive fixtures below are deliberately non-conformant; this change does not claim otherwise. Skipping such a header is this demuxer's existing tolerance, not a conformance requirement. Keep rejecting a truncated header and an unknown first header, and skip an unknown later type-31 header once a valid first header has been seen. ff_iamf_parse_obu_header() consumes the obu_redundant_copy bit but does not expose it to its caller, so the probe never branches on it. The 0xf8 (non-redundant) and 0xfc (redundant flag set) are both covered as later type-31 headers with an unknown ia_code to make that explicit. The 0xfc case is not a conformant redundant copy: its payload differs from the previous Sequence Header, so it only checks that setting the flag does not change probe control flow. Unconditionally skipping every unknown ia_code was rejected: an unknown first header does not start an IA Sequence and must still fail. Changing the parser instead of get_score() would not help, as the parser already skips these OBUs. Add three self-contained FATE cases. A short IAMF sequence is muxed locally from the checked-in streamgroups and audiogen, then turned into a .bin with a later unknown ia_code that must still be probed (probe_score=51), or an unknown first ia_code that must still fail. No fate-suite sample and no unmerged series is needed. The .bin extension keeps the score purely content based. The positive cases exercise probe control flow (reaching the Audio Frame OBU); they do not establish that an unknown ia_code or a new IA Sequence is conformant. Truncated headers and the buf_size < 4 path are deliberately unchanged. On this host all three new cases pass, fate-iamf-stereo still passes, and restoring the old get_score makes both positive cases fail. The references were produced by FATE GEN and normalised to LF. These results are from the runs; the read_descriptors() and iamf_probe() control flow above is from reading the code. Sample-based IAMF cases and a full make fate run were not run because the fate-suite samples are not available here. Known limitation, pre-existing and unchanged by this patch: get_score() bounds the 4CC read by the bytes left in the probe buffer, not by the current OBU's payload, so AV_RB32 can read into the next OBU and cause a false positive. A separate fix needs to bound that check by the OBU's own payload size (obu_size) while keeping the probe-buffer limit, and add a short-payload regression test. This change does not touch that path and does not claim it is harmless. This patch is independent of PR #25632 by the same author. That series exports IAMF profile metadata; this one only fixes get_score() in the iamf_probe() loop. No code, fixture or helper from that series is used, and this patch applies to current master on its own. Refs: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25632 Signed-off-by: luoye-cpu <[email protected]> --- libavformat/iamfdec.c | 8 ++++- tests/Makefile | 36 +++++++++++++++++++ tests/fate/iamf.mak | 26 ++++++++++++++ tests/ref/fate/iamf-probe-unknown-later | 13 +++++++ .../fate/iamf-probe-unknown-later-redundant | 13 +++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 tests/ref/fate/iamf-probe-unknown-later create mode 100644 tests/ref/fate/iamf-probe-unknown-later-redundant diff --git a/libavformat/iamfdec.c b/libavformat/iamfdec.c index 66870094f6c..25b502a334e 100644 --- a/libavformat/iamfdec.c +++ b/libavformat/iamfdec.c @@ -32,8 +32,14 @@ static int get_score(const uint8_t *buf, int buf_size, enum IAMF_OBU_Type type, int *seq) { if (type == IAMF_OBU_IA_SEQUENCE_HEADER) { - if (buf_size < 4 || AV_RB32(buf) != MKBETAG('i','a','m','f')) + if (buf_size < 4) return 0; + /* A later IA Sequence Header OBU with an unknown ia_code is skipped + by the parser (iamf_parse.c falls through to avio_skip), so keep + probing to still reach the Audio Frame OBUs below. An unknown first + header must still be rejected (*seq == 0). */ + if (AV_RB32(buf) != MKBETAG('i','a','m','f')) + return *seq ? -1 : 0; *seq = 1; return -1; } diff --git a/tests/Makefile b/tests/Makefile index beb53a54ca1..2f48786812e 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -77,6 +77,42 @@ tests/data/fate/apng-small-bpp-%.png: TAG = GEN tests/data/fate/apng-small-bpp-%.png: tests/apnggen$(HOSTEXESUF) | tests/data/fate $(M)./$< $@ +# A short, self-contained IAMF sequence for probing regressions, muxed locally +# so the tests below need no fate-suite sample. Its first eight bytes are the +# (valid) first IA Sequence Header OBU (2 bytes of OBU header + 6 bytes of +# payload: the ia_code 4CC and the primary and additional profile bytes). +tests/data/iamf-probe-base.iamf: TAG = GEN +tests/data/iamf-probe-base.iamf: tests/data/asynth-44100-2.wav tests/data/streamgroups/audio_element-stereo tests/data/streamgroups/mix_presentation-stereo $(FFMPEG) | tests/data + $(M)$(TARGET_EXEC) $(TARGET_PATH)/$(FFMPEG) -nostdin -bitexact -v error \ + -auto_conversion_filters -i $(TARGET_PATH)/tests/data/asynth-44100-2.wav \ + -/stream_group $(TARGET_PATH)/tests/data/streamgroups/audio_element-stereo \ + -/stream_group $(TARGET_PATH)/tests/data/streamgroups/mix_presentation-stereo \ + -streamid 0:0 -c:a flac -t 1 -f iamf -y $(TARGET_PATH)/$@ + +# Keep the valid first header, insert a later Sequence Header with an unknown +# ia_code, then append the rest of the sequence. 0xf8 is a non-redundant +# header; section 3.4 of IAMF v2.0.0 would read such a later header as the +# start of a new IA Sequence. This is a deliberately non-conformant input: +# the parser skips the OBU, and probing must not stop here either. +tests/data/iamf-probe-unknown-later.bin: TAG = GEN +tests/data/iamf-probe-unknown-later.bin: tests/data/iamf-probe-base.iamf | tests/data + $(M)head -c 8 $< > $@ && printf '\370\006xxxx\000\000' >> $@ && tail -c +9 $< >> $@ + +# Set obu_redundant_copy on a later Sequence Header with an unknown ia_code. +# This is deliberately NOT a conformant redundant copy: section 3.2 of +# IAMF v2.0.0 defines it as a copy of the previous OBU, while this payload +# differs. ff_iamf_parse_obu_header() consumes the bit but does not expose +# it, so this case only checks that the probe does not branch on that flag. +tests/data/iamf-probe-unknown-later-redundant.bin: TAG = GEN +tests/data/iamf-probe-unknown-later-redundant.bin: tests/data/iamf-probe-base.iamf | tests/data + $(M)head -c 8 $< > $@ && printf '\374\006xxxx\000\000' >> $@ && tail -c +9 $< >> $@ + +# Start with an unknown ia_code instead: content probing must still refuse the +# file, so the tolerance above cannot be widened to unknown first headers. +tests/data/iamf-probe-unknown-first.bin: TAG = GEN +tests/data/iamf-probe-unknown-first.bin: tests/data/iamf-probe-base.iamf | tests/data + $(M)printf '\370\006xxxx\000\000' > $@ && tail -c +9 $< >> $@ + RUNNING_FATE := $(filter check fate%,$(filter-out fate-rsync,$(MAKECMDGOALS))) # Check sanity of dependencies when running FATE tests. diff --git a/tests/fate/iamf.mak b/tests/fate/iamf.mak index fd51e09e5d5..dc86c95cdf6 100644 --- a/tests/fate/iamf.mak +++ b/tests/fate/iamf.mak @@ -95,6 +95,32 @@ fate-iamf-ambisonic_3-copy: CMD = stream_remux iamf $(TARGET_SAMPLES)/iamf/test_ "" "-c:a copy -frames:a 0 -map 0:g:i:300" \ "-show_entries stream_group=index,id,nb_streams,type:stream_group_components:stream_group_stream=index,id" +FATE_IAMF_PROBE = IAMF_MUXER IAMF_DEMUXER FLAC_ENCODER FLAC_DECODER \ + WAV_DEMUXER PCM_S16LE_DECODER PCM_S16LE_ENCODER \ + ARESAMPLE_FILTER NULL_MUXER FILE_PROTOCOL PIPE_PROTOCOL + +# A later type-31 OBU with an unknown ia_code must not stop content +# probing. Use a .bin extension so the score is content-only and the format +# has to be recognized from the OBUs, not from the file name (probe_score=51). +FATE_IAMF-$(call ALLYES, $(FATE_IAMF_PROBE)) += fate-iamf-probe-unknown-later +fate-iamf-probe-unknown-later: tests/data/iamf-probe-unknown-later.bin +fate-iamf-probe-unknown-later: CMD = ffprobe_demux $(TARGET_PATH)/tests/data/iamf-probe-unknown-later.bin + +# The redundant flag must not change probe control flow. This fixture is +# deliberately non-conformant; see the 0xfc comment in tests/Makefile. +FATE_IAMF-$(call ALLYES, $(FATE_IAMF_PROBE)) += fate-iamf-probe-unknown-later-redundant +fate-iamf-probe-unknown-later-redundant: tests/data/iamf-probe-unknown-later-redundant.bin +fate-iamf-probe-unknown-later-redundant: CMD = ffprobe_demux $(TARGET_PATH)/tests/data/iamf-probe-unknown-later-redundant.bin + +# An unknown first header is not an IA Sequence yet: probing must still +# refuse the file, so the tolerance above cannot be widened to skip unknown +# first headers. `!` turns the expected failure into a passing test. +FATE_IAMF-$(call ALLYES, $(FATE_IAMF_PROBE)) += fate-iamf-probe-unknown-first +fate-iamf-probe-unknown-first: tests/data/iamf-probe-unknown-first.bin +fate-iamf-probe-unknown-first: CMD = ! run ffprobe$(PROGSSUF)$(EXESUF) -v error -show_entries format=format_name $(TARGET_PATH)/tests/data/iamf-probe-unknown-first.bin +fate-iamf-probe-unknown-first: CMP = grep +fate-iamf-probe-unknown-first: REF = Invalid data found when processing input + FATE_IAMF += $(FATE_IAMF-yes) FATE_IAMF_SAMPLES += $(FATE_IAMF_SAMPLES-yes) diff --git a/tests/ref/fate/iamf-probe-unknown-later b/tests/ref/fate/iamf-probe-unknown-later new file mode 100644 index 00000000000..1a691c7aa18 --- /dev/null +++ b/tests/ref/fate/iamf-probe-unknown-later @@ -0,0 +1,13 @@ +packet|codec_type=audio|stream_index=0|pts=0|pts_time=0.000000|dts=0|dts_time=0.000000|duration=4096|duration_time=0.092880|size=1323|pos=190|flags=K__|data_hash=CRC32:9ad4a95c +packet|codec_type=audio|stream_index=0|pts=4096|pts_time=0.092880|dts=4096|dts_time=0.092880|duration=4096|duration_time=0.092880|size=1254|pos=1516|flags=K__|data_hash=CRC32:1404da91 +packet|codec_type=audio|stream_index=0|pts=8192|pts_time=0.185760|dts=8192|dts_time=0.185760|duration=4096|duration_time=0.092880|size=1320|pos=2773|flags=K__|data_hash=CRC32:4c81c8e6 +packet|codec_type=audio|stream_index=0|pts=12288|pts_time=0.278639|dts=12288|dts_time=0.278639|duration=4096|duration_time=0.092880|size=1280|pos=4096|flags=K__|data_hash=CRC32:62cdf256 +packet|codec_type=audio|stream_index=0|pts=16384|pts_time=0.371519|dts=16384|dts_time=0.371519|duration=4096|duration_time=0.092880|size=1331|pos=5379|flags=K__|data_hash=CRC32:3ff01238 +packet|codec_type=audio|stream_index=0|pts=20480|pts_time=0.464399|dts=20480|dts_time=0.464399|duration=4096|duration_time=0.092880|size=1267|pos=6713|flags=K__|data_hash=CRC32:c70214f3 +packet|codec_type=audio|stream_index=0|pts=24576|pts_time=0.557279|dts=24576|dts_time=0.557279|duration=4096|duration_time=0.092880|size=1282|pos=7983|flags=K__|data_hash=CRC32:c47d0965 +packet|codec_type=audio|stream_index=0|pts=28672|pts_time=0.650159|dts=28672|dts_time=0.650159|duration=4096|duration_time=0.092880|size=1313|pos=9268|flags=K__|data_hash=CRC32:7293d23a +packet|codec_type=audio|stream_index=0|pts=32768|pts_time=0.743039|dts=32768|dts_time=0.743039|duration=4096|duration_time=0.092880|size=1323|pos=10584|flags=K__|data_hash=CRC32:269b662f +packet|codec_type=audio|stream_index=0|pts=36864|pts_time=0.835918|dts=36864|dts_time=0.835918|duration=4096|duration_time=0.092880|size=1254|pos=11910|flags=K__|data_hash=CRC32:216ad123 +packet|codec_type=audio|stream_index=0|pts=40960|pts_time=0.928798|dts=40960|dts_time=0.928798|duration=4096|duration_time=0.092880|size=1235|pos=13170|flags=K__|data_hash=CRC32:27ff80a2|side_datum/skip_samples:side_data_type=Skip Samples|side_datum/skip_samples:skip_samples=0|side_datum/skip_samples:discard_padding=956|side_datum/skip_samples:skip_reason=0|side_datum/skip_samples:discard_reason=0 +stream|index=0|codec_name=flac|profile=unknown|level=-99|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|mime_codec_string=flac|sample_fmt=s16|sample_rate=44100|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|seek_preroll=0|id=0x0|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/44100|start_pts=N/A|start_time=N/A|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=16|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=11|extradata_size=34|extradata_hash=CRC32:5932aa1a|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multil ayer=0 +format|filename=iamf-probe-unknown-later.bin|nb_streams=1|nb_programs=0|nb_stream_groups=2|format_name=iamf|start_time=N/A|duration=N/A|size=14405|bit_rate=N/A|probe_score=51 diff --git a/tests/ref/fate/iamf-probe-unknown-later-redundant b/tests/ref/fate/iamf-probe-unknown-later-redundant new file mode 100644 index 00000000000..250e45031fa --- /dev/null +++ b/tests/ref/fate/iamf-probe-unknown-later-redundant @@ -0,0 +1,13 @@ +packet|codec_type=audio|stream_index=0|pts=0|pts_time=0.000000|dts=0|dts_time=0.000000|duration=4096|duration_time=0.092880|size=1323|pos=190|flags=K__|data_hash=CRC32:9ad4a95c +packet|codec_type=audio|stream_index=0|pts=4096|pts_time=0.092880|dts=4096|dts_time=0.092880|duration=4096|duration_time=0.092880|size=1254|pos=1516|flags=K__|data_hash=CRC32:1404da91 +packet|codec_type=audio|stream_index=0|pts=8192|pts_time=0.185760|dts=8192|dts_time=0.185760|duration=4096|duration_time=0.092880|size=1320|pos=2773|flags=K__|data_hash=CRC32:4c81c8e6 +packet|codec_type=audio|stream_index=0|pts=12288|pts_time=0.278639|dts=12288|dts_time=0.278639|duration=4096|duration_time=0.092880|size=1280|pos=4096|flags=K__|data_hash=CRC32:62cdf256 +packet|codec_type=audio|stream_index=0|pts=16384|pts_time=0.371519|dts=16384|dts_time=0.371519|duration=4096|duration_time=0.092880|size=1331|pos=5379|flags=K__|data_hash=CRC32:3ff01238 +packet|codec_type=audio|stream_index=0|pts=20480|pts_time=0.464399|dts=20480|dts_time=0.464399|duration=4096|duration_time=0.092880|size=1267|pos=6713|flags=K__|data_hash=CRC32:c70214f3 +packet|codec_type=audio|stream_index=0|pts=24576|pts_time=0.557279|dts=24576|dts_time=0.557279|duration=4096|duration_time=0.092880|size=1282|pos=7983|flags=K__|data_hash=CRC32:c47d0965 +packet|codec_type=audio|stream_index=0|pts=28672|pts_time=0.650159|dts=28672|dts_time=0.650159|duration=4096|duration_time=0.092880|size=1313|pos=9268|flags=K__|data_hash=CRC32:7293d23a +packet|codec_type=audio|stream_index=0|pts=32768|pts_time=0.743039|dts=32768|dts_time=0.743039|duration=4096|duration_time=0.092880|size=1323|pos=10584|flags=K__|data_hash=CRC32:269b662f +packet|codec_type=audio|stream_index=0|pts=36864|pts_time=0.835918|dts=36864|dts_time=0.835918|duration=4096|duration_time=0.092880|size=1254|pos=11910|flags=K__|data_hash=CRC32:216ad123 +packet|codec_type=audio|stream_index=0|pts=40960|pts_time=0.928798|dts=40960|dts_time=0.928798|duration=4096|duration_time=0.092880|size=1235|pos=13170|flags=K__|data_hash=CRC32:27ff80a2|side_datum/skip_samples:side_data_type=Skip Samples|side_datum/skip_samples:skip_samples=0|side_datum/skip_samples:discard_padding=956|side_datum/skip_samples:skip_reason=0|side_datum/skip_samples:discard_reason=0 +stream|index=0|codec_name=flac|profile=unknown|level=-99|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|mime_codec_string=flac|sample_fmt=s16|sample_rate=44100|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|seek_preroll=0|id=0x0|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/44100|start_pts=N/A|start_time=N/A|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=16|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=11|extradata_size=34|extradata_hash=CRC32:5932aa1a|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multil ayer=0 +format|filename=iamf-probe-unknown-later-redundant.bin|nb_streams=1|nb_programs=0|nb_stream_groups=2|format_name=iamf|start_time=N/A|duration=N/A|size=14405|bit_rate=N/A|probe_score=51 -- 2.54.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
