v4l2使用vb2_ops进行缓冲区管理。有时不会调用buf_prepare和buf_queue。

时间:2018-07-26 08:54:19

标签: v4l2

我在v4l2驱动程序中使用vb2_ops。有时在我的v4l2驱动程序中未调用buf_prepare和buf_queue。因此,v4l2线程中的队列变为空,因此不再执行任何缓冲区操作。下面是vb2_ops和v4l2线程的代码段。

static const struct vb2_ops v4l2_vb2_qops = {
        .queue_setup = queue_setup,
        .buf_prepare = buffer_prepare,
        .buf_queue = buffer_queue,
        .start_streaming = start_streaming,
        .stop_streaming = stop_streaming,
        .wait_prepare = vb2_ops_wait_prepare,
        .wait_finish = vb2_ops_wait_finish,
};

下面是my_v4l2驱动程序中遵循的步骤。

1) queue_setup

2) buffer_prepare

3) buffer_queue

4) start_streaming

    4.1) create thread(happens only once)

    4.2) DMA transfer 

    4.3) update buffer state to VB2_BUF_STATE_DONE

    4.4) Process the next buffer in queue, go to step 4.2. 

    4.5) when all buffers are processed, goto step 2. 

V4l2驱动程序类似于vivi驱动程序,可以在以下路径中找到: https://elixir.bootlin.com/linux/v3.17/source/drivers/media/platform/vivi.c#L875

查询:

1)我想知道为什么有时v4l2框架没有调用buffer_prepare和buffer_queue吗?

2)在执行上述过程时,我是否错过了缓冲区管理方面的工作?

预先感谢

此致

库尔卡尼。

0 个答案:

没有答案