How libdav1d Handles AV1 Dynamic Resolution Switching

This article analyzes how libdav1d, the open-source AV1 video decoder developed by VideoLAN, processes AV1 streams with rapidly changing resolutions. It covers the technical mechanisms behind dynamic buffer reallocation, multi-thread synchronization, and how the decoder maintains seamless playback without dropping frames or requiring a full pipeline re-initialization.

The AV1 Dynamic Resolution Feature

Unlike older video codecs that require a keyframe (IDR frame) and a complete decoder reset to change video dimensions, the AV1 specification natively supports Dynamic Resolution Switching (DRS). In AV1, the resolution can change on any inter-frame boundary. This allows encoders to instantly adjust the resolution to match network bandwidth fluctuations without the massive bitrate spike associated with inserting a new keyframe.

Seamless Buffer Reallocation

When libdav1d encounters a resolution change in an AV1 stream, it avoids destroying and recreating the decoding context. Tearing down the decoder would cause noticeable latency and frame drops. Instead, the decoder manages memory dynamically using an internal picture buffer pool:

This smart reuse of memory buffers minimizes allocation overhead and prevents memory fragmentation during rapid resolution changes.

Multi-Threading and Synchronization

The primary challenge of decoding dynamic resolution streams in libdav1d lies in its highly parallelized architecture. libdav1d utilizes both frame-threading and tile-threading to maximize CPU utilization.

When a resolution change occurs, synchronization barriers are established:

  1. Reference Frame Management: AV1 allows frames of different resolutions to reference each other. The decoder must scale reference frames during the motion compensation process. libdav1d uses highly optimized assembly code (AVX2, AVX-512, and ARM NEON) to scale these reference frames on the fly.
  2. Thread Barriers: The decoder ensures that all threads processing older frames at the previous resolution complete their work before the threads assigned to the new resolution begin. This prevents race conditions and ensures that reference frames are fully decoded and scaled before they are used by subsequent frames.

Performance and Playback Continuity

Because libdav1d handles these transitions entirely within the decoding pipeline, the process is seamless to the end-user. The video player application does not need to re-initialize the video pipeline or flush the audio/video synchronizer.

While there is a minor CPU overhead during the transition frame—due to potential memory allocation and reference frame scaling—libdav1d’s assembly-optimized scaling routines ensure that this overhead does not cause visible stuttering or dropped frames, even on low-power hardware.