summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 40d723e9..f3f0a626 100644
--- a/src/libcamera/pipeline/vivid/vivid.cpp
+++ b/src/libcamera/pipeline/vivid/vivid.cpp
@@ -47,6 +47,7 @@ public:
}
int init();
+ void bufferReady(FrameBuffer *buffer);
MediaDevice *media_;
V4L2VideoDevice *video_;
@@ -189,16 +190,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)
@@ -236,9 +256,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)
} /* namespace libcamera */