Frame judder with video playback
Overview
- VRR displays are great for games, where frame production is inherently irregular, but fixed-cadence video can still judder if the display pipeline doesn’t pace frames correctly.
- For example, on a 40-60 Hz VRR panel, we noticed judder when playing 30 fps content in mpv on Wayland.
Media playback judder

- On a 40-60 Hz VRR panel, refresh interval can vary only between 16.67 ms and 25 ms.
- A 30 fps video delivers a new frame every 33.33 ms, which is longer than that limit and therefore outside the panel’s VRR operating window.
- Because of this, frames cannot be displayed at a uniform cadence and instead alternate between longer and shorter display times, about 41.67 (25+16.67) ms and 25 ms.
- The average frame timing remains correct, but the uneven frame pacing appears as visible judder.
What can userspace do to fix this?
-
The client or media player passes the content frame rate (a rational frame rate numerator / denominator) using a new wp-content-frame-rate-v1 protocol to the compositor.
-
The compositor should do the low framerate compensation (LFC) to choose the smallest stable refresh multiple that fits within the VRR range.
-
For 30 fps content on a 40 to 60 Hz panel, that target becomes 60 Hz, so each video frame will be shown for exactly two scanouts.
-
This should restore a stable presentation cadence and removes judder.
-
The compositors can implement this by deriving a virtual display mode from the current KMS mode and retiming vtotal, vsync_start, vsync_end, and vrefresh to the computed target refresh rate so that the panel scans out at exactly target_hz.
Media playback judder fixed

More details
To fix this, we carried out a PoC, you can check the full implementation details here: Fixing judder issue with video playback