[libcamera-devel] [PATCH 05/10] libcamera: ipu3: Implement buffer allocation
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Mar 2 23:51:01 CET 2019
Hi Jacopo,
Thank you for the patch.
On Thu, Feb 28, 2019 at 09:04:05PM +0100, Jacopo Mondi wrote:
> Implement buffer allocation in IPU3 pipeline handlers.
> As the pipeline handler supports a single stream, preprare two buffer
> pools for 'viewfinder' and 'stat' video devices, and export the 'output'
> video device buffers to the Stream's pool.
>
> Share buffers between the CIO2 output and the ImgU input video devices,
> as the output of the former should immediately be provided to the
> latter for further processing.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/libcamera/pipeline/ipu3/ipu3.cpp | 47 ++++++++++++++++++++++++----
> 1 file changed, 41 insertions(+), 6 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 1e89e57f628b..c7b7973952a0 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -47,6 +47,9 @@ struct ImguDevice {
> V4L2Device *viewfinder;
> V4L2Device *stat;
> /* TODO: add param video device for 3A tuning */
> +
> + BufferPool vfPool;
> + BufferPool statPool;
> };
>
> struct Cio2Device {
> @@ -63,6 +66,8 @@ struct Cio2Device {
> V4L2Device *output;
> V4L2Subdevice *csi2;
> V4L2Subdevice *sensor;
> +
> + BufferPool pool;
> };
>
> class IPU3CameraData : public CameraData
> @@ -319,18 +324,48 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera, Stream *stream)
> {
> const StreamConfiguration &cfg = stream->configuration();
> IPU3CameraData *data = cameraData(camera);
> + V4L2Device *viewfinder = data->imgu->viewfinder;
> + V4L2Device *output = data->imgu->output;
> + V4L2Device *input = data->imgu->input;
> V4L2Device *cio2 = data->cio2.output;
> + V4L2Device *stat = data->imgu->stat;
> + int ret;
>
> - if (!cfg.bufferCount)
> + if (!cfg.bufferCount) {
> + LOG(IPU3, Error)
> + << "Invalid number of buffers: "<< cfg.bufferCount;
> return -EINVAL;
Can this happen ? Shouldn't it be caught in upper layers ?
> -
> - int ret = cio2->exportBuffers(&stream->bufferPool());
> - if (ret) {
> - LOG(IPU3, Error) << "Failed to request memory";
> - return ret;
> }
>
> + /* Share buffers between CIO2 output and ImgU input. */
> + data->cio2.pool.createBuffers(IPU3_BUF_NUM);
The number of buffers doesn't have to match between the internal pool
and the external pool. I would define a separate constant for this, even
if their values happen to be the same for now.
> + ret = cio2->exportBuffers(&data->cio2.pool);
> + if (ret)
> + goto error_reserve_memory;
> + input->importBuffers(&data->cio2.pool);
Can't this fail ?
> +
> + /* Prepare the buffer pools for viewfinder and stat. */
> + data->imgu->vfPool.createBuffers(IPU3_BUF_NUM);
> + ret = viewfinder->exportBuffers(&data->imgu->vfPool);
> + if (ret)
> + goto error_reserve_memory;
> +
> + data->imgu->statPool.createBuffers(IPU3_BUF_NUM);
> + ret = stat->exportBuffers(&data->imgu->statPool);
> + if (ret)
> + goto error_reserve_memory;
> +
> + /* Export ImgU output buffers to the stream's pool. */
> + ret = output->exportBuffers(&stream->bufferPool());
> + if (ret)
> + goto error_reserve_memory;
> +
> return 0;
> +
> +error_reserve_memory:
> + LOG(IPU3, Error) << "Failed to reserve memory";
I'd duplicate the error message instead of using a goto, in order to
print which memory allocation failed.
As we won't queue buffers for the viewfinder and stats video node (at
least for now), do we even need to allocate them ?
> +
> + return ret;
> }
>
> int PipelineHandlerIPU3::freeBuffers(Camera *camera, Stream *stream)
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list