跳到主要内容

MT GPU在Linux下如何使用视频编解码

本文目的是帮助大家能够快速使用MT GPU,快速进行视频编解码。并自己能排除过程中遇到的问题。以下以Ubuntu 2204为例,在黑色代码框内#开始的表示输入命令,黑色框的其他部分是Terminal的输出。

环境准备

Step1 安装mt集成驱动。

# sudo dpkg -i mtgpu_driver_xxx.deb
注意:显示器的接口需要接到MT GPU显卡上。

下载驱动

Step2 检查驱动是否正确安装。

# modinfo mtgpu
filename: /lib/modules/5.15.0-121-generic/updates/dkms/mtgpu.ko
firmware: mthreads/mtvpu-02-1.0.bin
firmware: mthreads/mtvpu-01-1.0.bin
firmware: mthreads/mtvpu-00-1.0.bin
firmware: mthreads/musa.sh.1.0.0.0
firmware: mthreads/musa.fw.1.0.0.0
build_version: 01a3e7b
license: Dual MIT/GPL
author: MooreThreads Corporation
description: MooreThreads mtgpu drm driver

同时mtGPU也会分别产生cardX及render12X设备节点。

# ls /dev/dri/
by-path card0 card1 renderD128 renderD129

以上显示了2对对应的设备节点。表示你的系统内存在有2个显卡。如果有2张显卡,则需要确定在使用中用哪一个显卡。通常我们使用render节点即可,我们以render节点为例。

Optional Step 3 确定render节点和显卡的对应关系。

运行drmdevice命令:(以下命令需要root权限)

# drmdevice
--- Checking the number of DRM device available ---
--- Devices reported 2 ---
--- Retrieving devices information (PCI device revision is ignored) ---
device[0]
+-> available_nodes 0x05
+-> nodes
| +-> nodes[0] /dev/dri/card1
| +-> nodes[2] /dev/dri/renderD129
+-> bustype 0000
| +-> pci
| +-> domain 0000
| +-> bus 07
| +-> dev 00
| +-> func 0
+-> deviceinfo
+-> pci
+-> vendor_id 1ed5
+-> device_id 0105
+-> subvendor_id 1ed5
+-> subdevice_id 0105
+-> revision_id IGNORED

以上VENDOR ID 是 1ed5 表示是MTGPU显卡。通过以上信息bustype中的:bus:dev:func数字组合也可以用下面命令查看到设备信息。

# lspci -s 07:00.0
07:00.0 VGA compatible controller: Moore Threads Technology Co.,Ltd Device 0105

如果在命令的查看中有失败,则需要查看显卡是否安装正确?驱动是否安装成功。检查显卡是否安装正确可以通过,lspci命令查看有无mt gpu显卡出现。

检查视频驱动是否工作

通过vainfo命令查看:

# sudo apt install vainfo
# vainfo

会看到如下输出:

libva info: VA-API version 1.20.0
libva info: Trying to open /usr/lib/x86_64-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: 1.20 (libva 2.12.0)
vainfo: Driver version: Mthreads VPU driver for MT(R) SUDI Graphics - 0.0.1.1b7a0e8 (1b7a0e8)
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
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
Disconnect from services:
OK

如果vainfo未显示以上信息,请查看:/usr/lib/x86_64-linux-gnu/dri/mtgpu_drv_video.so 是否存在。如果驱动正确安装,该文件必须存在。

该文件存在,请通过下面命令再次尝试:

# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" vainfo

或者:

# export LIBVA_DRIVER_NAME=mtgpu
# export LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri"
# vainfo

通过ffmpeg使用MTGPU codec功能

如果仅仅使用264/265、av1、vp8、vp9等解码功能,你可以选择使用开源的ffmpeg或者系统自带的ffmpeg。您想完整使用MTGPU编码功能,则需要使用我们发布的ffmpeg及安装高版本的libva(我们未更改libva的接口,只是扩展了libva不支持的视频标准。比如avs及avs2等)。

下载libva_xxx.deb及ffmpeg_xxx.deb。

https://developer.mthreads.com/sdk/download/mt_video_codec_sdk

step1 安装libva_xxx.deb

# sudo dpkg -i libva_2.20_x86_64.deb

step2 安装ffmpeg_xxx.deb

# sudo dpkg -i ffmpeg_4.4.2_x86_64.deb

解码性能测试

MT GPU有多个decoder core,在MT S80/S3000上有2个Decoder core,3个Encoder core。MTS4000有6个Decoder core,4个Encoder core。理论上在一个终端跑一个如下命令可以得到一个core的性能,乘以core的个数能得到总性能。或者为了更准确的性能,可以开启对应core个数的终端同时跑如下命令再相加。

Option 1:使用MT编译的ffmpeg的命令:

