Commit 39e14c2e0c for ffmpeg

commit 39e14c2e0c4cc4897aca200b75b2f2585b938c97
Author: Kacper Michajłow <kasper93@gmail.com>
Date:   Sat Oct 17 01:37:54 2026 +0200

    tests/fate/demux: add HLS WebVTT timestamp map and seek tests

    Audio from 10 s with WebVTT segments mapping cue time 0 to 10 s, a cue
    that spans three segments and a seek into the second segment.

    Note tests are ugly with printf generation, but this is the only way to
    get full HLS test to work, it's not a single file that we could upload
    to fate samples server.

    Signed-off-by: Kacper Michajłow <kasper93@gmail.com>

diff --git a/tests/fate/demux.mak b/tests/fate/demux.mak
index 8a94c77656..8a62415255 100644
--- a/tests/fate/demux.mak
+++ b/tests/fate/demux.mak
@@ -207,6 +207,69 @@ fate-hls-webvtt-demux: tests/data/hls-webvtt.m3u8
 fate-hls-webvtt-demux: CLEANFILES = tests/data/hls-webvtt.m3u8 tests/data/hls-webvtt-a.m3u8 tests/data/hls-webvtt-s.m3u8 tests/data/hls-webvtt-a[0-9]*.ts tests/data/hls-webvtt-s[0-9]*.vtt
 fate-hls-webvtt-demux: CMD = fmtstdout webvtt -copyts -i $(TARGET_PATH)/tests/data/hls-webvtt.m3u8 -map 0:a -c copy -f null - -map 0:s -c copy

