diff options
author | Jacopo Mondi <jacopo@jmondi.org> | 2019-02-04 16:33:01 +0100 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-02-06 07:41:51 +0200 |
commit | 5aef8257643bc2c70adaa59cc8ef0f2780595cbc (patch) | |
tree | 7c622f850453552a274ee3b49d93bf768674782a /src | |
parent | 1d7b6297f2ff01c71ebc44788d25545caa6e84e3 (diff) |
libcamera: Provide a Request object
Implement a Request object used by applications to queue image capture
requests to a camera.
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>
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src')
-rw-r--r-- | src/libcamera/camera.cpp | 5 | ||||
-rw-r--r-- | src/libcamera/meson.build | 1 | ||||
-rw-r--r-- | src/libcamera/request.cpp | 122 |
3 files changed, 128 insertions, 0 deletions
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index bcf3d54a..e8dab6f0 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -98,6 +98,11 @@ const std::string &Camera::name() const } /** + * \var Camera::requestCompleted + * \brief Signal emitted when a request queued to the camera has completed + */ + +/** * \var Camera::disconnected * \brief Signal emitted when the camera is disconnected from the system * diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build index ac991dc5..c5354c13 100644 --- a/src/libcamera/meson.build +++ b/src/libcamera/meson.build @@ -11,6 +11,7 @@ libcamera_sources = files([ 'media_device.cpp', 'media_object.cpp', 'pipeline_handler.cpp', + 'request.cpp', 'signal.cpp', 'stream.cpp', 'timer.cpp', diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp new file mode 100644 index 00000000..922682a3 --- /dev/null +++ b/src/libcamera/request.cpp @@ -0,0 +1,122 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * request.cpp - Capture request handling + */ + +#include <map> + +#include <libcamera/buffer.h> +#include <libcamera/camera.h> +#include <libcamera/request.h> +#include <libcamera/stream.h> + +#include "log.h" + +/** + * \file request.h + * \brief Describes a frame capture request to be processed by a camera + */ + +namespace libcamera { + +LOG_DEFINE_CATEGORY(Request) + +/** + * \class Request + * \brief A frame capture request + * + * A Request allows an application to associate buffers and controls on a + * per-frame basis to be queued to the camera device for processing. + */ + +/** + * \brief Create a capture request for a camera + * \param[in] camera The camera that creates the request + */ +Request::Request(Camera *camera) + : camera_(camera) +{ +} + +/** + * \brief Set the streams to capture with associated buffers + * \param[in] streamMap The map of streams to buffers + * \return 0 on success or a negative error code otherwise + * \retval -EBUSY Buffers have already been set + */ +int Request::setBuffers(const std::map<Stream *, Buffer *> &streamMap) +{ + if (!bufferMap_.empty()) { + LOG(Request, Error) << "Buffers already set"; + return -EBUSY; + } + + bufferMap_ = streamMap; + return 0; +} + +/** + * \var Request::bufferMap_ + * \brief Mapping of streams to buffers for this request + * + * The bufferMap_ tracks the buffers associated with each stream. If a stream is + * not utilised in this request there will be no buffer for that stream in the + * map. + */ + +/** + * \brief Return the buffer associated with a stream + * \param[in] stream The stream the buffer is associated to + * + * \return The buffer associated with the stream, or nullptr if the stream is + * not part of this request + */ +Buffer *Request::findBuffer(Stream *stream) const +{ + auto it = bufferMap_.find(stream); + if (it == bufferMap_.end()) + return nullptr; + + return it->second; +} + +/** + * \brief Prepare the resources for the completion handler + */ +int Request::prepare() +{ + for (auto const &pair : bufferMap_) { + Buffer *buffer = pair.second; + buffer->completed.connect(this, &Request::bufferCompleted); + pending_.insert(buffer); + } + + return 0; +} + +/** + * \brief Slot for the buffer completed signal + * + * The bufferCompleted method serves as slot where to connect the + * Buffer::completed signal that is emitted when a buffer has available + * data. + * + * The request completes when all the buffers it contains are ready to be + * presented to the application. + */ +void Request::bufferCompleted(Buffer *buffer) +{ + buffer->completed.disconnect(this, &Request::bufferCompleted); + + int ret = pending_.erase(buffer); + ASSERT(ret == 1); + + if (pending_.empty()) { + std::map<Stream *, Buffer *> buffers(std::move(bufferMap_)); + camera_->requestCompleted.emit(this, buffers); + } +} + +} /* namespace libcamera */ |