# export PATH=/usr/local/mt_vaapi/bin/:$PATH
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i Harry.Potter.and.the.Chamber.of.Secrets.2002.EXTENDED.BD1080P.X265.AAC.Mandarin-English.CHS-ENG.Adans.mp4 -f null -

可以看到ffmpeg会输出打印fps信息及其版本信息,可以通过这些信息来确定所使用的ffmpeg版本及解码效率等。这个命令仅仅为了测试硬件解码的效率,不输出文件。如果输出文件,通常YUV文件较大,读写这些数据需要较多时间。

Option 2:使用系统默认ffmpeg进行解码测试(不用导出PATH环境变量,直接使用系统默认安装的ffmpeg):

# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i Harry.Potter.and.the.Chamber.of.Secrets.2002.EXTENDED.BD1080P.X265.AAC.Mandarin-English.CHS-ENG.Adans.mp4 -f null -

编码性能测试

MT S4000有4个encoder core。Encoder需要通常需要读取YUV文件作为输入,为了减少大量读文件,我们用转码来间接测试编码性能。ffmpeg编码或转码,单路并不能跑满单个encoder core的性能。通常每个core跑2到3路,共跑8-12路,会得到较好的性能。

转码命令

# export PATH=/usr/local/mt_vaapi/bin/:$PATH
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i Harry.Potter.and.the.Chamber.of.Secrets.2002.EXTENDED.BD1080P.X265.AAC.Mandarin-English.CHS-ENG.Adans.mp4 -c:v hevc_vaapi -f null -

编码命令

# export PATH=/usr/local/mt_vaapi/bin/:$PATH
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -f rawvideo -pix_fmt yuv420p -s 1920x1080 -i ~/BasketballDrive_1920x1080_50.yuv -vf 'format=nv12,hwupload' -c:v h264_vaapi -y test.h264

其他features测试

10bit输入测试

将上面编解码测试输入换成一个10bit码流或者yuv420p10的输入即可。

用户自定义sei

用如下命令生成一个264测试码流

# export PATH=/usr/local/mt_vaapi/bin/:$PATH
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 52_AVC_8bits_1920x1080_30_000fps.mkv -c:v h264_vaapi test.264

下面是用Elecard StreamEye查看文件属性,可以看到该码流包含SEI用户自定义数据及B帧。
图1

HDR相关SEI测试

LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" /usr/local/mt_vaapi/bin/ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i lg_libx265.mkv -c:v hevc_vaapi test.265

查看码流属性
图1

低延时

可以通过选项-low_power 或者 -bf 0 来配置。

# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" /usr/local/mt_vaapi/bin/ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 52_AVC_8bits_1920x1080_30_000fps.mkv -c:v h264_vaapi -low_power 1 test.264
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" /usr/local/mt_vaapi/bin/ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 52_AVC_8bits_1920x1080_30_000fps.mkv -c:v h264_vaapi -bf 0 test.264

配置编码质量模式

MT media driver支持的详细信息可以参考5.3.2给出的信息。可以用ffmpeg的命令行选项:-profile:v main -rc_mode CQP及-b:v 4M(CBR、VBR模式)或者-qp 20(CQP模式)来调整编码质量及目标比特率。

CQP

# export PATH=/usr/local/mt_vaapi/bin/:$PATH
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 52_AVC_8bits_1920x1080_30_000fps.mkv -c:v h264_vaapi -rc_mode CQP -qp 20 test.264

CBR

# export PATH=/usr/local/mt_vaapi/bin/:$PATH
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 52_AVC_8bits_1920x1080_30_000fps.mkv -c:v h264_vaapi -rc_mode CBR -b:v 4M test.264

VBR

# export PATH=/usr/local/mt_vaapi/bin/:$PATH
# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 52_AVC_8bits_1920x1080_30_000fps.mkv -c:v h264_vaapi -rc_mode VBR -b:v 4M test.264

ROI

使用如下方法可以配置roi(感兴趣区)属性。

# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -f rawvideo -pix_fmt yuv420p -s 1920x1080 -i ~/share/wave627/release_yuv/Bosphorus_1920x1080_120fps_420_8bit_YUV.yuv -vf 'addroi=iw/2:ih/2:iw/2:ih/2:1[out1];[out1]format=nv12,hwupload' -c:v h264_vaapi -y test_roi.h264

或者转码命令:

# LIBVA_DRIVER_NAME=mtgpu LIBVA_DRIVERS_PATH="/usr/lib/x86_64-linux-gnu/dri" /usr/local/mt_vaapi/bin/ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i 52_AVC_8bits_1920x1080_30_000fps.mkv -vf 'addroi=iw/2:ih/2:iw/2:ih/2:1' -c:v h264_vaapi test.264

播放test.264视频,可以看到码流右下角质量较低。