v4l2 buffer

来源:互联网 发布:大数据精准营销服务商 编辑:程序博客网 时间:2024/06/01 07:33
vivi.c

static int vidioc_reqbufs(struct file *file, void *priv,
              struct v4l2_requestbuffers *p)
--> videobuf_reqbufs(&dev->vb_vidq, p);
------->q->ops->buf_setup(q, &count, &size);

static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
-->int videobuf_qbuf(struct videobuf_queue *q, struct v4l2_buffer *b)
------>    retval = q->ops->buf_prepare(q, buf, field);
------> q->ops->buf_queue(q, buf);


    struct vb2_queue       vb_vidq; //interaction with user space
    struct vivi_dmaqueue       vidq; //interaction with hardware

int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b)
---> __enqueue_in_driver(vb);
------->q->ops->buf_queue(vb);

static void buffer_queue(struct vb2_buffer *vb)
---->list_add_tail(&buf->list, &vidq->active); //add buffer to dma free buffer queue


buf = list_entry(dma_q->active.next, struct vivi_buffer, list);//get a free buffer
list_del(&buf->list);
vivi_fillbuff(dev, buf);/* Fill buffer */
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);//send notification to user the buffer is filled