VPU
功能 描述
MTT E300 SoC 内的 VPU(Video Processing Unit)模块包含多个视频编解码器(codec),可用于视频和图像的编解码处理。在 Linux 系统中,VPU 驱动支持开源的 VA-API 标准,用户可基于 FFmpeg + VA-API 进行开发。此外,摩尔线程(MT)还提供了一套 Codec SDK(Direct Stream),该 SDK 对底层的 VA-API 接口进行了封装,用户也可基于此 SDK 进行开发。
VPU 内共有 5 个编解码核心:
core0[SMD]: 用于解码 H.264、H.265、AV1、VP9、AVS2 格式的视频
core1[SMD]: 用于解码 H.264、H.265、AV1、VP9、AVS2 格式的视频
core2[SMB]: 用于解码 MPEG2、MPEG4、VP8、AVS 格式的视频
core3[SMJ]: 用于编解码 JPEG 图片
core4[SME]: 用于编码 H.264、H.265、AV1 格式的视频
快速开始
验证驱动安装
系统默认已安装 MUSA 驱动。如需手动安装或更新,请参考 MUSA 安装。
确认 MUSA 驱动包已正确安装:
dpkg -l musa
||/ Name Version Architecture Description
+++-==============-===============-============-=================================
ii musa 5.1.0-M1000 arm64 Moore Threads MUSA driver
确认 VPU 固件 mtvpu*.bin 已安装:
ls -al /lib/firmware/mthreads
-rw-r--r-- 1 root root 133120 Jun 17 08:15 /lib/firmware/mthreads/mtvpu-00-1.0.bin
-rw-r--r-- 1 root root 1590528 Jun 17 08:15 /lib/firmware/mthreads/mtvpu-01-1.0.bin
-rw-r--r-- 1 root root 1590528 Jun 17 08:15 /lib/firmware/mthreads/mtvpu-01-2.0.bin
-rw-r--r-- 1 root root 1073408 Jun 17 08:15 /lib/firmware/mthreads/mtvpu-01-3.0.bin
-rwxr-xr-x 1 root root 213184 Jun 17 08:15 /lib/firmware/mthreads/mtvpu-02-1.0.bin
-rw-r--r-- 1 root root 210368 Jun 17 08:15 /lib/firmware/mthreads/mtvpu-02-2.0.bin
-rwxr-xr-x 1 root root 331904 Jun 17 08:15 /lib/firmware/mthreads/mtvpu-02-3.0.bin
确认视频驱动已安装:
ls -al /usr/lib/aarch64-linux-gnu/dri/ | grep m.*video
-rwxr-xr-x 1 dev dev 556600 Jun 23 11:45 /usr/lib/aarch64-linux-gnu/dri/mtgpu_drv_video_1.so
-rwxr-xr-x 1 dev dev 10262440 Jun 23 11:45 /usr/lib/aarch64-linux-gnu/dri/mtgpu_drv_video_2.so
-rwxr-xr-x 1 dev dev 15056 Jun 23 11:45 /usr/lib/aarch64-linux-gnu/dri/mtgpu_drv_video.so
确认 GPU 设备节点已创建:
ls /dev/dri
by-path card0 renderD128
确认 VPU 驱动正确加载:
dmesg | grep mtvpu
[ 0.658628] [mtvpu] Init Native, Version 30dc2e0
[ 0.658906] [mtvpu] dec core:0 offset:0 available
[ 0.658908] [mtvpu] dec core:1 offset:1 available
[ 0.658910] [mtvpu] dec core:2 offset:14 available
[ 0.658911] [mtvpu] jpu core:3 available
[ 0.658913] [mtvpu] enc core:4 offset:8 available
[ 0.659080] [mtvpu] core 0, mem base 0xff
[ 0.659083] [mtvpu] core 1, mem base 0xfe
[ 0.659084] [mtvpu] core 2, mem base 0xff
[ 0.659085] [mtvpu] core 3, mem base 0xff
[ 0.659086] [mtvpu] core 4, mem base 0xff
[ 0.659087] [mtvpu] iommu init done.
[ 0.659179] [mtvpu] sync task 0 start
确认 VPU 调试节点正常:
cat /sys/kernel/debug/mtvpu0/info
core 0 utilize 0%
core 1 utilize 0%
core 2 utilize 0%
core 3 utilize 0%
core 4 utilize 0%
当相关核心进行编解码时,此信息可显示核心的利用率以及帧率。
库版本管理
系统中安装了两个版本的 libva:
- 1.14 版本:
/usr/lib/aarch64-linux-gnu/(默认) - 1.20 版本:
/usr/local/mt_vaapi/lib/(MT 提供版本,支持更多 profile)
系统默认使用 1.14 版本的 libva。如需切换到 1.20 版本,需设置环境变量:
export LD_LIBRARY_PATH=/usr/local/mt_vaapi/lib:$LD_LIBRARY_PATH
如需基于 1.20 版本的 libva 进行编译,需指定 pkg-config 路径:
export PKG_CONFIG_PATH=/usr/local/mt_vaapi/lib/pkgconfig:$PKG_CONFIG_PATH
FFmpeg 配置
系统中安装了两个版本的 FFmpeg:
/usr/bin/ffmpeg:官方版本/usr/local/mt_vaapi/bin/ffmpeg:MT 定制版本(默认)
建议基于 /usr/local/mt_vaapi 目录下的 FFmpeg 二进制文件、头文件和库进行开发,因为 MT 定制版本支持更全面的视频格式。
如需基于 MT 版本的 FFmpeg 进行编译,需指定 pkg-config 路径:
export PKG_CONFIG_PATH=/usr/local/mt_vaapi/lib/pkgconfig:$PKG_CONFIG_PATH
配置流程
步骤 1:安装和验证工具
安装 vainfo 工具:
sudo apt install vainfo
执行 vainfo 验证 VA-API 支持:
vainfo
error: XDG_RUNTIME_DIR not set in the environment.
MoTTY X11 proxy: Unsupported authorisation protocol
error: can't connect to X server!
libva info: VA-API version 1.20.0
libva info: Trying to open /usr/lib/aarch64-linux-gnu/dri//mtgpu_drv_video.so
libva info: Found init function __vaDriverInit_1_20
trace path : /sys/kernel/debug/tracing/trace_marker_raw
Connecting to pvr device ID: 0 (128)
libva info: va_openDriver() returns 0
vainfo: VA-API version: (libva 2.12.0)
vainfo: Driver version: Mthreads VPU driver for MT(R) MTT M1000 Graphics - 0.0.1.f27a2f1a (f27a2f1a)
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG4Simple : VAEntrypointVLD
VAProfileMPEG4AdvancedSimple : VAEntrypointVLD
VAProfileMPEG4Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointEncSliceLP
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileHEVCMain10 : VAEntrypointEncSliceLP
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileAV1Profile0 : VAEntrypointVLD
VAProfileAV1Profile0 : VAEntrypointEncSlice
VAProfileAV1Profile0 : VAEntrypointEncSliceLP
VAProfileAV1Profile1 : VAEntrypointVLD
VAProfileAV1Profile1 : VAEntrypointEncSlice
VAProfileAV1Profile1 : VAEntrypointEncSliceLP
VAProfileH264High10 : VAEntrypointVLD
VAProfileH264High10 : VAEntrypointEncSlice
VAProfileH264High10 : VAEntrypointEncSliceLP
VAProfileAVSJizhun : VAEntrypointVLD
VAProfileAVSGuangdian : VAEntrypointVLD
VAProfileAVS2Main : VAEntrypointVLD
VAProfileAVS2Main10 : VAEntrypointVLD
确认设备打开正常,profile 显示完整。