Commit 8d46415883 for ffmpeg

commit 8d46415883db39e7a72c33fa299ff93a54c47286
Author: Romain Beauxis <romain.beauxis@gmail.com>
Date:   Sat Oct 31 09:57:15 2026 -0500

    fate/ogg-theora: add chained decoding tests

    Two generated links, the second at a larger frame size, are piped
    into one decoder, with and without frame threading.

    The references record the timestamp and size of each decoded frame
    today, with the second link lost when frame threading is used.

    Further tests check that the chained pictures match those of each link
    decoded on its own, one of them with a second link whose comment
    header is larger than 64 KiB.

diff --git a/tests/Makefile b/tests/Makefile
index 31be08007a..0656946f11 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -248,6 +248,7 @@ include $(SRC_PATH)/tests/fate/ogg-vorbis.mak
 include $(SRC_PATH)/tests/fate/ogg-flac.mak
 include $(SRC_PATH)/tests/fate/ogg-opus.mak
 include $(SRC_PATH)/tests/fate/ogg-chain-copy.mak
+include $(SRC_PATH)/tests/fate/ogg-theora.mak
 include $(SRC_PATH)/tests/fate/oma.mak
 include $(SRC_PATH)/tests/fate/opus.mak
 include $(SRC_PATH)/tests/fate/pcm.mak
