mirror of
https://github.com/storytold/filmcraft.git
synced 2026-10-25 10:37:34 -06:00
Problem: the post stage of a VP9 frame (band assembly, loop filter, publication) ran on one thread. Later frames wait per band for their references, so the serial loop filter (~30 % of the profile) set the pace of every inter frame; 16 threads were only ~1.8x one thread. Fix: rows of a frame's loop filter run as a wavefront, row r two superblocks behind row r - 1 (what the raster order of 8.8.1 allows), taken by the post thread and helper jobs on the decoder's pool. No lock is held while a superblock is filtered: each row filters its own band and rows exchange copies of the 8 rows the filter reaches across a band boundary. Output stays bit-identical; one thread / wasm run the rows in order as before. A row is only taken by a running thread, so waits always make progress, and helpers run under catch_unwind (a failure publishes placeholder bands as before). New conformance fixture narrow_tall (2 superblock columns) and a repeated multi-thread 1080p decode test. 1.2-1.5x faster with 16 threads on a shared machine. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>