[libcamera-devel] [PATCH 6/9] libcamera: pipeline: vivid: Buffer handling and stream control
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Jul 14 16:48:09 CEST 2020
Hi Kieran,
On 13/07/2020 14:24, Kieran Bingham wrote:
> We can now add buffer management, and connect up our bufferReady signal
> to a callback.
>
> Note that we provide the ability to export buffers from our capture
> device (data->video_) using the exportBuffers() functionality from the
> V4L2VideoDevice which allows a FrameBufferAllocater to obtain buffers
> from this device.
>
> When buffers are obtained through the exportFrameBuffers API, they are
> orphaned and left unassociated with the device, and must be reimported
> at start() time anyway. This allows the same interface to be used
> whether internal buffers, or external buffers are used for the stream.
>
> When a buffer completes, we call the buffer completion handler on the
> pipeline handler, and because we have only a single stream, we can also
> immediately complete the request.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> src/libcamera/pipeline/vivid/vivid.cpp | 35 ++++++++++++++++++++++++--
> 1 file changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/src/libcamera/pipeline/vivid/vivid.cpp b/src/libcamera/pipeline/vivid/vivid.cpp
> index dbc19424e75a..1a945a744055 100644
> --- a/src/libcamera/pipeline/vivid/vivid.cpp
> +++ b/src/libcamera/pipeline/vivid/vivid.cpp
> @@ -32,6 +32,7 @@ public:
> }
>
> int init();
> + void bufferReady(FrameBuffer *buffer);
>
> MediaDevice *media_;
> V4L2VideoDevice *video_;
> @@ -175,16 +176,36 @@ int PipelineHandlerVivid::configure(Camera *camera, CameraConfiguration *config)
> int PipelineHandlerVivid::exportFrameBuffers(Camera *camera, Stream *stream,
> std::vector<std::unique_ptr<FrameBuffer>> *buffers)
> {
> - return -1;
> + VividCameraData *data = cameraData(camera);
> + unsigned int count = stream->configuration().bufferCount;
> +
> + return data->video_->exportBuffers(count, buffers);
> }
>
> int PipelineHandlerVivid::start(Camera *camera)
> {
> - return -1;
> + VividCameraData *data = cameraData(camera);
> + unsigned int count = data->stream_.configuration().bufferCount;
> +
> + int ret = data->video_->importBuffers(count);
> + if (ret < 0)
> + return ret;
> +
> + ret = data->video_->streamOn();
> + if (ret < 0) {
> + data->ipa_->stop();
As we don't have an IPA for this pipeline handler, we shouldn't stop the
IPA here ;-)
> + data->video_->releaseBuffers();
> + return ret;
> + }
> +
> + return 0;
> }
>
> void PipelineHandlerVivid::stop(Camera *camera)
> {
> + VividCameraData *data = cameraData(camera);
> + data->video_->streamOff();
> + data->video_->releaseBuffers();
> }
>
> int PipelineHandlerVivid::queueRequestDevice(Camera *camera, Request *request)
> @@ -221,9 +242,19 @@ int VividCameraData::init()
> if (video_->open())
> return -ENODEV;
>
> + video_->bufferReady.connect(this, &VividCameraData::bufferReady);
> +
> return 0;
> }
>
> +void VividCameraData::bufferReady(FrameBuffer *buffer)
> +{
> + Request *request = buffer->request();
> +
> + pipe_->completeBuffer(camera_, request, buffer);
> + pipe_->completeRequest(camera_, request);
> +}
> +
> REGISTER_PIPELINE_HANDLER(PipelineHandlerVivid);
>
> } /* namespace libcamera */
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list