1.VIDIOC_QUERYCAP:
APP调用
struct v4l2_capability
{
__u8 driver[16]; // 驱动名字
__u8 card[32]; // 设备名字
__u8 bus_info[32]; // 设备在系统中的位置
__u32 version; // 驱动版本号
__u32 capabilities; // 设备支持的操作
__u32 reserved[4]; // 保留字段
};
struct v4l2_capability cap;
ioctl(fd,VIDIOC_QUERYCAP,&cap);
驱动程序
static int myuvc_vidioc_querycap(struct file *file, void *priv,
struct v4l2_capability *cap)
{
memset(cap, 0, sizeof *cap);
strcpy(cap->driver, "myuvc");
strcpy(cap->card, "myuvc");
cap->version = 1;
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
return 0;
}
总结:主要是查看驱动程序所支持的属性,这里支持的就是VIDEO_CAPTURE和V4L2_CAP_STREAMING。
2.Format相关:S_FMT,try_fmt,enum_fmt,g_fmt
APP调用:
struct v4l2_format format ;
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
format.fmt.pix.width = Width;
format.fmt.pix.height = Hight;
format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV ;
ret = ioctl(video_fd , VIDIOC_S_FMT , &format); //实现的功能:1.测试驱动程序是 否支持 2.传递尺寸大小并在驱动程序里面进行调整 3.然后将尺寸大小拷贝给驱动程序(myuvc_format)
驱动程序:
static int myuvc_vidioc_try_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
unsigned int maxw,maxh;
enum v4l2_field field;
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV)
return -EINVAL;
field = f->fmt.pix.field;
if (field == V4L2_FIELD_ANY) {
field = V4L2_FIELD_INTERLACED;
} else if (V4L2_FIELD_INTERLACED != field) {
return -EINVAL;
}
maxw=1024;
maxh=768;
/*
*调整format的width,height
*计算bytesperline,每一行占据的字节数
*计算sizeimage,一幅图像的大小
*/
v4l_bound_align_image(&f->fmt.pix.width, 48, maxw, 2,
&f->fmt.pix.height, 32, maxh, 0, 0);
f->fmt.pix.bytesperline =
(f->fmt.pix.width * 16) >> 3;//16是一个像素点的大小,通过描述bBitsPerPixel得到
f->fmt.pix.sizeimage =
f->fmt.pix.height * f->fmt.pix.bytesperline;
return 0;
}
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
struct vivi_dev *dev = video_drvdata(file);
struct vb2_queue *q = &dev->vb_vidq;
int ret = myvivi_vidioc_try_fmt_vid_cap(file, priv, f);
if (ret < 0)
return ret;
memcopy(&myuvc_format,f,sizeof(myuvc_format));
return ret;
}
static int myvivi_vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
struct vivi_fmt *fmt