v4l2 编程接口 — ioctl

在Linux系统中,应用程序通过ioctl命令与V4L2驱动进行交互来获取视频数据。常见的ioctl命令包括VIDIOC_QUERYCAP、VIDIOC_G_FMT、VIDIOC_S_FMT等,涉及设备能力、视频格式、内存缓冲等方面的设置。例如,VIDIOC_QUERYCAP用于获取设备支持的操作,VIDIOC_S_FMT用于设置视频捕获格式,VIDIOC_REQBUFS用于申请内存缓冲。这些命令通过结构体如v4l2_capability、v4l2_format等传递参数。此外,还包括视频流的开启和关闭、控制命令查询与设置、调谐器信息等操作。
摘要由CSDN通过智能技术生成
在应用程序获取视频数据的流程中,都是通过 ioctl 命令与驱动程序进行交互,常见的 ioctl 命令有:
[cpp] view plaincopy
VIDIOC_QUERYCAP     /* 获取设备支持的操作 */  
VIDIOC_G_FMT        /* 获取设置支持的视频格式 */  
VIDIOC_S_FMT        /* 设置捕获视频的格式 */  
VIDIOC_REQBUFS      /* 向驱动提出申请内存的请求 */  
VIDIOC_QUERYBUF     /* 向驱动查询申请到的内存 */  
VIDIOC_QBUF         /* 将空闲的内存加入可捕获视频的队列 */  
VIDIOC_DQBUF        /* 将已经捕获好视频的内存拉出已捕获视频的队列 */  
VIDIOC_STREAMON     /* 打开视频流 */  
VIDIOC_STREAMOFF    /* 关闭视频流 */  
VIDIOC_QUERYCTRL    /* 查询驱动是否支持该命令 */  
VIDIOC_G_CTRL       /* 获取当前命令值 */  
VIDIOC_S_CTRL       /* 设置新的命令值 */  
VIDIOC_G_TUNER      /* 获取调谐器信息 */  
VIDIOC_S_TUNER      /* 设置调谐器信息 */  
VIDIOC_G_FREQUENCY  /* 获取调谐器频率 */  
VIDIOC_S_FREQUENCY  /* 设置调谐器频率 */  
VIDIOC_DQEVENT   //出队列处理命令


ret = ioctl(dev->fd, VIDIOC_DQEVENT, &v4l2_event);//出队列处理命令
if (ret < 0) {
printf("VIDIOC_DQEVENT failed: %s (%d)\n", strerror(errno),
errno);
return;
}
switch (v4l2_event.type) {//处理命令 


       case UVC_EVENT_CONNECT:
   case UVC_EVENT_DISCONNECT:
   return;


   case UVC_EVENT_SETUP:
                   break;
       }


1、struct v4l2_capability 与 VIDIOC_QUERYCAP
VIDIOC_QUERYCAP 命令通过结构 v4l2_capability 获取设备支持的操作模式:
[cpp] view plaincopy
struct v4l2_capability {  
    __u8    driver[16];     /* i.e. "bttv" */  
    __u8    card[32];       /* i.e. "Hauppauge WinTV" */  
    __u8    bus_info[32];   /* "PCI:" + pci_name(pci_dev) */  
    __u32   version;        /* should use KERNEL_VERSION() */  
    __u32   capabilities;   /* Device capabilities */  
    __u32   reserved[4];  
};  
其中域 capabilities 代表设备支持的操作模式,常见的值有 V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING 表示是一个视频捕捉设备并且具有数据流控制模式;另外 driver 域需要和 struct video_device 中的 name 匹配。
2、struct v4l2_format 与 VIDIOC_G_FMT、VIDIOC_S_FMT、VIDIOC_TRY_FMT
通常用 VIDIOC_S_FMT 命令通过结构 v4l2_format 初始化捕获视频的格式,如果要改变格式则用 VIDIOC_TRY_FMT 命令:
[cpp] view plaincopy
struct v4l2_format {  
    enum v4l2_buf_type type;  
    union {  
        struct v4l2_pix_format         pix;     /* V4L2_BUF_TYPE_VIDEO_CAPTURE */  
        struct v4l2_window             win;     /* V4L2_BUF_TYPE_VIDEO_OVERLAY */  
        struct v4l2_vbi_format         vbi;     /* V4L2_BUF_TYPE_VBI_CAPTURE */  
        struct v4l2_sliced_vbi_format  sliced;  /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */  
        __u8   raw_data[200];                   /* user-defined */  
    } fmt;  
};  
其中  
enum v4l2_buf_type {  
    V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,  
    V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,  
    V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,  
    ...  
    V4L2_BUF_TYPE_PRIVATE              = 0x80,  
};  
  
struct v4l2_pix_format {  
    __u32                   width;  
    __u32                   height;  
    __u32                   pixelformat;  
    enum v4l2_field         field;  
    __u32                   bytesperline;   /* for padding, zero if unused */  
    __u32                   sizeimage;  
    enum v4l2_colorspace    colorspace;  
    __u32    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值