+define HLS_WEBVTT_MAP_DATA
+tests/data/$(1).m3u8: TAG = GEN
+tests/data/$(1).m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$$(M)$$(TARGET_EXEC) $$(TARGET_PATH)/$$< -nostdin \
+        -f lavfi -i "aevalsrc=0:d=6" -c:a mp2fixed -flags +bitexact -muxdelay 0 -muxpreload 0 -output_ts_offset 10 \
+        -f hls -hls_time 2 -hls_list_size 0 \
+        -hls_segment_filename $$(TARGET_PATH)/tests/data/$(1)-a%d.ts \
+        $$(TARGET_PATH)/tests/data/$(1)-a.m3u8 2>/dev/null
+	$$(Q)printf '#EXTM3U\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\n$(1)-s0.vtt\n#EXTINF:2,\n$(1)-s1.vtt\n#EXTINF:2,\n$(1)-s2.vtt\n#EXT-X-ENDLIST\n' > tests/data/$(1)-s.m3u8
+	$$(Q)printf 'WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000\n\n00:00.500 --> 00:01.500\nfirst\n\n00:01.000 --> 00:04.500 line:1\nlong\n' > tests/data/$(1)-s0.vtt
+	$$(Q)printf 'WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000\n\n00:01.000 --> 00:04.500 line:1\nlong\n\n00:03.000 --> 00:03.900 align:start\nsecond\n' > tests/data/$(1)-s1.vtt
+	$$(Q)printf 'WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000\n\n00:01.000 --> 00:04.500 line:1\nlong\n\n00:04.500 --> 00:05.500\nthird\n' > tests/data/$(1)-s2.vtt
+	$$(Q)printf '#EXTM3U\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="s",NAME="en",URI="$(1)-s.m3u8"\n#EXT-X-STREAM-INF:BANDWIDTH=64000,SUBTITLES="s"\n$(1)-a.m3u8\n' > $$@
+
+fate-$(1)-demux: tests/data/$(1).m3u8
+fate-$(1)-demux: CLEANFILES = tests/data/$(1).m3u8 tests/data/$(1)-a.m3u8 tests/data/$(1)-s.m3u8 tests/data/$(1)-a[0-9]*.ts tests/data/$(1)-s[0-9]*.vtt
+endef
+
+$(eval $(call HLS_WEBVTT_MAP_DATA,hls-webvtt-map))
+$(eval $(call HLS_WEBVTT_MAP_DATA,hls-webvtt-seek))
+
+FATE_HLS_WEBVTT_MAP-$(call FILTERDEMDECENCMUX, AEVALSRC ARESAMPLE, HLS MPEGTS WEBVTT, MP2 PCM_F64LE, MP2FIXED, HLS MPEGTS NULL WEBVTT, LAVFI_INDEV MPEGAUDIO_PARSER PIPE_PROTOCOL) += fate-hls-webvtt-map-demux fate-hls-webvtt-seek-demux
+FATE_FFMPEG += $(FATE_HLS_WEBVTT_MAP-yes)
+fate-hls-webvtt-map-demux: CMD = fmtstdout webvtt -copyts -i $(TARGET_PATH)/tests/data/hls-webvtt-map.m3u8 -map 0:a -c copy -f null - -map 0:s -c copy
+fate-hls-webvtt-seek-demux: CMD = fmtstdout webvtt -copyts -ss 4 -i $(TARGET_PATH)/tests/data/hls-webvtt-seek.m3u8 -map 0:s -c copy
+
+tests/data/hls-webvtt-discont.m3u8: TAG = GEN
+tests/data/hls-webvtt-discont.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< -nostdin \
+        -f lavfi -i "aevalsrc=0:d=2" -c:a mp2fixed -flags +bitexact -muxdelay 0 -muxpreload 0 -output_ts_offset 10 \
+        -f mpegts $(TARGET_PATH)/tests/data/hls-webvtt-discont-a0.ts 2>/dev/null
+	$(Q)cp tests/data/hls-webvtt-discont-a0.ts tests/data/hls-webvtt-discont-a1.ts
+	$(Q)printf '#EXTM3U\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\nhls-webvtt-discont-a0.ts\n#EXT-X-DISCONTINUITY\n#EXTINF:2,\nhls-webvtt-discont-a1.ts\n#EXT-X-ENDLIST\n' > tests/data/hls-webvtt-discont-a.m3u8
+	$(Q)printf 'WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000\n\n00:00.500 --> 00:01.500\nhello\n' > tests/data/hls-webvtt-discont-s0.vtt
+	$(Q)cp tests/data/hls-webvtt-discont-s0.vtt tests/data/hls-webvtt-discont-s1.vtt
+	$(Q)printf '#EXTM3U\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\nhls-webvtt-discont-s0.vtt\n#EXT-X-DISCONTINUITY\n#EXTINF:2,\nhls-webvtt-discont-s1.vtt\n#EXT-X-ENDLIST\n' > tests/data/hls-webvtt-discont-s.m3u8
+	$(Q)printf '#EXTM3U\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="s",NAME="en",URI="hls-webvtt-discont-s.m3u8"\n#EXT-X-STREAM-INF:BANDWIDTH=64000,SUBTITLES="s"\nhls-webvtt-discont-a.m3u8\n' > $@
+
+FATE_HLS_WEBVTT_DISCONT-$(call FILTERDEMDECENCMUX, AEVALSRC ARESAMPLE, HLS MPEGTS WEBVTT, MP2 PCM_F64LE, MP2FIXED, MPEGTS NULL WEBVTT, LAVFI_INDEV MPEGAUDIO_PARSER PIPE_PROTOCOL) += fate-hls-webvtt-discont-demux
+FATE_FFMPEG += $(FATE_HLS_WEBVTT_DISCONT-yes)
+fate-hls-webvtt-discont-demux: tests/data/hls-webvtt-discont.m3u8
+fate-hls-webvtt-discont-demux: CLEANFILES = tests/data/hls-webvtt-discont.m3u8 tests/data/hls-webvtt-discont-a.m3u8 tests/data/hls-webvtt-discont-s.m3u8 tests/data/hls-webvtt-discont-a[0-9]*.ts tests/data/hls-webvtt-discont-s[0-9]*.vtt
+fate-hls-webvtt-discont-demux: CMD = fmtstdout webvtt -copyts -i $(TARGET_PATH)/tests/data/hls-webvtt-discont.m3u8 -map 0:a -c copy -f null - -map 0:s -c copy
+
+tests/data/hls-webvtt-wrap.m3u8: TAG = GEN
+tests/data/hls-webvtt-wrap.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< -nostdin \
+        -f lavfi -i "aevalsrc=0:d=6" -c:a mp2fixed -flags +bitexact -muxdelay 0 -muxpreload 0 -output_ts_offset 95442 \
+        -f hls -hls_time 2 -hls_list_size 0 \
+        -hls_segment_filename $(TARGET_PATH)/tests/data/hls-webvtt-wrap-a%d.ts \
+        $(TARGET_PATH)/tests/data/hls-webvtt-wrap-a.m3u8 2>/dev/null
+	$(Q)printf '#EXTM3U\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\nhls-webvtt-wrap-s0.vtt\n#EXTINF:2,\nhls-webvtt-wrap-s1.vtt\n#EXTINF:2,\nhls-webvtt-wrap-s2.vtt\n#EXT-X-ENDLIST\n' > tests/data/hls-webvtt-wrap-s.m3u8
+	$(Q)printf 'WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:8589780020,LOCAL:00:00:00.000\n\n00:00.500 --> 00:01.500\nbefore\n\n00:01.500 --> 00:02.500\nacross\n' > tests/data/hls-webvtt-wrap-s0.vtt
+	$(Q)printf 'WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:25428,LOCAL:00:00:02.000\n\n00:01.500 --> 00:02.500\nacross\n\n00:03.000 --> 00:03.900\nafter\n' > tests/data/hls-webvtt-wrap-s1.vtt
+	$(Q)printf 'WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:205428,LOCAL:00:00:04.000\n\n00:04.500 --> 00:05.500\nlast\n' > tests/data/hls-webvtt-wrap-s2.vtt
+	$(Q)printf '#EXTM3U\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="s",NAME="en",URI="hls-webvtt-wrap-s.m3u8"\n#EXT-X-STREAM-INF:BANDWIDTH=64000,SUBTITLES="s"\nhls-webvtt-wrap-a.m3u8\n' > $@
+
+FATE_HLS_WEBVTT_WRAP-$(call FILTERDEMDECENCMUX, AEVALSRC ARESAMPLE, HLS MPEGTS WEBVTT, MP2 PCM_F64LE, MP2FIXED, HLS MPEGTS NULL FRAMECRC, LAVFI_INDEV MPEGAUDIO_PARSER PIPE_PROTOCOL) += fate-hls-webvtt-wrap-demux
+FATE_FFMPEG += $(FATE_HLS_WEBVTT_WRAP-yes)
+fate-hls-webvtt-wrap-demux: tests/data/hls-webvtt-wrap.m3u8
+fate-hls-webvtt-wrap-demux: CLEANFILES = tests/data/hls-webvtt-wrap.m3u8 tests/data/hls-webvtt-wrap-a.m3u8 tests/data/hls-webvtt-wrap-s.m3u8 tests/data/hls-webvtt-wrap-a[0-9]*.ts tests/data/hls-webvtt-wrap-s[0-9]*.vtt
+fate-hls-webvtt-wrap-demux: CMD = framecrc -copyts -i $(TARGET_PATH)/tests/data/hls-webvtt-wrap.m3u8 -map 0:a -c copy -f null - -map 0:s -c copy
+
 tests/data/hls-self-variant.m3u8: TAG = GEN
 tests/data/hls-self-variant.m3u8: | tests/data
 	$(Q)printf '#EXTM3U\n#EXT-X-STREAM-INF:BANDWIDTH=64000\nhls-self-variant.m3u8\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="s",NAME="en",URI="hls-self-variant-missing.m3u8"\n#EXTINF:2,\nhls-self-variant.vtt\n' > $@
