VPU编解码驱动和应用
1. VPU控制器简介
X2000将vpu分为felix和helix两部分:
- felix是h264解码,包括:流解析器、运动补偿、反量化、IDCT和De-block engines的功能
- 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
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
保存buildroot 配置
bhu@bhu-PC:~/work/buildroot/buildroot$ cp .config ../../build/configs/buildroot/buildroot_x2000_darwin_debug
4 IConfigTool配置
打开IConfigTool工具,选择配置文件
选择开机自启h264
保存配置
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编程
代码参考:
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