6/20/2011 9:01:25 PM

 

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  帧缓存信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值