V4L2的一些结构体 和指令 找了好久才找到

VIDIOC_REQBUFS:  分配内存
VIDIOC_QUERYBUF: 把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
VIDIOC_QUERYCAP: 查询驱动功能
VIDIOC_ENUM_FMT: 获取当前驱动支持的视频格式
VIDIOC_S_FMT: 设置当前驱动的频捕获格式
VIDIOC_G_FMT: 读取当前驱动的频捕获格式
VIDIOC_TRY_FMT: 验证当前驱动的显示格式
VIDIOC_CROPCAP: 查询驱动的修剪能力
VIDIOC_S_CROP: 设置视频信号的边框
VIDIOC_G_CROP: 读取视频信号的边框
VIDIOC_QBUF: 把数据放回缓存队列
VIDIOC_DQBUF: 把数据从缓存中读取出来
VIDIOC_STREAMON: 开始视频显示函数
VIDIOC_STREAMOFF: 结束视频显示函数
VIDIOC_QUERYSTD: 检查当前视频设备支持的标准,例如PAL或NTSC。


常用的结构体(参见/usr/include/linux/videodev2.h):


struct v4l2_requestbuffers reqbufs; //向驱动申请帧缓冲的请求,里面包含申请的个数
struct v4l2_capability cap; //这个设备的功能,比如是否是视频输入设备
struct v4l2_input input; //视频输入
struct v4l2_standard std; //视频的制式,比如PAL,NTSC
struct v4l2_format fmt; //帧的格式,比如宽度,高度等
struct v4l2_buffer buf; //代表驱动中的一帧
v4l2_std_id stdid; //视频制式,例如:V4L2_STD_PAL_B
struct v4l2_queryctrl query; //查询的控制
struct v4l2_control control; //具体控制的值

///

struct v412_standard 结构体:

[cpp] view plain copy
 print?
  1. typedef u64 v4l2_std_id;  
  2. struct v4l2_standard {  
  3.     u32 index;  
  4.     v4l2_std_id id;  
  5.     u8 name[24];  
  6.     struct v4l2_fract frameperiod; /* Frames, not fields */  
  7.     u32 framelines;  
  8.     u32 reserved[4];  
  9. };  

///

struct v412_input 结构体:

[cpp] view plain copy
 print?
  1. struct v4l2_input {  
  2.     __u32 index;        /* Which input */  
  3.     __u8 name[32];      /* Label */  
  4.     __u32 type;         /* Type of input */  
  5.     __u32 audioset;     /* Associated audios (bitfield) */  
  6.     __u32 tuner;        /* Associated tuner */  
  7.     v4l2_std_id std;  
  8.     __u32 status;  
  9.     __u32 reserved[4];  
  10. };  

///

struct v412_crop 结构体:

[cpp] view plain copy
 print?
  1. struct v4l2_crop  
  2. {  
  3.     enum v4l2_buf_type type;   // 应用程序设置  
  4.     struct v4l2_rect c;  
  5. }  

////

struct v412_cropcap 结构体:

[cpp] view plain copy
 print?
  1. struct v4l2_cropcap  
  2. {  
  3.     enum v4l2_buf_type type;    // 数据流的类型,应用程序设置  
  4.     struct v4l2_rect bounds;    // 这是 camera 的镜头能捕捉到的窗口大小的局限  
  5.     struct v4l2_rect defrect; // 定义默认窗口大小,包括起点位置及长,宽的大小,大小以像素为单位  
  6.     struct v4l2_fract pixelaspect;  // 定义了图片的宽高比  
  7. };  

////

stuct v412_fmtdesc结构体:

[cpp] view plain copy
 print?
  1. struct v4l2_fmtdesc  
  2. {  
  3.     u32 index;          // 要查询的格式序号,应用程序设置  
  4.     enum v4l2_buf_type type;    // 帧类型,应用程序设置  
  5.     u32 flags;          // 是否为压缩格式  
  6.     u8 description[32];         // 格式名称  
  7.     u32 pixelformat;        // 格式  
  8.     u32 reserved[4];        // 保留  
  9. };  

////

struct v412_capability结构体:

