From patchwork Sat Dec 12 18:51:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 10658 X-Patchwork-Delegate: laurent.pinchart@ideasonboard.com 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 8C627BD80A for ; Sat, 12 Dec 2020 18:51:31 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DC1E76034C; Sat, 12 Dec 2020 19:51:30 +0100 (CET) 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="Pqv5M8mI"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1CAC56032B for ; Sat, 12 Dec 2020 19:51:28 +0100 (CET) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 75A4F4FD for ; Sat, 12 Dec 2020 19:51:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1607799087; bh=93iiYLrUABDfk9S9z7sBULHXCAtBFZ/vE4HvXpG+J9c=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Pqv5M8mIBQtAGc+VsYyJAnqkvbAsCntxQFdbk8e8N5njc5+fL+pK+v1Vm8RQzgGT6 7HVQIfCOXgloET4TeIJtIVbagE8Za9W8DawM0DvT4GyZS646TW3EJSiPt9Gc4Z7lhu 6QMZD8JmBgQnSWGNux27L6xhGmCGYh94gcJ3Btqw= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sat, 12 Dec 2020 20:51:16 +0200 Message-Id: <20201212185116.29611-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201212185116.29611-1-laurent.pinchart@ideasonboard.com> References: <20201212185116.29611-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/3] libcamera: pipeline: Manage resources with std::unique_ptr<> 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" Replace manual resource destruction with std::unique_ptr<> where applicable. This removes the need for several destructors. Signed-off-by: Laurent Pinchart Reviewed-by: Paul Elder --- src/libcamera/pipeline/ipu3/cio2.cpp | 11 ++--------- src/libcamera/pipeline/ipu3/cio2.h | 9 ++++----- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 19 +++++++------------ src/libcamera/pipeline/simple/converter.cpp | 8 +------- src/libcamera/pipeline/simple/converter.h | 3 +-- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 12 ++++-------- src/libcamera/pipeline/vimc/vimc.cpp | 11 +++-------- 7 files changed, 22 insertions(+), 51 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp index 821715e325b4..bd5260d5b288 100644 --- a/src/libcamera/pipeline/ipu3/cio2.cpp +++ b/src/libcamera/pipeline/ipu3/cio2.cpp @@ -33,16 +33,9 @@ const std::map mbusCodesToPixelFormat = { } /* namespace */ CIO2Device::CIO2Device() - : sensor_(nullptr), csi2_(nullptr) { } -CIO2Device::~CIO2Device() -{ - delete csi2_; - delete sensor_; -} - /** * \brief Retrieve the list of supported PixelFormats * @@ -117,7 +110,7 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index) MediaLink *link = links[0]; MediaEntity *sensorEntity = link->source()->entity(); - sensor_ = new CameraSensor(sensorEntity); + sensor_ = std::make_unique(sensorEntity); ret = sensor_->init(); if (ret) return ret; @@ -148,7 +141,7 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index) * might impact on power consumption. */ - csi2_ = new V4L2Subdevice(csi2Entity); + csi2_ = std::make_unique(csi2Entity); ret = csi2_->open(); if (ret) return ret; diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h index 0dca9673ca07..236ad287354a 100644 --- a/src/libcamera/pipeline/ipu3/cio2.h +++ b/src/libcamera/pipeline/ipu3/cio2.h @@ -33,7 +33,6 @@ public: static constexpr unsigned int CIO2_BUFFER_COUNT = 4; CIO2Device(); - ~CIO2Device(); std::vector formats() const; std::vector sizes() const; @@ -49,8 +48,8 @@ public: int start(); int stop(); - CameraSensor *sensor() { return sensor_; } - const CameraSensor *sensor() const { return sensor_; } + CameraSensor *sensor() { return sensor_.get(); } + const CameraSensor *sensor() const { return sensor_.get(); } int queueBuffer(Request *request, FrameBuffer *rawBuffer); void tryReturnBuffer(FrameBuffer *buffer); @@ -61,8 +60,8 @@ private: void cio2BufferReady(FrameBuffer *buffer); - CameraSensor *sensor_; - V4L2Subdevice *csi2_; + std::unique_ptr sensor_; + std::unique_ptr csi2_; std::unique_ptr output_; std::vector> buffers_; diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 4d98c9027f42..021d0ffe3ffb 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -121,21 +121,16 @@ class RkISP1CameraData : public CameraData public: RkISP1CameraData(PipelineHandler *pipe, RkISP1MainPath *mainPath, RkISP1SelfPath *selfPath) - : CameraData(pipe), sensor_(nullptr), frame_(0), - frameInfo_(pipe), mainPath_(mainPath), selfPath_(selfPath) + : CameraData(pipe), frame_(0), frameInfo_(pipe), + mainPath_(mainPath), selfPath_(selfPath) { } - ~RkISP1CameraData() - { - delete sensor_; - } - int loadIPA(); Stream mainPathStream_; Stream selfPathStream_; - CameraSensor *sensor_; + std::unique_ptr sensor_; unsigned int frame_; std::vector ipaBuffers_; RkISP1Frames frameInfo_; @@ -430,7 +425,7 @@ void RkISP1CameraData::queueFrameAction(unsigned int frame, case RKISP1_IPA_ACTION_V4L2_SET: { const ControlList &controls = action.controls[0]; timeline_.scheduleAction(std::make_unique(frame, - sensor_, + sensor_.get(), controls)); break; } @@ -489,7 +484,7 @@ bool RkISP1CameraConfiguration::fitsAllPaths(const StreamConfiguration &cfg) CameraConfiguration::Status RkISP1CameraConfiguration::validate() { - const CameraSensor *sensor = data_->sensor_; + const CameraSensor *sensor = data_->sensor_.get(); Status status = Valid; if (config_.empty()) @@ -660,7 +655,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c) RkISP1CameraConfiguration *config = static_cast(c); RkISP1CameraData *data = cameraData(camera); - CameraSensor *sensor = data->sensor_; + CameraSensor *sensor = data->sensor_.get(); int ret; ret = initLinks(camera, sensor, *config); @@ -1035,7 +1030,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) data->controlInfo_ = std::move(ctrls); - data->sensor_ = new CameraSensor(sensor); + data->sensor_ = std::make_unique(sensor); ret = data->sensor_->init(); if (ret) return ret; diff --git a/src/libcamera/pipeline/simple/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp index 67e6e864aa0a..a6a8e139cb3e 100644 --- a/src/libcamera/pipeline/simple/converter.cpp +++ b/src/libcamera/pipeline/simple/converter.cpp @@ -24,7 +24,6 @@ namespace libcamera { LOG_DECLARE_CATEGORY(SimplePipeline) SimpleConverter::SimpleConverter(MediaDevice *media) - : m2m_(nullptr) { /* * Locate the video node. There's no need to validate the pipeline @@ -38,17 +37,12 @@ SimpleConverter::SimpleConverter(MediaDevice *media) if (it == entities.end()) return; - m2m_ = new V4L2M2MDevice((*it)->deviceNode()); + m2m_ = std::make_unique((*it)->deviceNode()); m2m_->output()->bufferReady.connect(this, &SimpleConverter::outputBufferReady); m2m_->capture()->bufferReady.connect(this, &SimpleConverter::captureBufferReady); } -SimpleConverter::~SimpleConverter() -{ - delete m2m_; -} - int SimpleConverter::open() { if (!m2m_) diff --git a/src/libcamera/pipeline/simple/converter.h b/src/libcamera/pipeline/simple/converter.h index 78296680aa14..a3c4d899cfc8 100644 --- a/src/libcamera/pipeline/simple/converter.h +++ b/src/libcamera/pipeline/simple/converter.h @@ -29,7 +29,6 @@ class SimpleConverter { public: SimpleConverter(MediaDevice *media); - ~SimpleConverter(); int open(); void close(); @@ -56,7 +55,7 @@ private: void captureBufferReady(FrameBuffer *buffer); void outputBufferReady(FrameBuffer *buffer); - V4L2M2MDevice *m2m_; + std::unique_ptr m2m_; std::queue captureDoneQueue_; std::queue outputDoneQueue_; diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 87b0f03d143a..e54f45bb8825 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -35,21 +36,16 @@ class UVCCameraData : public CameraData { public: UVCCameraData(PipelineHandler *pipe) - : CameraData(pipe), video_(nullptr) + : CameraData(pipe) { } - ~UVCCameraData() - { - delete video_; - } - int init(MediaDevice *media); void addControl(uint32_t cid, const ControlInfo &v4l2info, ControlInfoMap::Map *ctrls); void bufferReady(FrameBuffer *buffer); - V4L2VideoDevice *video_; + std::unique_ptr video_; Stream stream_; }; @@ -499,7 +495,7 @@ int UVCCameraData::init(MediaDevice *media) } /* Create and open the video device. */ - video_ = new V4L2VideoDevice(*entity); + video_ = std::make_unique(*entity); ret = video_->open(); if (ret) return ret; diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 72256f5b4190..8bda746f3136 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -42,20 +42,15 @@ class VimcCameraData : public CameraData { public: VimcCameraData(PipelineHandler *pipe, MediaDevice *media) - : CameraData(pipe), media_(media), sensor_(nullptr) + : CameraData(pipe), media_(media) { } - ~VimcCameraData() - { - delete sensor_; - } - int init(); void bufferReady(FrameBuffer *buffer); MediaDevice *media_; - CameraSensor *sensor_; + std::unique_ptr sensor_; std::unique_ptr debayer_; std::unique_ptr scaler_; std::unique_ptr video_; @@ -461,7 +456,7 @@ int VimcCameraData::init() return ret; /* Create and open the camera sensor, debayer, scaler and video device. */ - sensor_ = new CameraSensor(media_->getEntityByName("Sensor B")); + sensor_ = std::make_unique(media_->getEntityByName("Sensor B")); ret = sensor_->init(); if (ret) return ret;