PR #25345 opened by hfliuyun URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25345 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25345.patch
# Summary of changes Since 0eb2d1f64a, ten sync-aligned 0x47 bytes at the 192-byte stride in the first 2048-byte probe buffer make mpegts score 100, beating wav's 99. A steady tone (e.g. 1 kHz in 16 kHz mono s16le) repeats the same samples every 96 samples (192 bytes), so valid WAV files — including ones written by ffmpeg — were probed as mpegts and failed to open. That branch only existed for the PNG-in-front-of-TS case, which a38ce70f0e now handles in png_probe(): a complete PNG followed by a non-PNG payload returns AVPROBE_SCORE_RETRY, so the previous score of 50 is enough. This drops the branch and restores the ts-* probe_score refs; the png-prefix probe tests still pass. Added fate-wav-not-mpegts: it patches ten fake TS sync headers into a WAV written by ffmpeg and checks that it still probes as wav. No new FATE sample is needed. # Verification `make fate-wav`, `make fate-ts-demux fate-ts-opus-demux fate-ts-small-demux` and the two `fate-probe-format-mpegts-png-prefix*` tests pass. Fixes: https://code.ffmpeg.org/FFmpeg/FFmpeg/issues/25221 cc @kasper93 <!-- If this PR requires new FATE test samples, attach them to the PR and list their target paths below (relative to the fate-suite root). Attached filenames must match the sample's filename: ```fate-samples # e.g. vorbis/new-sample.ogg ``` --> From 455260a662d9e985249e256a538a78f6d2154b8d Mon Sep 17 00:00:00 2001 From: liuyun <[email protected]> Date: Wed, 21 Oct 2026 18:41:58 +0800 Subject: [PATCH] avformat/mpegts: don't return SCORE_MAX for exactly CHECK_COUNT aligned packets This reverts the mpegts.c part of 0eb2d1f64a. With the minimal 2048-byte probe buffer, ten 0x47 bytes at the 192-byte stride, each with bit 0x30 set in the following byte, reach AVPROBE_SCORE_MAX. That outscores demuxers with a real signature such as wav (AVPROBE_SCORE_MAX - 1). A periodic tone (e.g. 1 kHz in 16 kHz mono s16le) repeats the same samples every 96 samples (192 bytes), so a byte that happens to be 0x47 at one sync position stays 0x47 at every sync position. Plain WAV files, including ones written by ffmpeg, were therefore probed as mpegts and failed to open with "End of file". The branch was added so a 1x1 PNG in front of an MPEG-TS segment would not be probed as png_pipe. That is now handled in png_probe() itself (a38ce70f0e), and the png-prefix probe tests still pass without it. Add FATE coverage for a WAV file whose PCM data contains ten sync-aligned MPEG-TS packet headers within the first probe buffer. Fixes: https://code.ffmpeg.org/FFmpeg/FFmpeg/issues/25221 Signed-off-by: liuyun <[email protected]> --- libavformat/mpegts.c | 2 -- tests/fate/wav.mak | 22 +++++++++++++++++++--- tests/ref/fate/ts-demux | 2 +- tests/ref/fate/ts-opus-demux | 2 +- tests/ref/fate/ts-small-demux | 2 +- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index c013452e973..426027f1fb5 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -3497,8 +3497,6 @@ static int mpegts_probe(const AVProbeData *p) if (check_count > CHECK_COUNT && sumscore > 6) { return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT; - } else if (check_count >= CHECK_COUNT && sumscore >= CHECK_COUNT) { - return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT; } else if (check_count >= CHECK_COUNT && sumscore > 6) { return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT; } else if (check_count >= CHECK_COUNT && maxscore > 6) { diff --git a/tests/fate/wav.mak b/tests/fate/wav.mak index e2167edc85e..d5dd948df61 100644 --- a/tests/fate/wav.mak +++ b/tests/fate/wav.mak @@ -105,7 +105,23 @@ fate-wav-pcm-mulaw-bad-blockalign: CMD = run_with_patched_temp \ -i $(TARGET_PATH)/tests/data/asynth-44100-2.wav -c:a pcm_mulaw -fflags +bitexact -y" \ "$(WAV_BITRATE_PROBE)" wav 32 "\0001\0000" -FATE-yes += $(FATE_WAV_ENCINFO-yes) -FATE_FFMPEG_FFPROBE += $(FATE_WAV_BITRATE-yes) +# PCM data containing ten 0x47 bytes at the 192-byte stride, each with +# bit 0x30 set in the following byte, must still probe as wav. The audio +# format is irrelevant; only the byte pattern matters. +WAV_FAKE_TS_HEADER = "\0107\0000\0000\0020" -fate-wav: $(FATE_WAV_ENCINFO-yes) $(FATE_WAV_BITRATE-yes) +FATE_WAV_PROBE-$(call ALLYES, WAV_MUXER WAV_DEMUXER MPEGTS_DEMUXER FILE_PROTOCOL) += fate-wav-not-mpegts +fate-wav-not-mpegts: tests/data/asynth-44100-2.wav +fate-wav-not-mpegts: CMP = oneline +fate-wav-not-mpegts: REF = wav +fate-wav-not-mpegts: CMD = run_with_patched_temp \ + "$(FFMPEG) -nostdin -loglevel quiet \ + -i $(TARGET_PATH)/tests/data/asynth-44100-2.wav -c:a copy -fflags +bitexact -y" \ + "ffprobe$(PROGSSUF)$(EXESUF) -v 0 -bitexact \ + -show_entries format=format_name -print_format default=nw=1:nk=1" wav \ + $(foreach offset, 160 352 544 736 928 1120 1312 1504 1696 1888, $(offset) $(WAV_FAKE_TS_HEADER)) + +FATE-yes += $(FATE_WAV_ENCINFO-yes) +FATE_FFMPEG_FFPROBE += $(FATE_WAV_BITRATE-yes) $(FATE_WAV_PROBE-yes) + +fate-wav: $(FATE_WAV_ENCINFO-yes) $(FATE_WAV_BITRATE-yes) $(FATE_WAV_PROBE-yes) diff --git a/tests/ref/fate/ts-demux b/tests/ref/fate/ts-demux index 5ad1ce596f3..e309df4f964 100644 --- a/tests/ref/fate/ts-demux +++ b/tests/ref/fate/ts-demux @@ -26,4 +26,4 @@ packet|codec_type=audio|stream_index=2|pts=3912645580|pts_time=43473.839778|dts= stream|index=0|codec_name=mpeg2video|profile=4|level=4|codec_type=video|codec_tag_string=[2][0][0][0]|codec_tag=0x0002|width=1280|height=720|coded_width=0|coded_height=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=16:9|pix_fmt=yuv420p|color_range=tv|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|ts_id=32776|ts_packetsize=188|id=0x31|r_frame_rate=60000/1001|avg_frame_rate=60000/1001|time_base=1/90000|start_pts=3912669846|start_time=43474.109400|duration_ts=19519|duration=0.216878|bit_rate=15000000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=15|extradata_size=150|extradata_hash=CRC32:53134fa8|disposition:default=0|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:multilayer=0|side_datum/cpb_properties:side_data_type=CPB properties|side_datum/cpb_properties:max_bitrate=15000000|side_datum/cpb_properties:min_bitrate=0|side_datum/cpb_properties:avg_bitrate=0|side_datum/cpb_properties:buffer_size=9781248|side_datum/cpb_properties:vbv_delay=-1 stream|index=1|codec_name=ac3|profile=unknown|level=-99|codec_type=audio|codec_tag_string=[6][0][0][0]|codec_tag=0x0006|mime_codec_string=ac-3|sample_fmt=fltp|sample_rate=48000|channels=6|channel_layout=5.1(side)|bits_per_sample=0|initial_padding=0|dmix_mode=0|ltrt_cmixlev=0.000000|ltrt_surmixlev=0.000000|loro_cmixlev=0.000000|loro_surmixlev=0.000000|ts_id=32776|ts_packetsize=188|id=0x34|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912633305|start_time=43473.703389|duration_ts=14400|duration=0.160000|bit_rate=384000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|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:multilayer=0|tag:language=eng stream|index=2|codec_name=ac3|profile=unknown|level=-99|codec_type=audio|codec_tag_string=[6][0][0][0]|codec_tag=0x0006|mime_codec_string=ac-3|sample_fmt=fltp|sample_rate=48000|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|dmix_mode=0|ltrt_cmixlev=0.000000|ltrt_surmixlev=0.000000|loro_cmixlev=0.000000|loro_surmixlev=0.000000|ts_id=32776|ts_packetsize=188|id=0x35|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912634060|start_time=43473.711778|duration_ts=14400|duration=0.160000|bit_rate=192000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|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:multilayer=0|tag:language=es -format|filename=mp3ac325-4864-small.ts|nb_streams=3|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=43473.703389|duration=0.622889|size=512000|bit_rate=6575810|probe_score=100 +format|filename=mp3ac325-4864-small.ts|nb_streams=3|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=43473.703389|duration=0.622889|size=512000|bit_rate=6575810|probe_score=50 diff --git a/tests/ref/fate/ts-opus-demux b/tests/ref/fate/ts-opus-demux index 07f3c6ebb36..8ab693db625 100644 --- a/tests/ref/fate/ts-opus-demux +++ b/tests/ref/fate/ts-opus-demux @@ -511,4 +511,4 @@ packet|codec_type=audio|stream_index=0|pts=916200|pts_time=10.180000|dts=916200| packet|codec_type=audio|stream_index=0|pts=918000|pts_time=10.200000|dts=918000|dts_time=10.200000|duration=1800|duration_time=0.020000|size=761|pos=510044|flags=K__|data_hash=CRC32:75113c11|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=189 packet|codec_type=audio|stream_index=0|pts=919800|pts_time=10.220000|dts=919800|dts_time=10.220000|duration=1800|duration_time=0.020000|size=759|pos=510984|flags=K__|data_hash=CRC32:59fc266f|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=189 stream|index=0|codec_name=opus|profile=unknown|level=-99|codec_type=audio|codec_tag_string=Opus|codec_tag=0x7375704f|mime_codec_string=opus|sample_fmt=fltp|sample_rate=48000|channels=8|channel_layout=7.1|bits_per_sample=0|initial_padding=0|ts_id=51338|ts_packetsize=188|id=0x44|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=919800|duration=10.220000|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=512|extradata_size=29|extradata_hash=CRC32:6d6089a7|disposition:default=0|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:multilayer=0 -format|filename=test-8-7.1.opus-small.ts|nb_streams=1|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=0.000000|duration=10.220000|size=512000|bit_rate=400782|probe_score=100 +format|filename=test-8-7.1.opus-small.ts|nb_streams=1|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=0.000000|duration=10.220000|size=512000|bit_rate=400782|probe_score=50 diff --git a/tests/ref/fate/ts-small-demux b/tests/ref/fate/ts-small-demux index adac491878a..d15ac35809b 100644 --- a/tests/ref/fate/ts-small-demux +++ b/tests/ref/fate/ts-small-demux @@ -73,4 +73,4 @@ packet|codec_type=video|stream_index=0|pts=552000|pts_time=6.133333|dts=552000|d packet|codec_type=video|stream_index=0|pts=558000|pts_time=6.200000|dts=558000|dts_time=6.200000|duration=6000|duration_time=0.066667|size=16|pos=15792|flags=___|data_hash=CRC32:27b943ef|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=224 packet|codec_type=video|stream_index=0|pts=564000|pts_time=6.266667|dts=564000|dts_time=6.266667|duration=6000|duration_time=0.066667|size=16|pos=16356|flags=___|data_hash=CRC32:f7116111|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=224 stream|index=0|codec_name=h264|profile=578|level=10|codec_type=video|codec_tag_string=[27][0][0][0]|codec_tag=0x001b|mime_codec_string=avc1.42c00a|width=82|height=144|coded_width=82|coded_height=144|has_b_frames=0|sample_aspect_ratio=1:1|display_aspect_ratio=41:72|pix_fmt=yuv420p|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|is_avc=false|nal_length_size=0|ts_id=1|ts_packetsize=188|id=0x100|r_frame_rate=15/1|avg_frame_rate=15/1|time_base=1/90000|start_pts=126000|start_time=1.400000|duration_ts=444000|duration=4.933333|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=74|extradata_size=37|extradata_hash=CRC32:1d7ffe93|disposition:default=0|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:multilayer=0 -format|filename=h264small.ts|nb_streams=1|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=1.400000|duration=4.933333|size=16544|bit_rate=26828|probe_score=100 +format|filename=h264small.ts|nb_streams=1|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=1.400000|duration=4.933333|size=16544|bit_rate=26828|probe_score=50 -- 2.54.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
