核心结构体
核心组件作用
| 组件 | 功能 |
|---|---|
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。