主程序流程分析:
- 处理命令行输入,主要是对输入和输出的宽、高、起始位置及视频capture的指定
- Open视频capture
- Open “frame buffer0”
- 通过FBIOGET_VSCREENINFO ioctl命令,获取fb0的可变参数
- 根据获取的fb0的可变参数判断1中输入参数中“左、右、上、下”是否合法
- 通过FBIOGET_FSCREENINFO ioctl命令,获取fb0的固定参数
- 根据fb0固定参数的id,通过VIDIOC_S_OUTPUT ioctl命令设置输出通路("DISP3 BG - DI1"这些跟V4L2驱动层对应,总共可以有6路输出)
- 调用mxc_v4l_overlay_setup设置overlay模式
- Open “frame buffer1”
- 通过FBIOGET_FSCREENINFO ioctl获取fb1固定参数
- 根据fb1固定参数的id判断fb1(前景)和fb0(背景)是否为同一组(DISP3或DISP4)
- Open “frame buffer2”
- 通过FBIOGET_FSCREENINFO ioctl获取fb2固定参数并判断与fb0是否为同一组(注,只有在11步不满足的情况下才执行12、13步,即fb1不满足情况下选fb2)
- 如果设置了overlay参数(-fg)执行15~22步
- 通过MXCFB_SET_GBL_ALPHA ioctl使能全局alpha,值为0
- 通过MXCFB_SET_CLR_KEY ioctl设置color key
- 如果设置了alpha模式(-a)执行18~21步
- 通过FBIOPUT_VSCREENINFO ioctl命令设置前景变参
- 通过FBIOGET_VSCREENINFO ioctl命令获取刚设置的前景变参
- 通过MXCFB_SET_LOC_ALPHA ioctl命令设置前景的本地alpha,地址0、1均设置为0
- 调用mmap分配alpha buffer0和buffer1
- 通过VIDIOC_G_FBUF ioctl命令获取v4l2 framebuffer ,并把flag设置为V4L2_FBUF_FLAG_OVERLAY
- 如果没有设置了overlay参数(没有-fg)执行24~27步
- 如果设置了alpha模式(-a)执行25~26步
- 通过MXCFB_SET_LOC_ALPHA ioctl命令设置背景的本地alpha,地址0、1均设置为0
- 调用mmap分配alpha buffer0和buffer1
- 根据背景fb0的var设置fb_v4l2的fmt成员,并把flag设置为V4L2_FBUF_FLAG_PRIMARY
- 根据前面设置的fb_v4l2,通过VIDIOC_S_FBUF ioctl命令设置v4l2 framebuffer
- 通过VIDIOC_G_FBUF ioctl命令获取下v4l2 framebuffer
- 调用mxc_v4l_overlay_test进行overlay测试
mxc_v4l_overlay_setup函数:
- 通过VIDIOC_ENUM_FRAMESIZES ioctl获取sensor支持的frame size,并打印
- 通过VIDIOC_ENUM_FMT ioctl获取sensor支持的frame format,并打印
- 获取VIDIOC_G_CROP (crop为何物)
- 设置VIDIOC_S_CROP(capture)
- 通过VIDIOC_S_FMT设置v4l2的format(capture)
- 通过VIDIOC_S_PARM设置framerate
- 通过VIDIOC_S_CTRL设置rotate参数
- 设置overlay模式下的crop和fmt
mxc_v4l_overlay_test函数:
- 通过VIDIOC_OVERLAY ioctl命令打开overlay模式
- 如果设置了alpha执行3~7步
- Open fb0
- FBIOGET_VSCREENINFO 获取变参
- 调用fill_alpha_buffer将alpha_buf0、1填充好
- 通过MXCFB_SET_LOC_ALP_BUF ioctl设置本地alpha地址
- 循环调用fill_alpha_buffer设置alpha buffer
- 通过VIDIOC_S_CTRL ioctl flash a frame三次
- 如果设置了g_camera_color(-v参数),则进行相应处理
- 进入while循环sleep