之前调试MXC V4L2驱动一直没有注意到output/mxc_v4l2_output.c这个文件,因为capture/*.c已经提供了still capture, stream capture, 以及overlay,所以没仔细的去看mxc_v4l2_output.c提供的功能,直到前几天负责维护overlay hal的同事提出打开了overlay hal /dev/video16这个设备节点,才让我跟到这个文件中
先从/dev/video0 和video16说起:
MXC V4L2生成了三个设备节点, /dev/radio0 /dev/video0以及/dev/video16, /dev/radio0就不讨论了,项目中没接触到。
/dev/video0是mxc_v4l2_capture驱动创建的设备节点, 而/dev/video16是mxc_v4l2_output驱动创建的设备节点。
/dev/video0节点既可用于capture又可用来overlay,
而/dev/video16完全是为push mode overlay模式服务的,所谓push mode模式(以下几行纯属臆测):应用通过stream capture从/dev/video0 dequeue到图像buffer数据,然后把这个指针再传给/dev/video16(当然是通过VIDIOC_Q_BUF),output 模块会直接将queue进来的buffer直接输出到framebuffer,这就完成了Overlay功能
push mode overlay和 /dev/video0支持的直接overlay的区别是, push mode overlay需要应用空间参与数据的处理,用户空间参与的代价就是cpu占用率,好处是用空间有机会接触到每一帧传送到 framebuffer的数据。而直接overlay是你启动overlay后,所有数据直接从camera流动到framebuffer, 中间没有任何机会接触数据,只能在frame buffer这里截获数据,速度是真快。(先到这里吧,有任务)
push mode模式的另外一个好处是,就是你可以使用USB camera, 对camera进行处理显示
output设备支持多个输出,分别为DISP3 FG, DISP3 BG, DISP3 BG - DI1
DISP3 FG: 是FG overlay,用来显示video
DISP3 BG: 主显示,用来显示UI界面
DISP3 BG - DI1: TVOUT,用来显示CVBS输出数据
代码分析