基于Linux的v4l2视频架构驱动编写(二)

来源:互联网 发布:可靠的网络兼职 编辑:程序博客网 时间:2024/05/21 01:44

于Linux的v4l2视频架构驱动编写,控制命令VIDIOC_S_FMT //直接告诉你,s是set的意思,功能: 设置视频设备的视频数据格式,例如设置视频图像数据的长、宽

3. 控制命令VIDIOC_S_FMT //直接告诉你,s是set的意思

功能: 设置视频设备的视频数据格式,例如设置视频图像数据的长、宽,图像格式(JPEG、YUYV格式);

参数说明:参数类型为V4L2的视频数据格式类型 struct v4l2_format ;

返回值说明: 执行成功时,函数返回值为 0;

使用举例:

----------------------------------------------------------------------------------------------------------

struct v4l2_format tv4l2_format;

tv4l2_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

tv4l2_format.fmt.pix.width = img_width;

tv4l2_format.fmt.pix.height = img_height;

tv4l2_format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;

tv4l2_format.fmt.pix.field = V4L2_FIELD_INTERLACED;

iret = ioctl(fd_usbcam, VIDIOC_S_FMT, &tv4l2_format);

-----------------------------------------------------------------------------------------------------------

注意:如果该视频设备驱动不支持你所设定的图像格式,视频驱动会重新修改struct v4l2_format结构体变量的值为该视频设备所支持的图像格式,所以在程序设计中,设定完所有的视频格式后,要获取实际的视频格式,要重新读取struct v4l2_format结构体变量。

4. 控制命令VIDIOC_REQBUFS //我不问了,你自己问自己吧

功能: 请求V4L2驱动分配视频缓冲区(申请V4L2视频驱动分配内存),V4L2是视频设备的驱动层,位于内核空间,所以通过VIDIOC_REQBUFS控制命令字申请的内存位于内核空间,应用程序不能直接访问,需要通过调用mmap内存映射函数把内核空间内存映射到用户空间后,应用程序通过访问用户空间地址来访问内核空间。

参数说明:参数类型为V4L2的申请缓冲区数据结构体类型struct v4l2_requestbuffers ;

返回值说明: 执行成功时,函数返回值为 0;V4L2驱动层分配好了视频缓冲区;

使用举例:

-----------------------------------------------------------------------------------------------------

struct v4l2_requestbuffers tV4L2_reqbuf;

memset(&tV4L2_reqbuf, 0, sizeof(struct v4l2_requestbuffers ));

tV4L2_reqbuf.count = 1; //申请缓冲区的个数

tV4L2_reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

tV4L2_reqbuf.memory = V4L2_MEMORY_MMAP;

iret = ioctl(fd_usbcam, VIDIOC_REQBUFS, &tV4L2_reqbuf);

-----------------------------------------------------------------------------------------------------

注意:VIDIOC_REQBUFS会修改tV4L2_reqbuf的count值,tV4L2_reqbuf的count值返回实际申请成功的视频缓冲区数目;



原创粉丝点击