diff --git a/tests/fate/ogg-theora.mak b/tests/fate/ogg-theora.mak
new file mode 100644
index 0000000000..63f35c2f5c
--- /dev/null
+++ b/tests/fate/ogg-theora.mak
@@ -0,0 +1,61 @@
+# Two links of a test pattern piped as one chained stream, the second at a
+# larger frame size. List each decoded frame's timestamp and size, since the
+# encoded bytes depend on the libtheora version.
+OGG_THEORA_CHAIN = \
+    { ffmpeg -auto_conversion_filters -f lavfi -i testsrc=s=160x120:r=15:d=1 -c:v libtheora \
+        -flags +bitexact -fflags +bitexact -f ogg - && \
+      ffmpeg -auto_conversion_filters -f lavfi -i testsrc=s=320x240:r=15:d=1 -c:v libtheora \
+        -flags +bitexact -fflags +bitexact -serial_offset 1 -f ogg -; } | \
+    run ffprobe$(PROGSSUF)$(EXESUF) -bitexact -of compact=p=0 -show_entries frame=pts,width,height
+
+FATE_OGG_THEORA_CHAIN-$(call ENCDEC, LIBTHEORA THEORA, OGG, LAVFI_INDEV TESTSRC_FILTER SCALE_FILTER WRAPPED_AVFRAME_DECODER PIPE_PROTOCOL) += fate-ogg-theora-chained-size
+fate-ogg-theora-chained-size: CMD = $(OGG_THEORA_CHAIN) -threads 1 -i pipe:
+
+FATE_OGG_THEORA_CHAIN-$(call ENCDEC, LIBTHEORA THEORA, OGG, LAVFI_INDEV TESTSRC_FILTER SCALE_FILTER WRAPPED_AVFRAME_DECODER PIPE_PROTOCOL) += fate-ogg-theora-chained-size-frame-threads
+fate-ogg-theora-chained-size-frame-threads: CMD = $(OGG_THEORA_CHAIN) -threads 2 -thread_type frame -i pipe:
+
+FATE_FFMPEG_FFPROBE += $(FATE_OGG_THEORA_CHAIN-yes)
+
+# One link of a test pattern, given its frame size $(1), further muxer
+# options $(2) and output file $(3).
+OGG_THEORA_LINK = ffmpeg -auto_conversion_filters -f lavfi -i testsrc=s=$(1):r=15:d=1 -c:v libtheora \
+                    -flags +bitexact -fflags +bitexact $(2) -f ogg -y $(3)
+OGG_THEORA_DECODE = ffmpeg -i $(1) -noautoscale -fps_mode passthrough -f rawvideo -
+
+# Each link of a chain is a stream of its own, so decoding the links
+# $(1).1.ogg and $(1).2.ogg chained must give what decoding them one by one
+# does, written to $(1).raw as the reference. $(2) holds further options for
+# the second link.
+OGG_THEORA_CHAINED = \
+    $(call OGG_THEORA_LINK,160x120,,$(1).1.ogg) && \
+    $(call OGG_THEORA_LINK,320x240,-serial_offset 1 $(2),$(1).2.ogg) && \
+    { $(call OGG_THEORA_DECODE,$(1).1.ogg) && $(call OGG_THEORA_DECODE,$(1).2.ogg); } > $(1).raw && \
+    test -s $(1).raw && \
+    cat $(1).1.ogg $(1).2.ogg | $(call OGG_THEORA_DECODE,pipe:)
+
+OGG_THEORA_CHAINED_CONTENT_DEPS = LAVFI_INDEV TESTSRC_FILTER SCALE_FILTER WRAPPED_AVFRAME_DECODER RAWVIDEO_MUXER
+
+OGG_THEORA_CHAINED_CONTENT_LINKS = tests/data/fate/ogg-theora-chained-content.links
+FATE_OGG_THEORA_CONTENT-$(call TRANSCODE, LIBTHEORA THEORA, OGG, $(OGG_THEORA_CHAINED_CONTENT_DEPS)) += fate-ogg-theora-chained-content
+fate-ogg-theora-chained-content: CMD = $(call OGG_THEORA_CHAINED,$(OGG_THEORA_CHAINED_CONTENT_LINKS))
+fate-ogg-theora-chained-content: REF = $(OGG_THEORA_CHAINED_CONTENT_LINKS).raw
+fate-ogg-theora-chained-content: CLEANFILES = $(addprefix $(OGG_THEORA_CHAINED_CONTENT_LINKS),.1.ogg .2.ogg .raw)
+fate-ogg-theora-chained-content: CMP = stddev
+fate-ogg-theora-chained-content: CMP_TARGET = 0
+fate-ogg-theora-chained-content: FUZZ = 0
+
+# The second link's comment header is larger than 64 KiB.
+OGG_THEORA_CHAINED_LARGE_COMMENT_LINKS = tests/data/fate/ogg-theora-chained-large-comment.links
+FATE_OGG_THEORA_CONTENT-$(call TRANSCODE, LIBTHEORA THEORA, OGG, $(OGG_THEORA_CHAINED_CONTENT_DEPS)) += fate-ogg-theora-chained-large-comment
+fate-ogg-theora-chained-large-comment: CMD = \
+    printf "comment=%070000d" 0 > $(OGG_THEORA_CHAINED_LARGE_COMMENT_LINKS).meta && \
+    $(call OGG_THEORA_CHAINED,$(OGG_THEORA_CHAINED_LARGE_COMMENT_LINKS),-/metadata $(OGG_THEORA_CHAINED_LARGE_COMMENT_LINKS).meta)
+fate-ogg-theora-chained-large-comment: REF = $(OGG_THEORA_CHAINED_LARGE_COMMENT_LINKS).raw
+fate-ogg-theora-chained-large-comment: CLEANFILES = $(addprefix $(OGG_THEORA_CHAINED_LARGE_COMMENT_LINKS),.meta .1.ogg .2.ogg .raw)
+fate-ogg-theora-chained-large-comment: CMP = stddev
+fate-ogg-theora-chained-large-comment: CMP_TARGET = 0
+fate-ogg-theora-chained-large-comment: FUZZ = 0
+
+FATE_FFMPEG += $(FATE_OGG_THEORA_CONTENT-yes)
+
+fate-ogg-theora: $(FATE_OGG_THEORA_CHAIN-yes) $(FATE_OGG_THEORA_CONTENT-yes)
diff --git a/tests/ref/fate/ogg-theora-chained-size b/tests/ref/fate/ogg-theora-chained-size
new file mode 100644
index 0000000000..da50838554
--- /dev/null
+++ b/tests/ref/fate/ogg-theora-chained-size
@@ -0,0 +1,30 @@
+pts=0|width=160|height=120
+pts=1|width=160|height=120
+pts=2|width=160|height=120
+pts=3|width=160|height=120
+pts=4|width=160|height=120
+pts=5|width=160|height=120
+pts=6|width=160|height=120
+pts=7|width=160|height=120
+pts=8|width=160|height=120
+pts=9|width=160|height=120
+pts=10|width=160|height=120
+pts=11|width=160|height=120
+pts=12|width=160|height=120
+pts=13|width=160|height=120
+pts=14|width=160|height=120
+pts=0|width=320|height=240
+pts=1|width=320|height=240
+pts=2|width=320|height=240
+pts=3|width=320|height=240
+pts=4|width=320|height=240
+pts=5|width=320|height=240
+pts=6|width=320|height=240
+pts=7|width=320|height=240
+pts=8|width=320|height=240
+pts=9|width=320|height=240
+pts=10|width=320|height=240
+pts=11|width=320|height=240
+pts=12|width=320|height=240
+pts=13|width=320|height=240
+pts=14|width=320|height=240
diff --git a/tests/ref/fate/ogg-theora-chained-size-frame-threads b/tests/ref/fate/ogg-theora-chained-size-frame-threads
new file mode 100644
index 0000000000..3395566b5c
--- /dev/null
+++ b/tests/ref/fate/ogg-theora-chained-size-frame-threads
@@ -0,0 +1,15 @@
+pts=0|width=160|height=120
+pts=1|width=160|height=120
+pts=2|width=160|height=120
+pts=3|width=160|height=120
+pts=4|width=160|height=120
+pts=5|width=160|height=120
+pts=6|width=160|height=120
+pts=7|width=160|height=120
+pts=8|width=160|height=120
+pts=9|width=160|height=120
+pts=10|width=160|height=120
+pts=11|width=160|height=120
+pts=12|width=160|height=120
+pts=13|width=160|height=120
+pts=14|width=160|height=120