Skip to main content

Overview

v4l2av1dec is a hardware-accelerated video decoder that uses the Video4Linux2 (V4L2) stateful decoder API to offload AV1 video decoding to the Qualcomm Video Processing Unit (VPU). This plugin is provided and maintained by the GStreamer community. This document focuses on its usage in conjunction with Qualcomm-specific QIM SDK GStreamer plugins, along with relevant use cases and internal architectural considerations. v4l2av1dec is typically used to decode AV1 streams provided by:
  • File sources (WebM, Matroska/MKV, MP4/ISOBMFF containers)
  • RTSP sources
  • HLS/HTTP streaming sources (e.g., YouTube AV1, streaming platforms)
The element is responsible only for decoding video frames. It does not demux or parse streams on its own — those operations must be handled by peer GStreamer elements upstream (e.g., matroskademux and av1parse).

Example Pipeline

1

Download Required Files

av1_1080p.webm file is used here as an example.
2

Copy files to device

3

Connect to device

4

Set environment variables

Run below command on your device
5

Run the pipeline

Key Responsibilities

v4l2av1dec is responsible for:
  • Hardware acceleration — offloads AV1 decoding to the dedicated VPU
  • V4L2 state management — manages the V4L2 stateful decoder state machine (device open, buffer allocation, stream on/off)
  • Buffer I/O management — handles buffer exchange between GStreamer and the V4L2 driver using DMABuf, MMAP, or UserPtr modes
  • Format negotiation — negotiates raw output formats supported by the hardware, including UBWC-compressed formats (NV12_Q08C for 8-bit SDR, NV12_Q10LE32C for 10-bit HDR) for reduced memory bandwidth
  • Multi-stream support — supports multiple concurrent decoder instances (subject to hardware resource limits)
  • Error handling — supports decoder error controls such as max-errors and corrupted-frame discard behavior

Hierarchy

GObject
   GstObject
      GstElement
         GstVideoDecoder
            GstV4l2VideoDec
               v4l2av1dec

Pad Templates

sink

src

AV1 does not perform profile or level probing via V4L2 control enumeration in the current implementation. The sink caps are therefore unconstrained beyond the video/x-av1 media type. Hardware capabilities are implicitly constrained by what the V4L2 driver accepts at runtime — if the driver does not support a particular AV1 profile or level, it will return an error during format negotiation (VIDIOC_S_FMT).

Element Properties

I/O Mode Values

Both capture-io-mode and output-io-mode accept the same GstV4l2IOMode enumeration:

Internal Architecture

v4l2av1dec operates using two V4L2 queue objects internally:
  • Output queue (V4L2_BUF_TYPE_VIDEO_OUTPUT) — receives compressed AV1 OBU buffers from upstream
  • Capture queue (V4L2_BUF_TYPE_VIDEO_CAPTURE) — produces decoded raw video frames for downstream

State Transitions

Dynamic Resolution Change

v4l2av1dec supports mid-stream dynamic resolution changes without requiring a pipeline restart, handled through the V4L2 source change event mechanism:
  1. At initialization, the decoder subscribes to V4L2_EVENT_SOURCE_CHANGE events on the capture queue.
  2. When the driver detects a resolution change in the bitstream (e.g., a new AV1 sequence header with different frame dimensions), it signals the event.
  3. The decoder stops the capture queue, discards the existing buffer pool, re-negotiates format via VIDIOC_G_FMT, sets a new output state with updated dimensions, and reallocates the capture buffer pool.
This allows seamless decoding of adaptive bitrate AV1 streams and content with embedded resolution changes (e.g., AV1 streams with multiple sequence headers).

Memory and Buffer Management

DMABuf Usage

Setting capture-io-mode=4 exports decoded frame buffers as DMABuf file descriptors. These can be imported directly by waylandsink or qtivcomposer without CPU memory copies, enabling zero-copy pipelines.

Alignment Requirements

Decoded buffers follow Qualcomm hardware alignment requirements (e.g., 128-byte stride alignment).

Format Support

Standard NV12 is common. UBWC (Universal Bandwidth Compression) is supported through:
  • NV12_Q08C — 8-bit SDR content
  • NV12_Q10LE32C — 10-bit HDR content (HDR10, HDR10+, HLG)
For 10-bit AV1 content, the decoder automatically selects NV12_Q10LE32C when the downstream element supports it.

Codec Header Initialization

Before the first frame is decoded, the decoder sends the AV1 sequence header OBU (Open Bitstream Unit) to the output queue. If the input caps contain codec_data (e.g., from the av1C configuration record in MP4/ISOBMFF containers), that data is sent first. Otherwise, the first input buffer itself is used as the initialization data.

Latency

The decoder computes and reports pipeline latency based on the minimum number of capture buffers required by the driver and the frame duration:

Drain and Flush

  • Drain — sends V4L2_DEC_CMD_STOP to signal end-of-stream; waits for all remaining frames to be produced
  • Flush — stops both queues, resets buffer pools, and restarts streaming; used during seek operations

Usage

Ensure you have followed the prerequisites before continuing

Decode AV1 from a WebM File and Display

Demonstrates hardware-accelerated AV1 decoding from a WebM file with DMABuf zero-copy for Wayland preview.

Four-Stream Side-by-Side Composition

Demonstrates decoding four AV1 input streams using four hardware decoder instances, arranging them in a 2×2 grid using qtivcomposer, and displaying the composed frame.