VPU User Guide

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


This document describes the VPU (Video Processing Unit) on the Quectel Pi M1, and how to invoke the hardware video encode/decode capabilities from the command line, GStreamer, and FFmpeg.

VPU Overview

What is VPU

VPU (Video Processing Unit) is the dedicated hardware video encoder/decoder (Qualcomm Venus) on the Qualcomm SM6115 platform of the SC200U device. It operates independently of the CPU and is responsible for encoding and decoding video streams such as H.264, H.265, VP8, and VP9.

Compared with a pure-software codec, using the VPU offers the following advantages:

  • Lower CPU load: Video processing is fully handled by hardware, freeing the CPU for other tasks;

  • Higher throughput: Supports real-time, multi-stream concurrent video processing;

  • Lower power consumption: Hardware encode/decode is more power-efficient than software solutions.

Use Cases

The VPU can be used in the following scenarios:

  • Video decoding: Play local or network video (H.264, H.265, VP9, etc.);

  • Video encoding: Compress, record, and stream camera footage or raw video;

  • Video transcoding: Convert one encoding format to another in real time;

  • Multi-channel surveillance: Concurrent encode/decode of multiple video streams, suitable for NVR/DVR applications;

  • Audio/Video framework integration: Seamlessly invoke the hardware codec capabilities through GStreamer and FFmpeg.

Usage Tutorial

Connect the Device

Connect to the device via adb:

adb devices

After confirming the device status is device, you can run the following commands.

Verify VPU Availability

Check Device Nodes

adb shell "ls -l /dev/video32 /dev/video33"

You should see two video device nodes, corresponding to the decoder and the encoder respectively.

Check Venus Firmware Status

# Check the firmware file (root required)
adb shell "ls -l /lib/firmware/venus_v6.mbn"

# Check the vidc status in the kernel (root required)
adb shell "cat /sys/kernel/debug/msm_vidc/core/info"

The output should include the firmware version, register base address, IRQ number, and other information, indicating that the VPU driver and firmware are ready.

Using GStreamer to Invoke the VPU

The device system includes the V4L2 M2M plugin for GStreamer, which uses the VPU as a hardware codec backend.

Hardware decoding (play an H.264 video):

gst-launch-1.0 filesrc location=test.h264 ! h264parse ! qtic2vdec ! autovideosink

Hardware encoding:

gst-launch-1.0 videotestsrc num-buffers=30 ! videoconvert ! \
  video/x-raw,format=NV12,width=640,height=480 ! qtic2venc ! \
  filesink location=out.h264

Required plugin: gstreamer1.0-plugins-good (provides v4l2h264dec / v4l2h264enc).

FAQ

Codec reports -22 (EINVAL) or invalid v4l2 color format

  • Cause: The pixel format or color space parameter passed in is not supported (for example, the color format is 0).

  • Solution: Supply the correct colorspace and pixel format (e.g., NV12) for the input, and confirm that the plane count and stride parameters are correct.

Some ioctl calls return ENOTTY

  • Cause: msm_vidc only responds to certain ioctls after a session has been established (it lazy-loads the firmware).

  • Solution: Establish the session first via S_FMT + STREAMON, or perform the operation within the GStreamer / FFmpeg framework.

GStreamer / FFmpeg reports a missing v4l2 plugin

  • Cause: The corresponding plugin is not installed, or V4L2 M2M support is not enabled.

  • Solution: Install gstreamer1.0-plugins-good; FFmpeg must be compiled with --enable-v4l2-m2m.