Commit a4dbdc7333 for ffmpeg

commit a4dbdc7333e86ce7747bc2d85708cc50e0437568
Author: Romain Beauxis <romain.beauxis@gmail.com>
Date:   Sat Oct 17 06:31:39 2026 +0200

    fate/libavformat: add hls-parse tests

    A Master Playlist carrying EXT-X-START before its variants is rejected
    with "Master Playlist tag found in a Media Playlist", as recorded in the
    master-start references.

    The media-start-endlist and master-media-start cases record behaviour
    that must be kept: an EXT-X-ENDLIST following EXT-X-START, and a start
    offset carried only by a Media Playlist.

diff --git a/tests/fate/libavformat.mak b/tests/fate/libavformat.mak
index 45878891fd..6459057a31 100644
--- a/tests/fate/libavformat.mak
+++ b/tests/fate/libavformat.mak
@@ -64,6 +64,49 @@ FATE_LIBAVFORMAT-yes += fate-url
 fate-url: libavformat/tests/url$(EXESUF)
 fate-url: CMD = run libavformat/tests/url$(EXESUF)

+tests/data/hls-parse-master.m3u8: TAG = GEN
+tests/data/hls-parse-master.m3u8: | tests/data
+	$(Q)printf '#EXTM3U\n#EXT-X-STREAM-INF:BANDWIDTH=64000\na.m3u8\n#EXT-X-STREAM-INF:BANDWIDTH=32000\nb.m3u8\n' > $@
+
+tests/data/hls-parse-master-start.m3u8: TAG = GEN
+tests/data/hls-parse-master-start.m3u8: | tests/data
+	$(Q)printf '#EXTM3U\n#EXT-X-START:TIME-OFFSET=1.5\n#EXT-X-STREAM-INF:BANDWIDTH=64000\na.m3u8\n#EXT-X-STREAM-INF:BANDWIDTH=32000\nb.m3u8\n' > $@
+
+tests/data/hls-parse-media.m3u8: TAG = GEN
+tests/data/hls-parse-media.m3u8: | tests/data
+	$(Q)printf '#EXTM3U\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\nseg0.ts\n#EXTINF:2,\nseg1.ts\n#EXTINF:2,\nseg2.ts\n' > $@
+
+tests/data/hls-parse-media-start.m3u8: TAG = GEN
+tests/data/hls-parse-media-start.m3u8: | tests/data
+	$(Q)printf '#EXTM3U\n#EXT-X-START:TIME-OFFSET=4\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\nseg0.ts\n#EXTINF:2,\nseg1.ts\n#EXTINF:2,\nseg2.ts\n' > $@
+
+tests/data/hls-parse-media-start-endlist.m3u8: TAG = GEN
+tests/data/hls-parse-media-start-endlist.m3u8: | tests/data
+	$(Q)printf '#EXTM3U\n#EXT-X-START:TIME-OFFSET=4\n#EXT-X-ENDLIST\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\nseg0.ts\n#EXTINF:2,\nseg1.ts\n#EXTINF:2,\nseg2.ts\n' > $@
+
+FATE_HLS_PARSE = fate-hls-parse-media-start           \
+                 fate-hls-parse-media-start-endlist   \
+                 fate-hls-parse-master-start          \
+                 fate-hls-parse-master-start-media    \
+                 fate-hls-parse-master-start-override \
+                 fate-hls-parse-master-media-start
+
+$(FATE_HLS_PARSE): libavformat/tests/hls$(EXESUF)
+fate-hls-parse-media-start: tests/data/hls-parse-media-start.m3u8
+fate-hls-parse-media-start: CMD = run libavformat/tests/hls$(EXESUF) $(TARGET_PATH)/tests/data/hls-parse-media-start.m3u8
+fate-hls-parse-media-start-endlist: tests/data/hls-parse-media-start-endlist.m3u8
+fate-hls-parse-media-start-endlist: CMD = run libavformat/tests/hls$(EXESUF) $(TARGET_PATH)/tests/data/hls-parse-media-start-endlist.m3u8
+fate-hls-parse-master-start: tests/data/hls-parse-master-start.m3u8
+fate-hls-parse-master-start: CMD = run libavformat/tests/hls$(EXESUF) $(TARGET_PATH)/tests/data/hls-parse-master-start.m3u8
+fate-hls-parse-master-start-media: tests/data/hls-parse-master-start.m3u8 tests/data/hls-parse-media.m3u8
+fate-hls-parse-master-start-media: CMD = run libavformat/tests/hls$(EXESUF) $(TARGET_PATH)/tests/data/hls-parse-master-start.m3u8 $(TARGET_PATH)/tests/data/hls-parse-media.m3u8
+fate-hls-parse-master-start-override: tests/data/hls-parse-master-start.m3u8 tests/data/hls-parse-media-start.m3u8
+fate-hls-parse-master-start-override: CMD = run libavformat/tests/hls$(EXESUF) $(TARGET_PATH)/tests/data/hls-parse-master-start.m3u8 $(TARGET_PATH)/tests/data/hls-parse-media-start.m3u8
+fate-hls-parse-master-media-start: tests/data/hls-parse-master.m3u8 tests/data/hls-parse-media-start.m3u8
+fate-hls-parse-master-media-start: CMD = run libavformat/tests/hls$(EXESUF) $(TARGET_PATH)/tests/data/hls-parse-master.m3u8 $(TARGET_PATH)/tests/data/hls-parse-media-start.m3u8
+
+FATE_LIBAVFORMAT-$(call ALLYES, HLS_DEMUXER FILE_PROTOCOL) += $(FATE_HLS_PARSE)
+
 FATE_LIBAVFORMAT-$(CONFIG_IMF_DEMUXER) += fate-imf
 fate-imf: libavformat/tests/imf$(EXESUF)
 fate-imf: CMD = run libavformat/tests/imf$(EXESUF)
