Skip to main content

VPU编解码驱动和应用


1. VPU控制器简介

X2000将vpu分为felix和helix两部分:

  1. felix是h264解码,包括:流解析器、运动补偿、反量化、IDCT和De-block engines的功能
  2. helix是h264编码、JPEG压缩和解压缩

2. 内核空间

2.1 驱动相关的源码:

以x2000_darwin_factory_defconfig编译配置为例

bhu@bhu-PC:~/work/build$ grep -nr "kernel" configs/x2000_darwin_factory_defconfig      //先查看kernel的配置
6:APP_kernel_dir=../kernel/kernel-x2000 //kernel目录
7:APP_kernel_config=x2000_module_base_linux_sfc_nand_defconfig //kernel配置文件
kernel/kernel-x2000/module_drivers/drivers/media/platform/ingenic-vcodec/ //vpu相关目录

2.2 设备树配置

kernel配置文件位于kernel/kernel-x2000/arch/mips/configs目录下

bhu@bhu-PC:~/work/kernel/kernel-x2000/arch/mips/configs$ grep -nr ".dts" ./x2000_module_base_linux_sfc_nand_defconfig  
//从获取到的kernel配置文件查找

88:CONFIG_DT_X2000_MODULE_BASE_DTS_FILE="x2000_module_base.dts" //关于vpu配置

x2000_module_base.dts位于kernel/kernel-x2000/arch/mips/boot/dts/ingenic目录下

&felix {
status = "okay";
};

&helix {
status = "okay";
};

2.3 驱动配置

bhu@bhu-PC:~/work/build$ cd ../kernel/kernel-x2000                   //进入配置中的kernel目录
bhu@bhu-PC:~/work/kernel/kernel-x2000$ make menuconfig

4

2.4 保存配置

bhu@bhu-PC:~/work/kernel/kernel-x2000$ cp .config arch/mips/configs/x2000_module_base_linux_sfc_nand_defconfig

3 buildroot menuconfig

bhu@bhu-PC:~/work/build$ grep -nr "buildroot" configs/x2000_darwin_factory_defconfig          //先查看buildroot配置
8:APP_br_dir=../buildroot/buildroot //buildroot目录
9:APP_br_config_file=configs/buildroot/buildroot_x2000_darwin_debug //buildroot配置文件
457:# APP_br_root_login_keep_buildroot is not set
bhu@bhu-PC:~/work/build$ cd ../buildroot/buildroot
bhu@bhu-PC:~/work/buildroot/buildroot$ make menuconfig

1

保存buildroot 配置

bhu@bhu-PC:~/work/buildroot/buildroot$ cp .config ../../build/configs/buildroot/buildroot_x2000_darwin_debug

4 IConfigTool配置

打开IConfigTool工具,选择配置文件

5

选择开机自启h264

2

保存配置

6

5 编译烧录

重新编译配置

bhu@bhu-PC:~/work/build$ make x2000_darwin_factory_defconfig 

bhu@bhu-PC:~/work/build$ make

烧录固件, 没烧录过见烧录说明

6 测试

驱动加载打印

helix-venc 13200000.helix: encoder(helix) registered as /dev/video1 /*helix加载成功*/
felix-vdec 13300000.felix: h264decoder(felix) registered as /dev/video2 /*felix加载成功*/

设备节点

/dev/video1    /*helix的设备节点*/
/dev/video2 /*felix的设备节点*/

6.1 测试h264

6.1.1 测试h264解码

  • 测试方法
./v4l2_h264dec -t nv12 -v /dev/video2 -f video.mp4.dump.h264 -w 1280 -h 720

注意:
-v 指定felix的video节点
-f 指定要解码的码流
-w 指定图片width
-h 指定图片height
-s 指定解码后的数据存为图片
-p 指定解码后的数据在屏幕预览
  • 标准:h264解码后lcd显示的图像完整无数据丢失

    详细使用见: v4l2-h264dec

6.1.2 测试h264编码

  • 测试方法
./v4l2_h264enc -t nv12 -v /dev/video1 -f video-1280x720_nv12.yuv -w 1280 -h 720
注意:
-v 指定felix的video节点
-f 指定要编码的文件
-w 指定图片width
-h 指定图片height
  • 标准:执行完成后查看生成的output.h264文件是否正常

    详细使用见: v4l2-h264enc

6.2 测试jpeg

6.2.1 测试jpeg解码

  • 测试方法
./v4l2_jpegdec -v /dev/video1 -f test.jpg
  • 标准:执行完成后查看生成output.raw文件是否正常

    详细使用见: v4l2_jpegdec

6.2.2 测试jpeg编码

  • 测试方法
./v4l2_jpegenc -v /dev/video1 -f video-1280x720_nv12.yuv
  • 标准:执行完成后查看生成的output.jpg文件是否正常

    详细使用见: v4l2_jpegenc

6.3 测试ffmpeg

6.3.1 ffmpeg视频流播放命令(软件解码)

ffmpeg -i test-480p.mp4 -pix_fmt nv12 -f x2000_fb /dev/fb0 /*视频流播放*/

6.3.2 ffmpeg音频流播放命令

ffmpeg -i test-480p.mp4 -f alsa default

6.3.3 ffmpeg视频流播放命令(硬件解码)

ffmpeg -c:v h264_v4l2m2m -i test-480p.mp4 -pix_fmt nv12 -f x2000_fb /dev/fb0

6.3.4 ffmpeg h264 硬件编码

# 从摄像头获取数据,编码成h264码流
ffmpeg -f x2000_isp -i /dev/mscaler0-ch0 -vcodec h264_v4l2m2m -b:v 400k -f h264 test.h264

ffmpeg -f x2000_isp -i /dev/mscaler0-ch0 -vcodec h264_v4l2m2m -b:v 400k -f mp4 test.mp4

-b:v 指定码率400k

6.3.5 ffmpeg音视频同时播命令

ffmpeg -c:v h264_v4l2m2m -i test-480p.mp4 -pix_fmt nv12 -f x2000_fb /dev/fb0 -f alsa default

7 ffmpeg编程

3

代码参考:

buildroot/buildroot/output/build/ffmpeg-4.2.2/doc/examples/

​ 分析音视频文件并调用对应的解码器进行解码 demuxing_decoding.c

​ 将视频帧数据编码成需要的编码格式 encode_video.c

​ 将编码后的数据封装成需要的格式文件mp4,avi... muxing.c

buildroot/buildroot/output/build/ffmpeg-4.2.2/fftools/ffmpeg.c