[cpp] view plain copy
 print?
  1. struct v4l2_capability  
  2. {  
  3.     u8 driver[16];      // 驱动名字  
  4.     u8 card[32];        // 设备名字  
  5.     u8 bus_info[32];    // 设备在系统中的位置  
  6.     u32 version;        // 驱动版本号  
  7.     u32 capabilities;   // 设备支持的操作  
  8.     u32 reserved[4];    // 保留字段  
  9. };  

其中域 capabilities 代表设备支持的操作模式,常见的值有 V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING 表示是一个视频捕捉设备并且具有数据流控制模式;另外 driver 域需要和 struct video_device 中的 name 匹配

/////

v4l2_format 结构如下

[cpp] view plain copy
 print?
  1. struct v4l2_format {    
  2.     enum v4l2_buf_type type;    
  3.     union {    
  4.         struct v4l2_pix_format         pix;     /* V4L2_BUF_TYPE_VIDEO_CAPTURE */    
  5.         struct v4l2_window             win;     /* V4L2_BUF_TYPE_VIDEO_OVERLAY */    
  6.         struct v4l2_vbi_format         vbi;     /* V4L2_BUF_TYPE_VBI_CAPTURE */    
  7.         struct v4l2_sliced_vbi_format  sliced;  /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */    
  8.         __u8   raw_data[200];                   /* user-defined */    
  9.     } fmt;    
  10. };    
  11. 其中    
  12. enum v4l2_buf_type {    
  13.     V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,    
  14.     V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,    
  15.     V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,    
  16.     ...    
  17.     V4L2_BUF_TYPE_PRIVATE              = 0x80,    
  18. };    
  19.     
  20. struct v4l2_pix_format {    
  21.     __u32                   width;   // 宽,必须是16的倍数  
  22.     __u32                   height;    // 高,必须是16的倍数  
  23.     __u32                   pixelformat;   // 视频数据存储类型,例如是//YUV4:2:2还是RGB  
  24.     enum v4l2_field         field;    
  25.     __u32                   bytesperline;   /* for padding, zero if unused */    
  26.     __u32                   sizeimage;    
  27.     enum v4l2_colorspace    colorspace;    
  28.     __u32                   priv;           /* private data, depends on pixelformat */    
  29. };  

/////

struct v412_requestbuffers结构体如下:

[cpp] view plain copy
 print?
  1. struct v4l2_requestbuffers  
  2. {  
  3.     __u32 count;            // 缓存数量,也就是说在缓存队列里保持多少张照片  
  4.     enum v4l2_buf_type type;    // 数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE  
  5.     enum v4l2_memory memory;    // V4L2_MEMORY_MMAP 或 V4L2_MEMORY_USERPTR  
  6.     __u32 reserved[2];  
  7. };  
  8.  enum v4l2_memory {    
  9.         V4L2_MEMORY_MMAP             = 1,    
  10.         V4L2_MEMORY_USERPTR          = 2,    
  11.         V4L2_MEMORY_OVERLAY          = 3,    
  12.  };   

/

typedef struct VideBuffer结构体:

[cpp] view plain copy
 print?
  1. typedef struct VideoBuffer {  
  2.     void *start;  
  3.     size_t  length;  
  4. } VideoBuffer;  

/////

stuct v412_buffer结构体

[cpp] view plain copy
 print?
  1. truct v4l2_buffer  
  2. {  
  3.     u32 index;          //buffer 序号  
  4.     enum v4l2_buf_type type;    //buffer 类型  
  5.     u32 byteused;           //buffer 中已使用的字节数  
  6.     u32 flags;          // 区分是MMAP 还是USERPTR  
  7.     enum v4l2_field field;  
  8.     struct timeval timestamp;   // 获取第一个字节时的系统时间  
  9.     struct v4l2_timecode timecode;  
  10.     u32 sequence; // 队列中的序号  
  11.     enum v4l2_memory memory;    //IO 方式,被应用程序设置  
  12.     union m{  
  13.         u32 offset;     // 缓冲帧地址,只对MMAP 有效  
  14.         unsigned long userptr;  
  15.     };  
  16.     u32 length;         // 缓冲帧长度  
  17.     u32 input;  
  18.     u32 reserved;  
  19. };  

你可能感兴趣的:(l4v2)