V4L2常用命令标志符和结构体

在进行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 结构体:

typedef u64 v4l2_std_id;
struct v4l2_standard {
	u32 index;
	v4l2_std_id id;
	u8 name[24];
	struct v4l2_fract frameperiod; /* Frames, not fields */
	u32 framelines;
	u32 reserved[4];
};

///

struct v412_input 结构体:

struct v4l2_input {
	__u32 index; 		/* Which input */
	__u8 name[32]; 		/* Label */
	__u32 type; 		/* Type of input */
	__u32 audioset; 	/* Associated audios (bitfield) */
	__u32 tuner; 		/* Associated tuner */
	v4l2_std_id std;
	__u32 status;
	__u32 reserved[4];
};

///

struct v412_crop 结构体:

struct v4l2_crop
{
	enum v4l2_buf_type type;   // 应用程序设置
	struct v4l2_rect c;
}

////

struct v412_cropcap 结构体:

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

////

stuct v412_fmtdesc结构体:

struct v4l2_fmtdesc
{
	u32 index; 			// 要查询的格式序号,应用程序设置
	enum v4l2_buf_type type; 	// 帧类型,应用程序设置
	u32 flags; 			// 是否为压缩格式
	u8 description[32]; 		// 格式名称
	u32 pixelformat;		// 格式
	u32 reserved[4]; 		// 保留
};

////

struct v412_capability结构体:

struct v4l2_capability
{
	u8 driver[16]; 		// 驱动名字
	u8 card[32]; 		// 设备名字
	u8 bus_info[32]; 	// 设备在系统中的位置
	u32 version; 		// 驱动版本号
	u32 capabilities; 	// 设备支持的操作
	u32 reserved[4]; 	// 保留字段
};

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

/////

v4l2_format 结构如下

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;   // 宽,必须是16的倍数
    __u32                   height;    // 高,必须是16的倍数
    __u32                   pixelformat;   // 视频数据存储类型,例如是//YUV4:2:2还是RGB
    enum v4l2_field         field;  
    __u32                   bytesperline;   /* for padding, zero if unused */  
    __u32                   sizeimage;  
    enum v4l2_colorspace    colorspace;  
    __u32                   priv;           /* private data, depends on pixelformat */  
};

/////

struct v412_requestbuffers结构体如下:

struct v4l2_requestbuffers
{
	__u32 count; 			// 缓存数量,也就是说在缓存队列里保持多少张照片
	enum v4l2_buf_type type; 	// 数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
	enum v4l2_memory memory; 	// V4L2_MEMORY_MMAP 或 V4L2_MEMORY_USERPTR
	__u32 reserved[2];
};
 enum v4l2_memory {  
        V4L2_MEMORY_MMAP             = 1,  
        V4L2_MEMORY_USERPTR          = 2,  
        V4L2_MEMORY_OVERLAY          = 3,  
 }; 

/

typedef struct VideBuffer结构体:

typedef struct VideoBuffer {
	void *start;
	size_t  length;
} VideoBuffer;

/ / / //

stuct v412_buffer结构体

truct v4l2_buffer
{
	u32 index;			//buffer 序号
	enum v4l2_buf_type type;	//buffer 类型
	u32 byteused;			//buffer 中已使用的字节数
	u32 flags;			// 区分是MMAP 还是USERPTR
	enum v4l2_field field;
	struct timeval timestamp;	// 获取第一个字节时的系统时间
	struct v4l2_timecode timecode;
	u32 sequence; // 队列中的序号
	enum v4l2_memory memory;	//IO 方式,被应用程序设置
	union m{
		u32 offset;		// 缓冲帧地址,只对MMAP 有效
		unsigned long userptr;
	};
	u32 length;			// 缓冲帧长度
	u32 input;
	u32 reserved;
};


/////


  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值