Welcome to Ghosts S01E11: Libvpx . Let’s exorcise it. It started with a routine archival job. We were transcoding a film scan (ProRes 4444 → WebM) for a client’s interactive museum installation. The command was standard:
This wasn't a decoding error. This was the encoder lying to us about its state. In VP9, Libvpx uses a complex reference frame structure. Unlike H.264’s simple "past/future" references, VP9 maintains up to eight reference frames simultaneously: LAST, GOLDEN, ALTREF, and their temporal variants. ghosts s01e11 libvpx
ffmpeg -i input.mov -c:v libvpx-vp9 \ -tile-columns 2 -row-mt 1 \ -lag-in-frames 16 \ # Reduce from default 25 -auto-alt-ref 1 \ # Keep on, but be careful -arnr-maxframes 3 \ # Reduce temporal filtering -cpu-used 2 \ output.webm Two-pass encoding often masks the bug because the first pass forces the encoder to re-evaluate scene boundaries more strictly. Welcome to Ghosts S01E11: Libvpx
The ghosting bug in Libvpx v1.11.0–v1.12.0 is largely fixed in v1.13.0+. The patch (Change-Id: I8a3f7b2e9c4d1a5f6e7b8c9d0e1f2a3b4c5d6e7f) corrects the reference frame buffer reset logic after scene detection. We were transcoding a film scan (ProRes 4444