对于使用飞思卡尔的vpu进行硬件编解码,你需要配置出你linux下LTIB环境,导出imx-test中的mxc_vpu_test源码,这方面的内容在之前文档已经说明,可以去查看,这篇文章主要介绍视频采集以及编解码,对于摄像头设备主要有两种,一种是USB摄像头,另一种是摄像头模组,例如:ov5640;本文主要分析这两种视频采集后再编解码。
如果你是买着天嵌的开发板,那么这方面的驱动都已经有了,如果你是自己编译的内核或者没这个驱动,那么你需要手动去加载,下面这些都需要去加载:
insmod ipu_prp_enc.ko
insmod ipu_bg_overlay_sdc.ko
insmod ipu_fg_overlay_sdc.ko
insmod ipu_csi_enc.ko
insmod ov5642_camera.ko
insmod mxc_v4l2_capture.ko
加载完成后,就可以直接用mxc_vpu_test编译出来的mxc_vpu_test.out去进行编解码:
./mxc_vpu_test.out -E "-o vpu.h264 -f 2 -w 640 -h 480" //摄像头采集后编码
./mxc_vpu_test.out -D "-i vpu.h264 -f 2 -u 1 -w 640 -h 480"//解码
对于mxc_vpu_test.out更多的功能,你可以使用mxc_vpu_test.out -help去查看,或者直接去看源码。
对于usb摄像头,只要你的ARM板支持usb摄像头,就会在/dev/下产生设备video*,这就是usb摄像头设备,你可以直接对它操作,对于usb摄像头难的不是驱动,而是飞思卡尔官方代码mxc_vpu_test是不支持usb摄像头的,所以你需要去修改源码来实现对usb摄像头的支持,对于代码的修改,主要有两点:修改v4l2代码适合usb摄像头、把摄像头采集的数据YUV422转为420(NV12)。
这是本文中最为重要的部分,也是最难的部分,其实飞思卡尔不仅仅提供了vpu接口对视频编解码,同时也提供了ipu接口对视频图像进行处理,这里我就是使用它的ipu接口实现了YUV422转为420(NV12)的转化。在飞思卡尔官方可以下载ipu例子:https://community.freescale.com/docs/DOC-94961,下载完成后,在ipu-examples/mx6/resizing/example1下有个res_ex1.c文件就是实现YUV格式之间转化,如果代码下载不了也可以去这里下载:http://download.csdn.net/detail/u012478275/9501984,得到代码后,就可以把ipu代码嵌入到mxc_vpu_test代码中,在这里你需要注意两点:
1、得到一帧数据就需要转化;
2、转化后赋给vpu解码的帧数据要正确;
在这里我贴出主要代码供参考:
memcpy(inbuf,cap_buffers[v4l2_buf.index].start,cap_buffers[v4l2_buf.index].length);
// Perform the rotation
ret = ioctl(fd_ipu, IPU_QUEUE_TASK, &task);
if (ret < 0) {
printf("ioct IPU_QUEUE_TASK fail\n");
goto err2;
}
fb[src_fbid].myIndex = enc->src_fbid + v4l2_buf.index;
//fb[src_fbid].bufY = cap_buffers[v4l2_buf.index].offset;
fb[src_fbid].bufY = task.output.paddr;
关键就是这里的代码,关于之前那些直接照搬就可以了,当然整个可以实现的代码我也提供出来了,可以去下载:
http://download.csdn.net/detail/u012478275/9502019
总结:这文章主要是imx6Q的视频采集和vpu编解码,主要分析的是usb摄像头的采集和编解码,因为这方面的资料比较少,如果你还有什么难题可以直接给我留言,关于对于mxc_vpu_test程序分离和单独编译,可以查看后面的文章。