[libcamera-devel] [PATCH 3/9] libcamera: pipeline: Support external buffers
Niklas Söderlund
niklas.soderlund at ragnatech.se
Sat Jul 6 13:45:52 CEST 2019
Hi Jacopo,
Thanks for your patch.
On 2019-07-05 00:53:28 +0200, Jacopo Mondi wrote:
> Add support for use external buffers to libcamera pipeline handlers.
>
> Use the memory type flag in pipeline handlers (todo: change all pipeline
> handlers) during buffer setup operations, to decide if the Stream's
> internal memory has to be exported to applications, or the Stream
> should prepare to use buffers whose memory is allocated elsewhere.
I think you can drop the TODO now as it seems all pipeline handlers are
now supprted, right?
>
> To support the last use case, a translation mechanism between the external
> buffers provided by applications and internal ones used by pipeline
> handlers to feed the video device will be implemented on top of this
> change.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/libcamera/pipeline/ipu3/ipu3.cpp | 31 +++++++++++++++++++++++-
> src/libcamera/pipeline/rkisp1/rkisp1.cpp | 9 ++++++-
> src/libcamera/pipeline/uvcvideo.cpp | 8 +++++-
> src/libcamera/pipeline/vimc.cpp | 8 +++++-
> 4 files changed, 52 insertions(+), 4 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 2de0892138a8..6f14da1f8c70 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -71,6 +71,7 @@ public:
>
> int importBuffers(BufferPool *pool);
> int exportBuffers(ImgUOutput *output, BufferPool *pool);
> + int reserveDmabufBuffers(ImgUOutput *output, BufferPool *pool);
> void freeBuffers();
>
> int start();
> @@ -624,7 +625,11 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
> IPU3Stream *stream = static_cast<IPU3Stream *>(s);
> ImgUDevice::ImgUOutput *dev = stream->device_;
>
> - ret = imgu->exportBuffers(dev, &stream->bufferPool());
> + if (stream->memoryType() == ExternalMemory)
> + ret = imgu->reserveDmabufBuffers(dev,
> + &stream->bufferPool());
I would s/reserveDmabufBuffers/importBuffers/ to match the logic in
other pipeline handlers.
> + else
> + ret = imgu->exportBuffers(dev, &stream->bufferPool());
> if (ret)
> goto error;
> }
> @@ -1153,6 +1158,30 @@ int ImgUDevice::exportBuffers(ImgUOutput *output, BufferPool *pool)
> return 0;
> }
>
> +/**
> + * \brief Reserve buffers in \a output from the provided \a pool
> + * \param[in] output The ImgU output device
> + * \param[in] pool The buffer pool used to reserve buffers in \a output
> + *
> + * Reserve a number of buffers equal to the number of buffers in \a pool
> + * in the \a output device to prepare for streaming operations using buffers
> + * whose memory has been reserved elsewhere identified with DMABUF file
> + * descriptors.
> + *
> + * \return 0 on success or a negative error code otherwise
> + */
> +int ImgUDevice::reserveDmabufBuffers(ImgUOutput *output, BufferPool *pool)
> +{
> + int ret = output->dev->importBuffers(pool);
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to import buffer in "
> + << output->name << " ImgU device";
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> /**
> * \brief Release buffers for all the ImgU video devices
> */
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 4a5898d25f91..dbb61a21354d 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -319,7 +319,14 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera,
> const std::set<Stream *> &streams)
> {
> Stream *stream = *streams.begin();
> - return video_->exportBuffers(&stream->bufferPool());
> + int ret;
> +
> + if (stream->memoryType() == InternalMemory)
> + ret = video_->exportBuffers(&stream->bufferPool());
> + else
> + ret = video_->importBuffers(&stream->bufferPool());
> +
> + return ret;
> }
>
> int PipelineHandlerRkISP1::freeBuffers(Camera *camera,
> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
> index 72313cfd246f..5b3c79dda6dd 100644
> --- a/src/libcamera/pipeline/uvcvideo.cpp
> +++ b/src/libcamera/pipeline/uvcvideo.cpp
> @@ -197,10 +197,16 @@ int PipelineHandlerUVC::allocateBuffers(Camera *camera,
> UVCCameraData *data = cameraData(camera);
> Stream *stream = *streams.begin();
> const StreamConfiguration &cfg = stream->configuration();
> + int ret;
>
> LOG(UVC, Debug) << "Requesting " << cfg.bufferCount << " buffers";
>
> - return data->video_->exportBuffers(&stream->bufferPool());
> + if (stream->memoryType() == InternalMemory)
> + ret = data->video_->exportBuffers(&stream->bufferPool());
> + else
> + ret = data->video_->importBuffers(&stream->bufferPool());
> +
> + return ret;
> }
>
> int PipelineHandlerUVC::freeBuffers(Camera *camera,
> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> index f8a58be060bb..c67bdb0ecbff 100644
> --- a/src/libcamera/pipeline/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc.cpp
> @@ -199,10 +199,16 @@ int PipelineHandlerVimc::allocateBuffers(Camera *camera,
> VimcCameraData *data = cameraData(camera);
> Stream *stream = *streams.begin();
> const StreamConfiguration &cfg = stream->configuration();
> + int ret;
>
> LOG(VIMC, Debug) << "Requesting " << cfg.bufferCount << " buffers";
>
> - return data->video_->exportBuffers(&stream->bufferPool());
> + if (stream->memoryType() == InternalMemory)
> + ret = data->video_->exportBuffers(&stream->bufferPool());
> + else
> + ret = data->video_->importBuffers(&stream->bufferPool());
> +
> + return ret;
> }
>
> int PipelineHandlerVimc::freeBuffers(Camera *camera,
> --
> 2.21.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list