核心结构体

核心组件作用

组件功能
video_device设备节点注册(创建 /dev/videoX)
v4l2_device设备逻辑管理(电源 / 子设备协调)
vb2_queue缓冲区队列管理(核心创新点)
v4l2_subdev子设备抽象(传感器 / ISP 等)

struct v4l2_buffer

用来描述"一块视频缓冲区"的所有元信息。它的常用字段大致有:

struct v4l2_buffer {
	__u32			index;//这块缓冲区在缓冲区队列里的编号(0、1、2...),对应 REQBUFS 申请到的第几块
	__u32			type;//缓冲区类型,V4L2_BUF_TYPE_VIDEO_CAPTURE(采集)
	__u32			bytesused;//single-planar 的有效数据字节数;multi-planar 使用 planes[i].bytesused
	__u32			flags;//状态标志位,比如 V4L2_BUF_FLAG_DONE(已完成采集)等
	__u32			field;
	struct timeval		timestamp;//采集这一帧的时间戳
	struct v4l2_timecode	timecode;
	__u32			sequence;

	/* memory location */
    /*内存管理方式:V4L2_MEMORY_MMAP(内核分配,mmap映射)、V4L2_MEMORY_USERPTR(用户自己分配)、V4L2_MEMORY_DMABUF 等*/
	__u32			memory;
	union {
		__u32           offset;//当 memory = MMAP 时有效,表示这块缓冲区在设备内存映射空间里的偏移量,供 mmap() 使用
		unsigned long   userptr;//当 memory = USERPTR 时有效,指向用户自己分配的内存地址
		struct v4l2_plane *planes;
		__s32		fd;
	} m;
	__u32			length;//single-planar 为缓冲区字节数;multi-planar 为 m.planes 数组的元素数
	__u32			reserved2;
	union {
		__s32		request_fd;
		__u32		reserved;
	};
};

参考:V4L2 buffer。