uvc_ioctl分析

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值