libcamera: pipeline: vimc: Implement capture support

Replace the buffer allocation, capture start/stop and request queue
stubs with real implementations.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund 2019-02-05 19:10:56 +01:00 committed by Laurent Pinchart
parent bbbf76a6c5
commit 8cbe8fe650

View file

@ -6,6 +6,7 @@
*/ */
#include <libcamera/camera.h> #include <libcamera/camera.h>
#include <libcamera/request.h>
#include <libcamera/stream.h> #include <libcamera/stream.h>
#include "device_enumerator.h" #include "device_enumerator.h"
@ -83,35 +84,53 @@ int PipeHandlerVimc::configureStreams(Camera *camera,
{ {
StreamConfiguration *cfg = &config[&stream_]; StreamConfiguration *cfg = &config[&stream_];
LOG(VIMC, Info) << "TODO: Configure the camera for resolution " LOG(VIMC, Debug) << "Configure the camera for resolution "
<< cfg->width << "x" << cfg->height; << 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 PipeHandlerVimc::allocateBuffers(Camera *camera, Stream *stream) int PipeHandlerVimc::allocateBuffers(Camera *camera, Stream *stream)
{ {
return -ENOTRECOVERABLE; const StreamConfiguration &cfg = stream->configuration();
LOG(VIMC, Debug) << "Requesting " << cfg.bufferCount << " buffers";
return video_->exportBuffers(cfg.bufferCount, &stream->bufferPool());
} }
int PipeHandlerVimc::freeBuffers(Camera *camera, Stream *stream) int PipeHandlerVimc::freeBuffers(Camera *camera, Stream *stream)
{ {
return 0; return video_->releaseBuffers();
} }
int PipeHandlerVimc::start(const Camera *camera) int PipeHandlerVimc::start(const Camera *camera)
{ {
LOG(VIMC, Error) << "TODO: start camera"; return video_->streamOn();
return 0;
} }
void PipeHandlerVimc::stop(const Camera *camera) void PipeHandlerVimc::stop(const Camera *camera)
{ {
LOG(VIMC, Error) << "TODO: stop camera"; video_->streamOff();
} }
int PipeHandlerVimc::queueRequest(const Camera *camera, Request *request) int PipeHandlerVimc::queueRequest(const Camera *camera, Request *request)
{ {
Buffer *buffer = request->findBuffer(&stream_);
if (!buffer) {
LOG(VIMC, Error)
<< "Attempt to queue request with invalid stream";
return -ENOENT;
}
video_->queueBuffer(buffer);
return 0; return 0;
} }