struct vb2_queue
queued_list
done_list保存准备出队到用户空间的缓冲区;
struct vb2_queue {
>---unsigned int>--->--->---type;
>---unsigned int>--->--->---io_modes;
...
>---const struct vb2_ops>--->---*ops;
>---const struct vb2_mem_ops>---*mem_ops;
>---const struct vb2_buf_ops>---*buf_ops;
...
//保存视频数据和信息的核心结构体,每一帧的图像都对应一个struct vb2_buffer结构体,图像信息保存在struct v4l2_buffer结构中
>---struct vb2_buffer>-->---*bufs[VB2_MAX_FRAME]; //所有动态分配的struct vb2_buffer结构体保存到bufs数组中
struct vb2_buffer { // video缓冲区描述符
struct v4l2_buffer v4l2_buf; // 关联的缓冲区,可以被驱动read
// struct v4l2_buffer用来指定与描述一帧帧缓冲,应用可以设置
struct v4l2_buffer {
__u32 index; // buffer的编号
__u32 type; // buffer的类型,由enum v4l2_buf_type定义
//V4L2_BUF_TYPE_VIDEO_CAPTURE
struct timeval timestamp; // 视频帧时间戳
struct v4l2_timecode timecode; // 时间码
__u32 sequence; // 该帧的序列号
__u32 memory; // enum v4l2_memory枚举定义
...
};
struct vb2_queue *vb2_queue; // 该vb2_buffer所属的vb2_queue
unsigned int num_planes; // 该buffer有多少个planes
enum vb2_buffer_state state; // buffer的当前状态
enum vb2_buffer_state { // 缓冲区状态枚举
VB2_BUF_STATE_DEQUEUED, // 缓冲区出队,处于用户空间的控制下,默认状态
VB2_BUF_STATE_PREPARING, // videobuf2正在准备缓冲区
VB2_BUF_STATE_PREPARED, // 缓冲区已准备好
VB2_BUF_STATE_QUEUED, // 缓冲区入队,处于videobuf2中,不处于驱动中
VB2_BUF_STATE_ACTIVE, // 缓冲区位于驱动中
VB2_BUF_STATE_DONE, // 缓冲区从驱动返回到videobuf2,但还没出队到用户空间
VB2_BUF_STATE_ERROR, // 出错,dequeued到用户空间会报错
};
// queued buffer链表,保存所有从userspace queued进的buffers
struct list_head queued_entry;
// 保存所有准备dequeued到userspace的buffers链表
struct list_head done_entry;
......
};
>---unsigned int>--->--->---num_buffers; //分配/使用的缓冲区数
>---struct list_head>--->---queued_list; //保存所有从用户空间入队的缓冲区;
>---unsigned int>--->--->---queued_count; //入队并准备好进行流传输的缓冲区数。
>---struct list_head>--->---done_list; 保存准备出队到用户空间的缓冲区;
};