6/20/2011 9:01:25 PM
VIDIOC_REQBUFS 请求buffer
/* Used for YCrCb data, it is stored in three areas */
struct v_frame
{
int index;
int height;
int width;
void * start[3]; //yuv data
size_t length[3];
};
分配了一个结构体数组
接着逐一查看每一个buffer,将这些buffer的内容映射出来
然后将映射的内容存放在结构体数组中
将整个buffer再次进行拆分
然后将各个buffer放入到缓存队列中
取帧的时候就是不停的取buffer,然后进行拷贝
查看一下前端采集的问题
VIDIOC_QBUF
struct v4l2_buffer
{
__u32 index;
enum v4l2_buf_type type;
__u32 bytesused;
__u32 flags;
enum v4l2_field field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
/* memory location */
enum v4l2_memory memory;
union {
__u32 offset;
unsigned long userptr;
} m;
__u32 length;
__u32 input;
__u32 reserved;
};
重要的是内存 类型 索引
如果类型不为 V4L2_BUF_TYPE_VIDEO_CAPTURE ,则退出
查看内存方式,如果不是映射内存或映射指针就退出
我们使用的是映射的方式
struct pxa_camera_driver_status_t {
int still_buf_ready;
int video_buf_ready;
int still_buf_submited;
int video_buf_submited;
int still_capture_started;
int video_capture_started;
struct list_head still_buf_head;
struct list_head video_buf_head;
struct list_head still_report_head;
struct list_head video_report_head;
unsigned int still_timeperframe_numerator;
unsigned int video_timeperframe_numerator;
unsigned int still_timeperframe_denominator;
unsigned int video_timeperframe_denominator;
int capture_mode;
int *p_buf_ready;
int *p_buf_submited;
int *p_capture_started;
struct list_head *p_buf_head;
struct list_head *p_report_head;
unsigned int *p_timeperframe_numerator;
unsigned int *p_timeperframe_denominator;
wait_queue_head_t camera_wait_q;
#ifdef CONFIG_DVFM
wait_queue_head_t wait_outd0cs;
#endif
int task_waiting;
int driver_opened;
int re_init_needed;
int re_bufprepare_needed;
int re_bufsubmit_needed;
int re_formatset_needed;
int i2c_inited;
int suspended;
};
static struct pxa_camera_driver_status_t g_camdrv_status;
检测摄像头驱动上的链表的个数
如果buffer传入的index值超过g_camdrv_status中p_buf_head链表中buffer的数目就直接退出
static spinlock_t report_list_lock; /* Spin lock for report_list */
还有报告列表的自旋锁
接着要提交 camera_submit_buffer
struct buf_node {
unsigned int io_type; /* camera IO methods */
struct list_head buf_head; /* For buffer list */
struct list_head report_head; /* For report buffer list */
void *vaddr; /* vmap() return virtual address */
struct page **pages; /* physical pages */
int page_num; /* physical pages count */
int buf_id; /* buffer id to let driver access */
int buf_index; /* buffer index */
int size; /* buffer size */
void *dma_desc_vaddr; /* dma description virtual address */
dma_addr_t dma_desc_paddr; /* dma description physical address */
int dma_desc_size; /* dma description size */
void *Y_vaddr; /* Y virtual address */
void *Cb_vaddr; /* Cb virtual address */
void *Cr_vaddr; /* Cr virtual address */
int fifo0_size; /* fifo0 data transfer size */
int fifo1_size; /* fifo1 data transfer size */
int fifo2_size; /* fifo2 data transfer size */
};
通过index找到对应的buf_node,
mcam_submit_buffer
提交一个buffer到捕获队列中
struct camera_frame_buffer_info_s 帧缓存信息