summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2020-07-13 10:46:26 +0100
committerBarnabás Pőcze <barnabas.pocze@ideasonboard.com>2025-05-05 09:44:19 +0200
commit549fa632e994df06193db55129035ac29f82bc5f (patch)
treee8d0fdc340629e2d9b874b87e770e0875e1952d2
parent9d8aeb81b89c827d39d38764aaaf2ca3a42b5709 (diff)
libcamera: pipeline: vivid: Buffer handling and stream control
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@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/vivid/vivid.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/libcamera/pipeline/vivid/vivid.cpp b/src/libcamera/pipeline/vivid/vivid.cpp
index 5bc114a2..a9787893 100644
--- a/src/libcamera/pipeline/vivid/vivid.cpp
+++ b/src/libcamera/pipeline/vivid/vivid.cpp
@@ -41,6 +41,7 @@ public:
}
int init();
+ void bufferReady(FrameBuffer *buffer);
MediaDevice *media_;
std::unique_ptr<V4L2VideoDevice> video_;
@@ -181,16 +182,35 @@ 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, const ControlList *controls)
{
- 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->video_->releaseBuffers();
+ return ret;
+ }
+
+ return 0;
}
void PipelineHandlerVivid::stopDevice(Camera *camera)
{
+ VividCameraData *data = cameraData(camera);
+ data->video_->streamOff();
+ data->video_->releaseBuffers();
}
int PipelineHandlerVivid::queueRequestDevice(Camera *camera, Request *request)
@@ -228,9 +248,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(request, buffer);
+ pipe()->completeRequest(request);
+}
+
REGISTER_PIPELINE_HANDLER(PipelineHandlerVivid, "vivid")
} /* namespace libcamera */