From patchwork Thu Aug 5 17:58:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13219 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 7034CC3237 for ; Thu, 5 Aug 2021 17:59:09 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D251068886; Thu, 5 Aug 2021 19:59:06 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="KCsFYMXr"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 579B3687CF for ; Thu, 5 Aug 2021 19:59:05 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F072FF95 for ; Thu, 5 Aug 2021 19:59:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186345; bh=av+M2wIUNafKLZGtBRQnfhfSsifibU1gbXmn1PZJotI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=KCsFYMXrSPhjRmuBGHQNDMiCKxZun9BIvpJ9dsCCppa9q/9ffvJcl61HCOLKd4p6J MZMRnm7SSXZZrW7k3VRNfqvR1CwF8eKkBjUD3BXVbEb/dVe8mn9k6nbWN3wJPM0u0O h+/HMXlgBXES3knB7Zrqn/cwb8dTIXYoFdnobUKg= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:38 +0300 Message-Id: <20210805175848.24188-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 01/11] libcamera: camera: Pass Private pointer to Camera constructor X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" In order to allow subclassing Camera::Private in pipeline handlers, pass the pointer to the private data to the Camera constructor, and to the Camera::createCamera() function. The Camera::Private id_ and streams_ members now need to be initialized by the Camera constructor instead of the Camera::Private constructor, to allow storage of the streams in a pipeline handler-specific subclass of Camera::Private. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- include/libcamera/camera.h | 5 ++-- include/libcamera/internal/camera.h | 3 +-- src/libcamera/camera.cpp | 26 ++++++++++++------- src/libcamera/pipeline/ipu3/ipu3.cpp | 4 ++- .../pipeline/raspberrypi/raspberrypi.cpp | 4 ++- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 ++- src/libcamera/pipeline/simple/simple.cpp | 4 ++- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 4 ++- src/libcamera/pipeline/vimc/vimc.cpp | 4 ++- 9 files changed, 37 insertions(+), 21 deletions(-) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index b081907e0cb1..17ddddc2722a 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -78,8 +78,7 @@ class Camera final : public Object, public std::enable_shared_from_this, LIBCAMERA_DECLARE_PRIVATE() public: - static std::shared_ptr create(PipelineHandler *pipe, - const std::string &id, + static std::shared_ptr create(Private *d, const std::string &id, const std::set &streams); const std::string &id() const; @@ -107,7 +106,7 @@ public: private: LIBCAMERA_DISABLE_COPY(Camera) - Camera(PipelineHandler *pipe, const std::string &id, + Camera(Private *d, const std::string &id, const std::set &streams); ~Camera(); diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index b60ed140356a..9ec8321a9a21 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -26,8 +26,7 @@ class Camera::Private : public Extensible::Private LIBCAMERA_DECLARE_PUBLIC(Camera) public: - Private(PipelineHandler *pipe, const std::string &id, - const std::set &streams); + Private(PipelineHandler *pipe); ~Private(); private: diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 4b5bc891fc37..a5bb60c698bc 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -332,11 +332,13 @@ std::size_t CameraConfiguration::size() const * \brief The vector of stream configurations */ -Camera::Private::Private(PipelineHandler *pipe, - const std::string &id, - const std::set &streams) - : pipe_(pipe->shared_from_this()), id_(id), streams_(streams), - disconnected_(false), state_(CameraAvailable) +/** + * \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) { } @@ -513,7 +515,7 @@ void Camera::Private::setState(State state) /** * \brief Create a camera instance - * \param[in] pipe The pipeline handler responsible for the camera device + * \param[in] d Camera private data * \param[in] id The ID of the camera device * \param[in] streams Array of streams the camera provides * @@ -527,10 +529,12 @@ void Camera::Private::setState(State state) * * \return A shared pointer to the newly created camera object */ -std::shared_ptr Camera::create(PipelineHandler *pipe, +std::shared_ptr Camera::create(Private *d, const std::string &id, const std::set &streams) { + ASSERT(d); + struct Deleter : std::default_delete { void operator()(Camera *camera) { @@ -541,7 +545,7 @@ std::shared_ptr Camera::create(PipelineHandler *pipe, } }; - Camera *camera = new Camera(pipe, id, streams); + Camera *camera = new Camera(d, id, streams); return std::shared_ptr(camera, Deleter()); } @@ -594,10 +598,12 @@ const std::string &Camera::id() const * application API calls by returning errors immediately. */ -Camera::Camera(PipelineHandler *pipe, const std::string &id, +Camera::Camera(Private *d, const std::string &id, const std::set &streams) - : Extensible(new Private(pipe, id, streams)) + : Extensible(d) { + d->id_ = id; + d->streams_ = streams; } Camera::~Camera() diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 76c3bb3d8aa9..15d6cca609ff 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -23,6 +23,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" @@ -1185,7 +1186,8 @@ int PipelineHandlerIPU3::registerCameras() /* Create and register the Camera instance. */ std::string cameraId = cio2->sensor()->id(); std::shared_ptr camera = - Camera::create(this, cameraId, streams); + Camera::create(new Camera::Private(this), cameraId, + streams); registerCamera(std::move(camera), std::move(data)); diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 0bab3bedd402..33cd5765b52e 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -30,6 +30,7 @@ #include #include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" @@ -1106,7 +1107,8 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) /* Create and register the camera. */ std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), data->sensor_->id(), + streams); registerCamera(std::move(camera), std::move(data)); return true; diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 42911a8fdfdb..4a8ac97d5ef0 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -27,6 +27,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/device_enumerator.h" @@ -970,7 +971,8 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) &data->selfPathStream_, }; std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), data->sensor_->id(), + streams); registerCamera(std::move(camera), std::move(data)); return 0; diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index b29fff9820e5..43af3fafa475 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -28,6 +28,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/media_device.h" @@ -1046,7 +1047,8 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) [](Stream &stream) { return &stream; }); std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), + data->sensor_->id(), streams); registerCamera(std::move(camera), std::move(data)); registered = true; } diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 0f634b8da609..63cb1daaae22 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -22,6 +22,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/media_device.h" #include "libcamera/internal/pipeline_handler.h" @@ -470,7 +471,8 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) } std::set streams{ &data->stream_ }; - std::shared_ptr camera = Camera::create(this, id, streams); + std::shared_ptr camera = + Camera::create(new Camera::Private(this), id, streams); registerCamera(std::move(camera), std::move(data)); /* Enable hot-unplug notifications. */ diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 12f7517fd0ae..d63562b1ee54 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -29,6 +29,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/ipa_manager.h" @@ -438,7 +439,8 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) /* Create and register the camera. */ std::set streams{ &data->stream_ }; std::shared_ptr camera = - Camera::create(this, data->sensor_->id(), streams); + Camera::create(new Camera::Private(this), data->sensor_->id(), + streams); registerCamera(std::move(camera), std::move(data)); return true; From patchwork Thu Aug 5 17:58:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13220 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 41896C3238 for ; Thu, 5 Aug 2021 17:59:10 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id BB3E968811; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Ldxio0Qf"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9D685687CF for ; Thu, 5 Aug 2021 19:59:05 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4B6C7E04 for ; Thu, 5 Aug 2021 19:59:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186345; bh=zUBQ5/W2q8BGtClQmr1xyqhD35dsvTxJv062CvnoVxU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Ldxio0QfUTFBSB+JqW0MrpIQMnlCVraWZVRVRSeg9FQADIj34je2t2FpaOrABIiVK VqwTgTa4HHFX4vTVvA1G3XURkAzavNbxhf3wg3umhz+QNRzQU0mEdsNwTkiOpocyJ7 LBIcDaWTYJCX8FoiLlYeD5AjLs9hGiHMdUljpogo= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:39 +0300 Message-Id: <20210805175848.24188-3-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 02/11] libcamera: pipeline_handler: Move CameraData members to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" With pipeline handlers now being able to subclass Camera::Private, start the migration from CameraData to Camera::Private by moving the members of the base CameraData class. The controlInfo_, properties_ and pipe_ members are duplicated for now, to allow migrating pipeline handlers one by one. The Camera::Private class is now properly documented, don't exclude it from documentation generation. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- Changes since v1: - Add \todo comment for controlInfo_ --- Documentation/Doxyfile.in | 1 - include/libcamera/internal/camera.h | 8 +++ include/libcamera/internal/pipeline_handler.h | 5 +- src/libcamera/camera.cpp | 65 ++++++++++++++++++- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 45 +++++-------- 6 files changed, 88 insertions(+), 38 deletions(-) diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in index fb321ad25f6f..e3b77428cd4f 100644 --- a/Documentation/Doxyfile.in +++ b/Documentation/Doxyfile.in @@ -882,7 +882,6 @@ EXCLUDE_SYMBOLS = libcamera::BoundMethodArgs \ libcamera::BoundMethodPack \ libcamera::BoundMethodPackBase \ libcamera::BoundMethodStatic \ - libcamera::Camera::Private \ libcamera::CameraManager::Private \ libcamera::SignalBase \ *::details \ diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index 9ec8321a9a21..44242332a52f 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -29,6 +29,14 @@ public: Private(PipelineHandler *pipe); ~Private(); + PipelineHandler *pipe() { return pipe_.get(); } + + std::list queuedRequests_; + ControlInfoMap controlInfo_; + ControlList properties_; + + uint32_t requestSequence_; + private: enum State { CameraAvailable, diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 9e2d65d6f2c5..86727f90bb65 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -39,18 +39,15 @@ class CameraData { public: explicit CameraData(PipelineHandler *pipe) - : pipe_(pipe), requestSequence_(0) + : pipe_(pipe) { } virtual ~CameraData() = default; PipelineHandler *pipe_; - std::list queuedRequests_; ControlInfoMap controlInfo_; ControlList properties_; - uint32_t requestSequence_; - private: LIBCAMERA_DISABLE_COPY(CameraData) }; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index a5bb60c698bc..f0893f89a1b3 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -332,13 +332,25 @@ std::size_t CameraConfiguration::size() const * \brief The vector of stream configurations */ +/** + * \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 for 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 4a8ac97d5ef0..cc279ce733ef 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 c9928d444b04..1f1de19d81c5 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -16,6 +16,7 @@ #include #include +#include "libcamera/internal/camera.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/media_device.h" #include "libcamera/internal/tracepoints.h" @@ -71,17 +72,6 @@ LOG_DEFINE_CATEGORY(Pipeline) * and remains valid until the instance is destroyed. */ -/** - * \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 @@ -98,17 +88,6 @@ LOG_DEFINE_CATEGORY(Pipeline) * when creating the camera, and shall not be modified afterwards. */ -/** - * \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, std::unique_ptr 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); From patchwork Thu Aug 5 17:58:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13221 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id E73E7C3237 for ; Thu, 5 Aug 2021 17:59:10 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 23BD268823; Thu, 5 Aug 2021 19:59:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="GEY6ASrk"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F3A70687CF for ; Thu, 5 Aug 2021 19:59:05 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9A030F95 for ; Thu, 5 Aug 2021 19:59:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186345; bh=+aXGq3GFx8h1Hd35k/8Hn5d7WNmsQ53jjBd5VUsrVsE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=GEY6ASrkZ//uBiLbcCvA6r4oOr6Gdm5ZxUefALyKLS46pDrpa5DwmjnoliuC9cHYR enG0lH5DwdkIDs739iJkiQUyZ1U4T8JdtX686e6qP+gKR659n1AvqRissI7RXU8OkT Folohwj48BpKUi2AT/HILevoob835HRYGgIW0MmE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:40 +0300 Message-Id: <20210805175848.24188-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 03/11] libcamera: pipeline: simple: Migrate to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Jacopo Mondi --- src/libcamera/pipeline/simple/simple.cpp | 25 ++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 43af3fafa475..81d342a3fa73 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -147,7 +147,7 @@ static const SimplePipelineInfo supportedDevices[] = { } /* namespace */ -class SimpleCameraData : public CameraData +class SimpleCameraData : public Camera::Private { public: SimpleCameraData(SimplePipelineHandler *pipe, @@ -213,7 +213,7 @@ private: * reference to the camera data, store a new reference to the camera. */ std::shared_ptr camera_; - const SimpleCameraData *data_; + SimpleCameraData *data_; const SimpleCameraData::Configuration *pipeConfig_; bool needConversion_; @@ -246,10 +246,9 @@ protected: private: static constexpr unsigned int kNumInternalBuffers = 3; - SimpleCameraData *cameraData(const Camera *camera) + SimpleCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } std::vector locateSensors(); @@ -274,7 +273,7 @@ private: SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe, unsigned int numStreams, MediaEntity *sensor) - : CameraData(pipe), streams_(numStreams) + : Camera::Private(pipe), streams_(numStreams) { int ret; @@ -355,7 +354,8 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe, int SimpleCameraData::init() { - SimplePipelineHandler *pipe = static_cast(pipe_); + SimplePipelineHandler *pipe = + static_cast(this->pipe()); SimpleConverter *converter = pipe->converter(); int ret; @@ -480,7 +480,8 @@ int SimpleCameraData::setupLinks() int SimpleCameraData::setupFormats(V4L2SubdeviceFormat *format, V4L2Subdevice::Whence whence) { - SimplePipelineHandler *pipe = static_cast(pipe_); + SimplePipelineHandler *pipe = + static_cast(this->pipe()); int ret; /* @@ -581,7 +582,7 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate() } /* Adjust the requested streams. */ - SimplePipelineHandler *pipe = static_cast(data_->pipe_); + SimplePipelineHandler *pipe = static_cast(data_->pipe()); SimpleConverter *converter = pipe->converter(); /* @@ -1046,10 +1047,10 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) std::inserter(streams, streams.end()), [](Stream &stream) { return &stream; }); + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), - data->sensor_->id(), streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); registered = true; } From patchwork Thu Aug 5 17:58:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13222 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 56AB2C3239 for ; Thu, 5 Aug 2021 17:59:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DCEC868892; Thu, 5 Aug 2021 19:59:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="AL42oC9i"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4D04368826 for ; Thu, 5 Aug 2021 19:59:06 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E82FAE04 for ; Thu, 5 Aug 2021 19:59:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186346; bh=RQuhlZsWqBvJc84o8B6lEEaLcKgoR72B/+VzgEbPkAU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=AL42oC9i6FMbwW8k+x8iEc7JqUwFdCrkYwmq6FT/ImwY5hHjDQunl8ZCM/Le01LK2 1fapJW6TSp2H2pFgs2uuQs04S2xFFe/dXDa1rN7YsSXfbtjXfQSlbB9t7XfYHUzkEd JN4Xsl/ZMIVWCQE0xmXW2FQEySBR6NRdNNnkEvFo= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:41 +0300 Message-Id: <20210805175848.24188-5-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 04/11] libcamera: pipeline: uvcvideo: Migrate to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 63cb1daaae22..bbeeda97a91a 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -33,11 +33,11 @@ namespace libcamera { LOG_DEFINE_CATEGORY(UVC) -class UVCCameraData : public CameraData +class UVCCameraData : public Camera::Private { public: UVCCameraData(PipelineHandler *pipe) - : CameraData(pipe) + : Camera::Private(pipe) { } @@ -87,10 +87,9 @@ private: const ControlValue &value); int processControls(UVCCameraData *data, Request *request); - UVCCameraData *cameraData(const Camera *camera) + UVCCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } }; @@ -472,8 +471,8 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) std::set streams{ &data->stream_ }; std::shared_ptr camera = - Camera::create(new Camera::Private(this), id, streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); /* Enable hot-unplug notifications. */ hotplugMediaDevice(media); @@ -668,8 +667,8 @@ void UVCCameraData::bufferReady(FrameBuffer *buffer) request->metadata().set(controls::SensorTimestamp, buffer->metadata().timestamp); - pipe_->completeBuffer(request, buffer); - pipe_->completeRequest(request); + pipe()->completeBuffer(request, buffer); + pipe()->completeRequest(request); } REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC) From patchwork Thu Aug 5 17:58:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13223 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id B427AC3238 for ; Thu, 5 Aug 2021 17:59:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 562C668855; Thu, 5 Aug 2021 19:59:11 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="oTgXwhbr"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A00DE68864 for ; Thu, 5 Aug 2021 19:59:06 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4499FF95 for ; Thu, 5 Aug 2021 19:59:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186346; bh=4OPAlj3Xr7KTGXfsUgVFFWWlAJaI8Br09JaBulriIuU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=oTgXwhbrznEWuFr+/FXylMZnuhlskabBJHdH750geJR503glJ7Ut23pmt3yovrEty wO0qXPeFWJm2VAnUYHwT4u0GdqDg67HTVd5kMxYsWpoLxiEUysOF1j67vCay7zAw4R bfBEuRWBKBu8ROKm4QWvhot+sXwFc6RVUOnPWYoY= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:42 +0300 Message-Id: <20210805175848.24188-6-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 05/11] libcamera: pipeline: vimc: Migrate to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/pipeline/vimc/vimc.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index d63562b1ee54..866c993d7e50 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -42,11 +42,11 @@ namespace libcamera { LOG_DEFINE_CATEGORY(VIMC) -class VimcCameraData : public CameraData +class VimcCameraData : public Camera::Private { public: VimcCameraData(PipelineHandler *pipe, MediaDevice *media) - : CameraData(pipe), media_(media) + : Camera::Private(pipe), media_(media) { } @@ -97,10 +97,9 @@ public: private: int processControls(VimcCameraData *data, Request *request); - VimcCameraData *cameraData(const Camera *camera) + VimcCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } }; @@ -438,10 +437,10 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) /* Create and register the camera. */ std::set streams{ &data->stream_ }; + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), data->sensor_->id(), - streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); return true; } @@ -530,8 +529,8 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer) request->metadata().set(controls::SensorTimestamp, buffer->metadata().timestamp); - pipe_->completeBuffer(request, buffer); - pipe_->completeRequest(request); + pipe()->completeBuffer(request, buffer); + pipe()->completeRequest(request); } REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc) From patchwork Thu Aug 5 17:58:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13224 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 2AC5CC323A for ; Thu, 5 Aug 2021 17:59:12 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C30B868886; Thu, 5 Aug 2021 19:59:11 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="U8jR2L3W"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 00F1B687CF for ; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9719DE04 for ; Thu, 5 Aug 2021 19:59:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186346; bh=JduaUuQZMpCSBvlxe5cacneUrpummQo9weC5pQNVztQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=U8jR2L3WEgkd671WzcuQoK4kcI7HVTkvhRNlE9xW98p332yxbQKTUVeki40NYSuQu fwGx35qHYfwMwttXSbXiLT8AzUlXFPTltgtpoCsSVkp6gpkDZBJQCrZMggub44Er0/ YLZVQYtVm2fRig0dlMbYA2AG58Pyi5Hf1i/TFXOI= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:43 +0300 Message-Id: <20210805175848.24188-7-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 06/11] libcamera: pipeline: rkisp1: Migrate to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index cc279ce733ef..eab892785fb0 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -77,12 +77,12 @@ private: std::map frameInfo_; }; -class RkISP1CameraData : public CameraData +class RkISP1CameraData : public Camera::Private { public: RkISP1CameraData(PipelineHandler *pipe, RkISP1MainPath *mainPath, RkISP1SelfPath *selfPath) - : CameraData(pipe), frame_(0), frameInfo_(pipe), + : Camera::Private(pipe), frame_(0), frameInfo_(pipe), mainPath_(mainPath), selfPath_(selfPath) { } @@ -152,16 +152,15 @@ public: bool match(DeviceEnumerator *enumerator) override; private: - RkISP1CameraData *cameraData(const Camera *camera) + RkISP1CameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } friend RkISP1CameraData; friend RkISP1Frames; - int initLinks(const Camera *camera, const CameraSensor *sensor, + int initLinks(Camera *camera, const CameraSensor *sensor, const RkISP1CameraConfiguration &config); int createCamera(MediaEntity *sensor); void tryCompleteRequest(Request *request); @@ -307,7 +306,7 @@ RkISP1FrameInfo *RkISP1Frames::find(Request *request) int RkISP1CameraData::loadIPA(unsigned int hwRevision) { - ipa_ = IPAManager::createIPA(pipe_, 1, 1); + ipa_ = IPAManager::createIPA(pipe(), 1, 1); if (!ipa_) return -ENOENT; @@ -333,7 +332,8 @@ void RkISP1CameraData::queueFrameAction(unsigned int frame, break; } case ipa::rkisp1::ActionParamFilled: { - PipelineHandlerRkISP1 *pipe = static_cast(pipe_); + PipelineHandlerRkISP1 *pipe = + static_cast(this->pipe()); RkISP1FrameInfo *info = frameInfo_.find(frame); if (!info) break; @@ -361,7 +361,7 @@ void RkISP1CameraData::queueFrameAction(unsigned int frame, void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata) { PipelineHandlerRkISP1 *pipe = - static_cast(pipe_); + static_cast(this->pipe()); RkISP1FrameInfo *info = frameInfo_.find(frame); if (!info) @@ -847,7 +847,7 @@ void PipelineHandlerRkISP1::stop(Camera *camera) LOG(RkISP1, Warning) << "Failed to stop parameters for " << camera->id(); - ASSERT(camera->_d()->queuedRequests_.empty()); + ASSERT(data->queuedRequests_.empty()); data->frameInfo_.clear(); freeBuffers(camera); @@ -879,7 +879,7 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request) * Match and Setup */ -int PipelineHandlerRkISP1::initLinks(const Camera *camera, +int PipelineHandlerRkISP1::initLinks(Camera *camera, const CameraSensor *sensor, const RkISP1CameraConfiguration &config) { @@ -970,10 +970,10 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) &data->mainPathStream_, &data->selfPathStream_, }; + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), data->sensor_->id(), - streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); return 0; } From patchwork Thu Aug 5 17:58:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13225 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id C4562C3237 for ; Thu, 5 Aug 2021 17:59:12 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6C07F68888; Thu, 5 Aug 2021 19:59:12 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="S3McCcNB"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4B0456880D for ; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E92DEE1A for ; Thu, 5 Aug 2021 19:59:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186347; bh=8uvisiKXLOsv76nbNLuQKtRbbTJnL3+c/hQciaGux5M=; h=From:To:Subject:Date:In-Reply-To:References:From; b=S3McCcNBd/2zM8VD2stEutlli5fDPlJLl0hW6AV6Lf/29LIiNqy4CaGEHD35JNUai gI+QkqDvVNdbcglKRZNC+cUQUH/h23A+98AL1ZmTJet56YGZFOnHxziU+qJn4eRcuT C4QzJJarKBEAQ/WHb4bCb6Osms0PT/sTmMnkeVls= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:44 +0300 Message-Id: <20210805175848.24188-8-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 07/11] libcamera: pipeline: raspberrypi: Migrate to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- .../pipeline/raspberrypi/raspberrypi.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 33cd5765b52e..754db5a65f4a 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -135,11 +135,11 @@ enum class Isp : unsigned int { Input, Output0, Output1, Stats }; } /* namespace */ -class RPiCameraData : public CameraData +class RPiCameraData : public Camera::Private { public: RPiCameraData(PipelineHandler *pipe) - : CameraData(pipe), state_(State::Stopped), + : Camera::Private(pipe), state_(State::Stopped), supportsFlips_(false), flipsAlterBayerOrder_(false), dropFrameCount_(0), ispOutputCount_(0) { @@ -263,9 +263,9 @@ public: bool match(DeviceEnumerator *enumerator) override; private: - RPiCameraData *cameraData(const Camera *camera) + RPiCameraData *cameraData(Camera *camera) { - return static_cast(PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } int queueAllBuffers(Camera *camera); @@ -1106,10 +1106,10 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) streams.insert(&data->isp_[Isp::Output1]); /* Create and register the camera. */ + const std::string &id = data->sensor_->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), data->sensor_->id(), - streams); - registerCamera(std::move(camera), std::move(data)); + Camera::create(data.release(), id, streams); + registerCamera(std::move(camera), nullptr); return true; } @@ -1224,7 +1224,7 @@ void RPiCameraData::frameStarted(uint32_t sequence) int RPiCameraData::loadIPA(ipa::RPi::SensorConfig *sensorConfig) { - ipa_ = IPAManager::createIPA(pipe_, 1, 1); + ipa_ = IPAManager::createIPA(pipe(), 1, 1); if (!ipa_) return -ENOENT; @@ -1528,11 +1528,11 @@ void RPiCameraData::clearIncompleteRequests() */ if (buffer->request()) { buffer->cancel(); - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); } } - pipe_->completeRequest(request); + pipe()->completeRequest(request); requestQueue_.pop_front(); } } @@ -1556,7 +1556,7 @@ void RPiCameraData::handleStreamBuffer(FrameBuffer *buffer, RPi::Stream *stream) * Tag the buffer as completed, returning it to the * application. */ - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); } else { /* * This buffer was not part of the Request, or there is no @@ -1619,7 +1619,7 @@ void RPiCameraData::checkRequestCompleted() if (state_ != State::IpaComplete) return; - pipe_->completeRequest(request); + pipe()->completeRequest(request); requestQueue_.pop_front(); requestCompleted = true; } From patchwork Thu Aug 5 17:58:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13226 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 1FAF3C323B for ; Thu, 5 Aug 2021 17:59:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CA7DA6888A; Thu, 5 Aug 2021 19:59:12 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="B8sDJ+nr"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9E1C668888 for ; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 44178E04 for ; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186347; bh=QKxYL1Gxkt/R41Xd3kOJLKixYc3td9asEKVUQnhiKZU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=B8sDJ+nrsR/OoBD2lSLIfsBfZkAP6Uwpq7xNBxfRY9wXbD36EbMQMaYZHJ0j6NRku JkwT3EwfdKmPcSLzfvJhx6YRsHZUJubFm4A7Ix058nul5lVsI9Im/cRC65ws5RLbum 3v3fdCb2u5BRxliZadedsGtTGscDW50jrnkUJ4fY= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:45 +0300 Message-Id: <20210805175848.24188-9-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 08/11] libcamera: pipeline: ipu3: Migrate to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" As part of the effort to remove the CameraData class, migrate the pipeline handler-specific camera data from CameraData to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/pipeline/ipu3/ipu3.cpp | 38 +++++++++++++--------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 15d6cca609ff..6d097ac91d2e 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -53,11 +53,11 @@ static const ControlInfoMap::Map IPU3Controls = { { &controls::draft::PipelineDepth, ControlInfo(2, 3) }, }; -class IPU3CameraData : public CameraData +class IPU3CameraData : public Camera::Private { public: IPU3CameraData(PipelineHandler *pipe) - : CameraData(pipe), exposureTime_(0), supportsFlips_(false) + : Camera::Private(pipe), exposureTime_(0), supportsFlips_(false) { } @@ -146,10 +146,9 @@ public: bool match(DeviceEnumerator *enumerator) override; private: - IPU3CameraData *cameraData(const Camera *camera) + IPU3CameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } int initControls(IPU3CameraData *data); @@ -800,10 +799,10 @@ void IPU3CameraData::cancelPendingRequests() for (auto it : request->buffers()) { FrameBuffer *buffer = it.second; buffer->cancel(); - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); } - pipe_->completeRequest(request); + pipe()->completeRequest(request); pendingRequests_.pop(); } } @@ -1184,12 +1183,11 @@ int PipelineHandlerIPU3::registerCameras() &IPU3CameraData::statBufferReady); /* Create and register the Camera instance. */ - std::string cameraId = cio2->sensor()->id(); + const std::string &cameraId = cio2->sensor()->id(); std::shared_ptr camera = - Camera::create(new Camera::Private(this), cameraId, - streams); + Camera::create(data.release(), cameraId, streams); - registerCamera(std::move(camera), std::move(data)); + registerCamera(std::move(camera), nullptr); LOG(IPU3, Info) << "Registered Camera[" << numCameras << "] \"" @@ -1204,7 +1202,7 @@ int PipelineHandlerIPU3::registerCameras() int IPU3CameraData::loadIPA() { - ipa_ = IPAManager::createIPA(pipe_, 1, 1); + ipa_ = IPAManager::createIPA(pipe(), 1, 1); if (!ipa_) return -ENOENT; @@ -1261,7 +1259,7 @@ void IPU3CameraData::queueFrameAction(unsigned int id, info->metadataProcessed = true; if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); break; } @@ -1289,7 +1287,7 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer) Request *request = info->request; - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); request->metadata().set(controls::draft::PipelineDepth, 3); /* \todo Move the ExposureTime control to the IPA. */ @@ -1300,7 +1298,7 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer) request->metadata().set(controls::ScalerCrop, cropRegion_); if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); } /** @@ -1332,16 +1330,16 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) for (auto it : request->buffers()) { FrameBuffer *b = it.second; b->cancel(); - pipe_->completeBuffer(request, b); + pipe()->completeBuffer(request, b); } frameInfos_.remove(info); - pipe_->completeRequest(request); + pipe()->completeRequest(request); return; } if (request->findBuffer(&rawStream_)) - pipe_->completeBuffer(request, buffer); + pipe()->completeBuffer(request, buffer); ipa::ipu3::IPU3Event ev; ev.op = ipa::ipu3::EventFillParams; @@ -1367,7 +1365,7 @@ void IPU3CameraData::paramBufferReady(FrameBuffer *buffer) Request *request = info->request; if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); } void IPU3CameraData::statBufferReady(FrameBuffer *buffer) @@ -1386,7 +1384,7 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer) * In that event, we must have obtained the Request before hand. */ if (frameInfos_.tryComplete(info)) - pipe_->completeRequest(request); + pipe()->completeRequest(request); return; } From patchwork Thu Aug 5 17:58:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13227 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 7A80BC3239 for ; Thu, 5 Aug 2021 17:59:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2ACBF68890; Thu, 5 Aug 2021 19:59:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="UyefOgbi"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E66DF6888A for ; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9231AE1A for ; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186347; bh=p/16uWYefHVyvNt2bZBB1inXmZSgfhEThF3TrcInPFQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=UyefOgbikMBKxec1fd3orm2feMJM0CUpf9bd94SUDfvcPPPRt9mNQQ5X6sjGBpF6t PBcBheFeoPAWFsqYMsLGoeXNUv+jUzL2LuFjlHa920Gx5HhjYHd1XtCslwFmW3WFxE Tv/YGyesU27uraBPpPp/ea3JxOaxogptLNBO7fwY= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:46 +0300 Message-Id: <20210805175848.24188-10-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 09/11] libcamera: pipeline_handler: Drop CameraData class X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The CameraData class isn't used anymore. Drop it. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- include/libcamera/internal/pipeline_handler.h | 26 +---- src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +- .../pipeline/raspberrypi/raspberrypi.cpp | 2 +- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +- src/libcamera/pipeline/simple/simple.cpp | 2 +- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 2 +- src/libcamera/pipeline/vimc/vimc.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 94 +------------------ 8 files changed, 9 insertions(+), 123 deletions(-) diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 86727f90bb65..2f814753f2ae 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -8,14 +8,12 @@ #define __LIBCAMERA_INTERNAL_PIPELINE_HANDLER_H__ #include -#include #include #include #include #include #include -#include #include #include @@ -35,23 +33,6 @@ class MediaDevice; class PipelineHandler; class Request; -class CameraData -{ -public: - explicit CameraData(PipelineHandler *pipe) - : pipe_(pipe) - { - } - virtual ~CameraData() = default; - - PipelineHandler *pipe_; - ControlInfoMap controlInfo_; - ControlList properties_; - -private: - LIBCAMERA_DISABLE_COPY(CameraData) -}; - class PipelineHandler : public std::enable_shared_from_this, public Object { @@ -88,15 +69,11 @@ public: const char *name() const { return name_; } protected: - void registerCamera(std::shared_ptr camera, - std::unique_ptr data); + void registerCamera(std::shared_ptr camera); void hotplugMediaDevice(MediaDevice *media); virtual int queueRequestDevice(Camera *camera, Request *request) = 0; - CameraData *cameraData(const Camera *camera); - const CameraData *cameraData(const Camera *camera) const; - CameraManager *manager_; private: @@ -105,7 +82,6 @@ private: std::vector> mediaDevices_; std::vector> cameras_; - std::map> cameraData_; const char *name_; diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 6d097ac91d2e..713fbec4daae 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -1187,7 +1187,7 @@ int PipelineHandlerIPU3::registerCameras() std::shared_ptr camera = Camera::create(data.release(), cameraId, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); LOG(IPU3, Info) << "Registered Camera[" << numCameras << "] \"" diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 754db5a65f4a..ad027d1721a8 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -1109,7 +1109,7 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); return true; } diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index eab892785fb0..22be1a03e4dc 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -973,7 +973,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); return 0; } diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 81d342a3fa73..8594520f520c 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -1050,7 +1050,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); registered = true; } diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index bbeeda97a91a..882d3f82839a 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -472,7 +472,7 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) std::set streams{ &data->stream_ }; std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); /* Enable hot-unplug notifications. */ hotplugMediaDevice(media); diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 866c993d7e50..bd7cbcebe3ff 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -440,7 +440,7 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) const std::string &id = data->sensor_->id(); std::shared_ptr camera = Camera::create(data.release(), id, streams); - registerCamera(std::move(camera), nullptr); + registerCamera(std::move(camera)); return true; } diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 1f1de19d81c5..28e09bc00771 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -39,55 +39,6 @@ namespace libcamera { LOG_DEFINE_CATEGORY(Pipeline) -/** - * \class CameraData - * \brief Base class for platform-specific data associated with a camera - * - * The CameraData base abstract class represents platform specific-data - * a pipeline handler might want to associate with a Camera to access them - * at a later time. - * - * Pipeline handlers are expected to extend this base class with platform - * specific implementation, associate instances of the derived classes - * using the registerCamera() method, and access them at a later time - * with cameraData(). - */ - -/** - * \fn CameraData::CameraData(PipelineHandler *pipe) - * \brief Construct a CameraData instance for the given pipeline handler - * \param[in] pipe The pipeline handler - * - * The reference to the pipeline handler is stored internally, the caller shall - * guarantee that the pointer remains valid as long as the CameraData instance - * exists. - */ - -/** - * \var CameraData::pipe_ - * \brief The pipeline handler related to this CameraData instance - * - * The pipe_ pointer provides access to the PipelineHandler object that this - * instance is related to. It is set when the CameraData instance is created - * and remains valid until the instance is destroyed. - */ - -/** - * \var CameraData::controlInfo_ - * \brief The set of controls supported by the camera - * - * The control information shall be initialised by the pipeline handler when - * creating the camera, and shall not be modified afterwards. - */ - -/** - * \var CameraData::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. - */ - /** * \class PipelineHandler * \brief Create and manage cameras based on a set of media devices @@ -471,28 +422,14 @@ void PipelineHandler::completeRequest(Request *request) /** * \brief Register a camera to the camera manager and pipeline handler * \param[in] camera The camera to be added - * \param[in] data Pipeline-specific data for the camera * * This method is called by pipeline handlers to register the cameras they - * handle with the camera manager. It associates the pipeline-specific \a data - * with the camera, for later retrieval with cameraData(). Ownership of \a data - * is transferred to the PipelineHandler. + * handle with the camera manager. * * \context This function shall be called from the CameraManager thread. */ -void PipelineHandler::registerCamera(std::shared_ptr camera, - std::unique_ptr data) +void PipelineHandler::registerCamera(std::shared_ptr camera) { - /* - * 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); if (mediaDevices_.empty()) @@ -586,33 +523,6 @@ void PipelineHandler::disconnect() } } -/** - * \brief Retrieve the pipeline-specific data associated with a Camera - * \param[in] camera The camera whose data to retrieve - * \return A pointer to the pipeline-specific data passed to registerCamera(). - * The returned pointer is a borrowed reference and is guaranteed to remain - * valid until the pipeline handler is destroyed. It shall not be deleted - * manually by the caller. - */ -CameraData *PipelineHandler::cameraData(const Camera *camera) -{ - ASSERT(cameraData_.count(camera)); - return cameraData_[camera].get(); -} - -/** - * \brief Retrieve the pipeline-specific data associated with a Camera - * \param[in] camera The camera whose data to retrieve - * \sa cameraData() - * \return A const pointer to the pipeline-specific data passed to - * registerCamera(). - */ -const CameraData *PipelineHandler::cameraData(const Camera *camera) const -{ - ASSERT(cameraData_.count(camera)); - return cameraData_.at(camera).get(); -} - /** * \var PipelineHandler::manager_ * \brief The Camera manager associated with the pipeline handler From patchwork Thu Aug 5 17:58:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13228 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id CC948C323C for ; Thu, 5 Aug 2021 17:59:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 84D766888B; Thu, 5 Aug 2021 19:59:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="DZk84sMm"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 469236888E for ; Thu, 5 Aug 2021 19:59:08 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E7CFEF95 for ; Thu, 5 Aug 2021 19:59:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186348; bh=vTVnPANokOzTJzf071o6aONPfAuyY4O6JKU9FmrMueQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=DZk84sMmVAzLth8lWsd/YTZIBkPT9vV4cz/w7CLHGndmYIl9DX4NH1qAEyig9VFuw dzSB4fUiFyqAkvL6I0Vb569e0sHiS+nn5ZpzXhticOPeJtE/010vuxBuRLKZ+Ou/8s GhaNc5uyJimHknjlTUWOO3Q8tdvMtv/9mrpNEylc= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:47 +0300 Message-Id: <20210805175848.24188-11-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 10/11] Documentation: guides: pipeline-handler: Migrate to Camera::Private X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Update the pipeline handler guide following the migration from the CameraData class to the Camera::Private class. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- Documentation/guides/pipeline-handler.rst | 67 ++++++++++++----------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst index 152776935a33..7e9ff824dd50 100644 --- a/Documentation/guides/pipeline-handler.rst +++ b/Documentation/guides/pipeline-handler.rst @@ -106,7 +106,7 @@ functionalities descibed above. Below is a brief overview of each of those: Abstracts camera sensor handling by hiding the details of the V4L2 subdevice kernel API and caching sensor information. -- `CameraData `_: +- `Camera::Private `_: Represents device-specific data a pipeline handler associates to each Camera instance. @@ -416,26 +416,26 @@ receivers port output. The Pipeline Handler is responsible for defining the set of Streams associated with the Camera. -Each Camera has instance-specific data represented using the `CameraData`_ +Each Camera has instance-specific data represented using the `Camera::Private`_ class, which can be extended for the specific needs of the pipeline handler. -.. _CameraData: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html +.. _Camera::Private: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html -To support the Camera we will later register, we need to create a CameraData +To support the Camera we will later register, we need to create a Camera::Private class that we can implement for our specific Pipeline Handler. -Define a new ``VividCameraData()`` class derived from ``CameraData`` by adding -the following code before the PipelineHandlerVivid class definition where it -will be used: +Define a new ``VividCameraPrivate()`` class derived from ``Camera::Private`` by +adding the following code before the PipelineHandlerVivid class definition where +it will be used: .. code-block:: cpp - class VividCameraData : public CameraData + class VividCameraData : public Camera::Private { public: VividCameraData(PipelineHandler *pipe, MediaDevice *media) - : CameraData(pipe), media_(media), video_(nullptr) + : Camera::Private(pipe), media_(media), video_(nullptr) { } @@ -457,17 +457,17 @@ single stream, represented by the ``VividCameraData`` class members. More complex pipeline handlers might register cameras composed of several video devices and sub-devices, or multiple streams per camera that represent the several components of the image capture pipeline. You should represent all these -components in the ``CameraData`` derived class when developing a custom +components in the ``Camera::Private`` derived class when developing a custom PipelineHandler. In our example VividCameraData we implement an ``init()`` function to prepare -the object from our PipelineHandler, however the CameraData class does not +the object from our PipelineHandler, however the Camera::Private class does not specify the interface for initialisation and PipelineHandlers can manage this -based on their own needs. Derived CameraData classes are used only by their +based on their own needs. Derived Camera::Private classes are used only by their respective pipeline handlers. -The CameraData class stores the context required for each camera instance and -is usually responsible for opening all Devices used in the capture pipeline. +The Camera::Private class stores the context required for each camera instance +and is usually responsible for opening all Devices used in the capture pipeline. We can now implement the ``init`` method for our example Pipeline Handler to create a new V4L2 video device from the media entity, which we can specify using @@ -488,11 +488,11 @@ capture device named 'vivid-000-vid-cap' by the device. return 0; } -The CameraData should be created and initialised before we move on to register a -new Camera device so we need to construct and initialise our +The VividCameraData should be created and initialised before we move on to +register a new Camera device so we need to construct and initialise our VividCameraData after we have identified our device within PipelineHandlerVivid::match(). The VividCameraData is wrapped by a -std::unique_ptr to help manage the lifetime of our CameraData instance. +std::unique_ptr to help manage the lifetime of the instance. If the camera data initialization fails, return ``false`` to indicate the failure to the ``match()`` method and prevent retrying of the pipeline handler. @@ -508,9 +508,9 @@ failure to the ``match()`` method and prevent retrying of the pipeline handler. Once the camera data has been initialized, the Camera device instances and the associated streams have to be registered. Create a set of streams for the camera, which for this device is only one. You create a camera using the static -`Camera::create`_ method, passing the pipeline handler, the id of the camera, -and the streams available. Then register the camera and its data with the -pipeline handler and camera manager using `registerCamera`_. +`Camera::create`_ method, passing the Camera::Private instance, the id of the +camera, and the streams available. Then register the camera with the pipeline +handler and camera manager using `registerCamera`_. Finally with a successful construction, we return 'true' indicating that the PipelineHandler successfully matched and constructed a device. @@ -548,23 +548,24 @@ Our match function should now look like the following: /* Create and register the camera. */ std::set streams{ &data->stream_ }; - std::shared_ptr camera = Camera::create(this, data->video_->deviceName(), streams); - registerCamera(std::move(camera), std::move(data)); + const std::string &id = data->video_->deviceName(); + std::shared_ptr camera = Camera::create(data.release(), id, streams); + registerCamera(std::move(camera)); return true; } -We will need to use our custom CameraData class frequently throughout the +We will need to use our custom VividCameraData class frequently throughout the pipeline handler, so we add a private convenience helper to our Pipeline handler -to obtain and cast the custom CameraData instance from a Camera instance. +to obtain and cast the custom VividCameraData instance from a Camera::Private +instance. .. code-block:: cpp private: - VividCameraData *cameraData(const Camera *camera) + VividCameraData *cameraData(Camera *camera) { - return static_cast( - PipelineHandler::cameraData(camera)); + return static_cast(camera->_d()); } At this point, you need to add the following new includes to provide the Camera @@ -594,12 +595,12 @@ are defined by src/libcamera/`properties_ids.yaml`_. Pipeline handlers can optionally register the list of controls an application can set as well as a list of immutable camera properties. Being both -Camera-specific values, they are represented in the ``CameraData`` base class, -which provides two members for this purpose: the `CameraData::controlInfo_`_ and -the `CameraData::properties_`_ fields. +Camera-specific values, they are represented in the ``Camera::Private`` base +class, which provides two members for this purpose: the +`Camera::Private::controlInfo_`_ and the `Camera::Private::properties_`_ fields. -.. _CameraData::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#ab9fecd05c655df6084a2233872144a52 -.. _CameraData::properties_: http://libcamera.org/api-html/classlibcamera_1_1CameraData.html#a84002c29f45bd35566c172bb65e7ec0b +.. _Camera::Private::controlInfo_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ab4e183eb4dabe929d1b2bbbb519b969f +.. _Camera::Private::properties_: http://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ad31f12f5ed9c1fbe25750902f4791064 The ``controlInfo_`` field represents a map of ``ControlId`` instances associated with the limits of valid values supported for the control. More @@ -617,7 +618,7 @@ Complete the initialization of the ``VividCameraData`` class by adding the following code to the ``VividCameraData::init()`` method to initialise the controls. For more complex control configurations, this could of course be broken out to a separate function, but for now we just initialise the small set -inline in our CameraData init: +inline in our VividCameraData init: .. code-block:: cpp From patchwork Thu Aug 5 17:58:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13229 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 99F17C3238 for ; Thu, 5 Aug 2021 17:59:14 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3735D688A3; Thu, 5 Aug 2021 19:59:14 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Ev5v22og"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 993186888D for ; Thu, 5 Aug 2021 19:59:08 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 42086E1A for ; Thu, 5 Aug 2021 19:59:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628186348; bh=1mkw10qc9S1yyJfZknldkT5olnneCd83uz8JyPVQvYI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Ev5v22ogGPfPcwCZ2oAs/Nn8qxcpjSEawkr1mUHocwq3v/42jcDeI+cy7bnqryMOh izRbXBQpMHvfEas+Betzacb2hurl2K3sjb6usVGwzroT95+TQRoSGcC7VD7vN0+znh yyTacQ7kKAK4LGc8ZPinGrROcK0UeJ4puu3OTQqM= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 5 Aug 2021 20:58:48 +0300 Message-Id: <20210805175848.24188-12-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> References: <20210805175848.24188-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 11/11] libcamera: pipeline_handler: Drop controls() and properties() functions X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The PipelineHandler controls() and properties() functions are only used by the Camera class. Now that the controls and properties are stored in the Camera::Private class, we can drop those functions and access the private data directly in Camera::controls() and Camera::properties(). Suggested-by: Jacopo Mondi Signed-off-by: Laurent Pinchart Reviewed-by: Jacopo Mondi --- include/libcamera/internal/pipeline_handler.h | 3 --- src/libcamera/camera.cpp | 4 ++-- src/libcamera/pipeline_handler.cpp | 21 ------------------- 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 2f814753f2ae..79e9839fa0de 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -47,9 +47,6 @@ public: bool lock(); void unlock(); - const ControlInfoMap &controls(const Camera *camera) const; - const ControlList &properties(const Camera *camera) const; - virtual CameraConfiguration *generateConfiguration(Camera *camera, const StreamRoles &roles) = 0; virtual int configure(Camera *camera, CameraConfiguration *config) = 0; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index f0893f89a1b3..a6cc4ea624c0 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -800,7 +800,7 @@ int Camera::release() */ const ControlInfoMap &Camera::controls() const { - return _d()->pipe_->controls(this); + return _d()->controlInfo_; } /** @@ -813,7 +813,7 @@ const ControlInfoMap &Camera::controls() const */ const ControlList &Camera::properties() const { - return _d()->pipe_->properties(this); + return _d()->properties_; } /** diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 28e09bc00771..bf238377c67a 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -176,27 +176,6 @@ void PipelineHandler::unlock() media->unlock(); } -/** - * \brief Retrieve the list of controls for a camera - * \param[in] camera The camera - * \context This function is \threadsafe. - * \return A ControlInfoMap listing the controls support by \a camera - */ -const ControlInfoMap &PipelineHandler::controls(const Camera *camera) const -{ - return camera->_d()->controlInfo_; -} - -/** - * \brief Retrieve the list of properties for a camera - * \param[in] camera The camera - * \return A ControlList of properties supported by \a camera - */ -const ControlList &PipelineHandler::properties(const Camera *camera) const -{ - return camera->_d()->properties_; -} - /** * \fn PipelineHandler::generateConfiguration() * \brief Generate a camera configuration for a specified camera