diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libcamera/camera.cpp | 65 | ||||
-rw-r--r-- | src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 | ||||
-rw-r--r-- | src/libcamera/pipeline_handler.cpp | 45 |
3 files changed, 79 insertions, 33 deletions
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index d9f6b784..4080da15 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -333,12 +333,24 @@ std::size_t CameraConfiguration::size() const */ /** + * \class Camera::Private + * \brief Base class for camera private data + * + * The Camera::Private class stores all private data associated with a camera. + * In addition to hiding core Camera data from the public API, it is expected to + * be subclassed by pipeline handlers to store pipeline-specific data. + * + * Pipeline handlers can obtain the Camera::Private instance associated with a + * camera by calling Camera::_d(). + */ + +/** * \brief Construct a Camera::Private instance * \param[in] pipe The pipeline handler responsible for the camera device */ Camera::Private::Private(PipelineHandler *pipe) - : pipe_(pipe->shared_from_this()), disconnected_(false), - state_(CameraAvailable) + : requestSequence_(0), pipe_(pipe->shared_from_this()), + disconnected_(false), state_(CameraAvailable) { } @@ -348,6 +360,55 @@ Camera::Private::~Private() LOG(Camera, Error) << "Removing camera while still in use"; } +/** + * \fn Camera::Private::pipe() + * \brief Retrieve the pipeline handler related to this camera + * \return The pipeline handler that created this camera + */ + +/** + * \var Camera::Private::queuedRequests_ + * \brief The list of queued and not yet completed request + * + * The list of queued request is used to track requests queued in order to + * ensure completion of all requests when the pipeline handler is stopped. + * + * \sa PipelineHandler::queueRequest(), PipelineHandler::stop(), + * PipelineHandler::completeRequest() + */ + +/** + * \var Camera::Private::controlInfo_ + * \brief The set of controls supported by the camera + * + * The control information shall be initialised by the pipeline handler when + * creating the camera. + * + * \todo This member was initially meant to stay constant after the camera is + * created. Several pipeline handlers are already updating it when the camera + * is configured. Update the documentation accordingly, and possibly the API as + * well, when implementing official support for control info updates. + */ + +/** + * \var Camera::Private::properties_ + * \brief The list of properties supported by the camera + * + * The list of camera properties shall be initialised by the pipeline handler + * when creating the camera, and shall not be modified afterwards. + */ + +/** + * \var Camera::Private::requestSequence_ + * \brief The queuing sequence of the request + * + * When requests are queued, they are given a per-camera sequence number to + * facilitate debugging of internal request usage. + * + * The requestSequence_ tracks the number of requests queued to a camera + * over its lifetime. + */ + static const char *const camera_state_names[] = { "Available", "Acquired", diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 74c55620..39e5e010 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -847,7 +847,7 @@ void PipelineHandlerRkISP1::stop(Camera *camera) LOG(RkISP1, Warning) << "Failed to stop parameters for " << camera->id(); - ASSERT(data->queuedRequests_.empty()); + ASSERT(camera->_d()->queuedRequests_.empty()); data->frameInfo_.clear(); freeBuffers(camera); diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 1ab237c8..0e571d89 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -16,6 +16,7 @@ #include <libcamera/camera_manager.h> #include <libcamera/framebuffer.h> +#include "libcamera/internal/camera.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/media_device.h" #include "libcamera/internal/tracepoints.h" @@ -72,17 +73,6 @@ LOG_DEFINE_CATEGORY(Pipeline) */ /** - * \var CameraData::queuedRequests_ - * \brief The list of queued and not yet completed request - * - * The list of queued request is used to track requests queued in order to - * ensure completion of all requests when the pipeline handler is stopped. - * - * \sa PipelineHandler::queueRequest(), PipelineHandler::stop(), - * PipelineHandler::completeRequest() - */ - -/** * \var CameraData::controlInfo_ * \brief The set of controls supported by the camera * @@ -99,17 +89,6 @@ LOG_DEFINE_CATEGORY(Pipeline) */ /** - * \var CameraData::requestSequence_ - * \brief The queuing sequence of the request - * - * When requests are queued, they are given a per-camera sequence number to - * facilitate debugging of internal request usage. - * - * The requestSequence_ tracks the number of requests queued to a camera - * over its lifetime. - */ - -/** * \class PipelineHandler * \brief Create and manage cameras based on a set of media devices * @@ -254,8 +233,7 @@ void PipelineHandler::unlock() */ const ControlInfoMap &PipelineHandler::controls(const Camera *camera) const { - const CameraData *data = cameraData(camera); - return data->controlInfo_; + return camera->_d()->controlInfo_; } /** @@ -265,8 +243,7 @@ const ControlInfoMap &PipelineHandler::controls(const Camera *camera) const */ const ControlList &PipelineHandler::properties(const Camera *camera) const { - const CameraData *data = cameraData(camera); - return data->properties_; + return camera->_d()->properties_; } /** @@ -380,8 +357,7 @@ const ControlList &PipelineHandler::properties(const Camera *camera) const */ bool PipelineHandler::hasPendingRequests(const Camera *camera) const { - const CameraData *data = cameraData(camera); - return !data->queuedRequests_.empty(); + return !camera->_d()->queuedRequests_.empty(); } /** @@ -406,7 +382,7 @@ void PipelineHandler::queueRequest(Request *request) LIBCAMERA_TRACEPOINT(request_queue, request); Camera *camera = request->camera_; - CameraData *data = cameraData(camera); + Camera::Private *data = camera->_d(); data->queuedRequests_.push_back(request); request->sequence_ = data->requestSequence_++; @@ -479,7 +455,7 @@ void PipelineHandler::completeRequest(Request *request) request->complete(); - CameraData *data = cameraData(camera); + Camera::Private *data = camera->_d(); while (!data->queuedRequests_.empty()) { Request *req = data->queuedRequests_.front(); @@ -507,6 +483,15 @@ void PipelineHandler::completeRequest(Request *request) void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera, std::unique_ptr<CameraData> data) { + /* + * To be removed once all pipeline handlers will have migrated from + * CameraData to Camera::Private. + */ + if (data) { + camera->_d()->controlInfo_ = std::move(data->controlInfo_); + camera->_d()->properties_ = std::move(data->properties_); + } + cameraData_[camera.get()] = std::move(data); cameras_.push_back(camera); |