summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2019-02-05 15:41:50 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-02-06 08:03:03 +0200
commit17ae772e8d34a5eb1ef4762a84e8ba5b1fe89874 (patch)
tree5d5c2aebb164191ef60c82bc906a3e3ae9293329
parentbd38112b7795b79c7056cfe6e9d713e80ee74586 (diff)
libcamera: pipeline: uvcvideo: Implement capture support
Replace the buffer allocation, capture start/stop and request queue stubs with real implementations. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/uvcvideo.cpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index 74bdf5c5..fc31c52c 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -6,6 +6,7 @@
*/
#include <libcamera/camera.h>
+#include <libcamera/request.h>
#include <libcamera/stream.h>
#include "device_enumerator.h"
@@ -84,35 +85,53 @@ int PipelineHandlerUVC::configureStreams(Camera *camera,
{
StreamConfiguration *cfg = &config[&stream_];
- LOG(UVC, Info) << "TODO: Configure the camera for resolution "
- << cfg->width << "x" << cfg->height;
+ LOG(UVC, Debug) << "Configure the camera for resolution "
+ << cfg->width << "x" << cfg->height;
- return 0;
+ V4L2DeviceFormat format = {};
+ format.width = cfg->width;
+ format.height = cfg->height;
+ format.fourcc = cfg->pixelFormat;
+
+ return video_->setFormat(&format);
}
int PipelineHandlerUVC::allocateBuffers(Camera *camera, Stream *stream)
{
- return -ENOTRECOVERABLE;
+ const StreamConfiguration &cfg = stream->configuration();
+
+ LOG(UVC, Debug) << "Requesting " << cfg.bufferCount << " buffers";
+
+ return video_->exportBuffers(cfg.bufferCount, &stream->bufferPool());
}
int PipelineHandlerUVC::freeBuffers(Camera *camera, Stream *stream)
{
- return 0;
+ return video_->releaseBuffers();
}
int PipelineHandlerUVC::start(const Camera *camera)
{
- LOG(UVC, Error) << "TODO: start camera";
- return 0;
+ return video_->streamOn();
}
void PipelineHandlerUVC::stop(const Camera *camera)
{
- LOG(UVC, Error) << "TODO: stop camera";
+ video_->streamOff();
}
int PipelineHandlerUVC::queueRequest(const Camera *camera, Request *request)
{
+ Buffer *buffer = request->findBuffer(&stream_);
+ if (!buffer) {
+ LOG(UVC, Error)
+ << "Attempt to queue request with invalid stream";
+
+ return -ENOENT;
+ }
+
+ video_->queueBuffer(buffer);
+
return 0;
}