diff --git a/tests/ref/fate/hls-webvtt-discont-demux b/tests/ref/fate/hls-webvtt-discont-demux
new file mode 100644
index 0000000000..5ea461665c
--- /dev/null
+++ b/tests/ref/fate/hls-webvtt-discont-demux
@@ -0,0 +1 @@
+WEBVTT
diff --git a/tests/ref/fate/hls-webvtt-map-demux b/tests/ref/fate/hls-webvtt-map-demux
new file mode 100644
index 0000000000..5ea461665c
--- /dev/null
+++ b/tests/ref/fate/hls-webvtt-map-demux
@@ -0,0 +1 @@
+WEBVTT
diff --git a/tests/ref/fate/hls-webvtt-seek-demux b/tests/ref/fate/hls-webvtt-seek-demux
new file mode 100644
index 0000000000..5ea461665c
--- /dev/null
+++ b/tests/ref/fate/hls-webvtt-seek-demux
@@ -0,0 +1 @@
+WEBVTT
diff --git a/tests/ref/fate/hls-webvtt-wrap-demux b/tests/ref/fate/hls-webvtt-wrap-demux
new file mode 100644
index 0000000000..6cb6cf1f33
--- /dev/null
+++ b/tests/ref/fate/hls-webvtt-wrap-demux
@@ -0,0 +1,8 @@
+#tb 0: 1/1000
+#media_type 0: subtitle
+#codec_id 0: webvtt
+0,        500,        500,     1000,        6, 0x08730273
+0,       1500,       1500,     1000,        6, 0x08a3028b
+0,       1500,       1500,     1000,        6, 0x08a3028b
+0,       3000,       3000,      900,        5, 0x06150212
+0,       4500,       4500,     1000,        4, 0x042d01b4