diff --git a/tests/ref/fate/hls-parse-master-media-start b/tests/ref/fate/hls-parse-master-media-start
new file mode 100644
index 0000000000..5bce43afa9
--- /dev/null
+++ b/tests/ref/fate/hls-parse-master-media-start
@@ -0,0 +1,3 @@
+2 variant(s), 2 playlist(s)
+a.m3u8: live, start offset 4000000
+b.m3u8: live, no start offset
diff --git a/tests/ref/fate/hls-parse-master-start b/tests/ref/fate/hls-parse-master-start
new file mode 100644
index 0000000000..401c7af49d
--- /dev/null
+++ b/tests/ref/fate/hls-parse-master-start
@@ -0,0 +1 @@
+error: Invalid data found when processing input
diff --git a/tests/ref/fate/hls-parse-master-start-media b/tests/ref/fate/hls-parse-master-start-media
new file mode 100644
index 0000000000..401c7af49d
--- /dev/null
+++ b/tests/ref/fate/hls-parse-master-start-media
@@ -0,0 +1 @@
+error: Invalid data found when processing input
diff --git a/tests/ref/fate/hls-parse-master-start-override b/tests/ref/fate/hls-parse-master-start-override
new file mode 100644
index 0000000000..401c7af49d
--- /dev/null
+++ b/tests/ref/fate/hls-parse-master-start-override
@@ -0,0 +1 @@
+error: Invalid data found when processing input
diff --git a/tests/ref/fate/hls-parse-media-start b/tests/ref/fate/hls-parse-media-start
new file mode 100644
index 0000000000..d007477fa2
--- /dev/null
+++ b/tests/ref/fate/hls-parse-media-start
@@ -0,0 +1,2 @@
+1 variant(s), 1 playlist(s)
+hls-parse-media-start.m3u8: live, start offset 4000000
diff --git a/tests/ref/fate/hls-parse-media-start-endlist b/tests/ref/fate/hls-parse-media-start-endlist
new file mode 100644
index 0000000000..ba15ebb74f
--- /dev/null
+++ b/tests/ref/fate/hls-parse-media-start-endlist
@@ -0,0 +1,2 @@
+1 variant(s), 1 playlist(s)
+hls-parse-media-start-endlist.m3u8: finished, start offset 4000000