From patchwork Tue Aug 3 13:32:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13178 X-Patchwork-Delegate: umang.jain@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 C85ADC3235 for ; Tue, 3 Aug 2021 13:32:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 82BAE687CE; Tue, 3 Aug 2021 15:32:27 +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="VTpiDiw4"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EB50E6026A for ; Tue, 3 Aug 2021 15:32:25 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.238.109.12]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D85DC3F0; Tue, 3 Aug 2021 15:32:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627997545; bh=awfRVeK4EkuD9Hy2AouVGj9dsPxvxRCmHcnme0lmKRg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VTpiDiw49U+HT45GaiXpB8C121aCymzff60e86zo08QXGJMJM5TOQnb/5S0/M8LHg itolYXeqohayGUDn/k1+3PBEABbxp9GPpExayVbv+Z7xlJwSpJhTPZFi44J/WmMy7x EGrW1LEa/3poSWfSb6Xx/s3UF9W1FgZhCcIjr2GU= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Aug 2021 19:02:02 +0530 Message-Id: <20210803133205.6599-2-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210803133205.6599-1-umang.jain@ideasonboard.com> References: <20210803133205.6599-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/4] libcamera: camera_sensor: Transform CameraSensor::sizes() 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 CameraSensor, the mbusCodes() and sizes() accessor functions retrieves all the supported media bus codes and the supported sizes respectively. However, this is quite limiting since the caller probably isn't in a position to match which range of sizes are supported for a particular mbusCode. Hence, the caller is most likely interested to know about the sizes supported for a particular media bus code. This patch transforms the existing CameraSensor::sizes() to CameraSensor::sizes(mbuscode) to achieve that goal. To know all the frame sizes of the CameraSensor as required in IPU3 case Cio2Device::sizes(), one would now require to enumerate all the media bus codes (can be retrieved by CameraSensor::mbusCodes()) with CameraSensor::size(mbusCode). The result can be inserted in a std::set<> to avoid duplicates. Signed-off-by: Umang Jain --- include/libcamera/internal/camera_sensor.h | 2 +- src/libcamera/camera_sensor.cpp | 36 ++++++++++++++++------ src/libcamera/pipeline/ipu3/cio2.cpp | 10 +++--- test/camera-sensor.cpp | 2 +- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index db12b07e..d25a1165 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -38,7 +38,7 @@ public: const std::string &id() const { return id_; } const MediaEntity *entity() const { return entity_; } const std::vector &mbusCodes() const { return mbusCodes_; } - const std::vector &sizes() const { return sizes_; } + const std::vector sizes(unsigned int mbusCode) const; Size resolution() const; const std::vector &testPatternModes() const { diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index cde431cc..3c3ceff3 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -471,16 +471,6 @@ int CameraSensor::initProperties() * \return The supported media bus codes sorted in increasing order */ -/** - * \fn CameraSensor::sizes() - * \brief Retrieve the frame sizes supported by the camera sensor - * - * The reported sizes span all media bus codes supported by the camera sensor. - * Not all sizes may be supported by all media bus codes. - * - * \return The supported frame sizes sorted in increasing order - */ - /** * \brief Retrieve the camera sensor resolution * @@ -594,6 +584,32 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector &mbu return format; } +/** + * \brief Retrieve the supported frame sizes for a media bus code + * \param[in] mbusCode The media bus code for which sizes are requested + * + * The reported sizes for a particular \a mbusCode are supported by the camera + * sensor. + * + * \return The supported frame sizes for \a mbusCode sorted in increasing order + */ +const std::vector CameraSensor::sizes(unsigned int mbusCode) const +{ + std::vector sizes; + + const auto format = formats_.find(mbusCode); + if (format == formats_.end()) + return sizes; + + const std::vector &ranges = format->second; + std::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes), + [](const SizeRange &range) { return range.max; }); + + std::sort(sizes.begin(), sizes.end()); + + return sizes; +} + /** * \brief Set the sensor output format * \param[in] format The desired sensor output format diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp index 1bcd580e..6f2ef321 100644 --- a/src/libcamera/pipeline/ipu3/cio2.cpp +++ b/src/libcamera/pipeline/ipu3/cio2.cpp @@ -69,11 +69,13 @@ std::vector CIO2Device::sizes() const if (!sensor_) return {}; - std::vector sizes; - for (const Size &size : sensor_->sizes()) - sizes.emplace_back(size, size); + std::set allSizes; + for (unsigned int code : sensor_->mbusCodes()) { + for (Size sz : sensor_->sizes(code)) + allSizes.insert(sz); + } - return sizes; + return std::vector(allSizes.begin(), allSizes.end()); } /** diff --git a/test/camera-sensor.cpp b/test/camera-sensor.cpp index a8dcad82..372ee4af 100644 --- a/test/camera-sensor.cpp +++ b/test/camera-sensor.cpp @@ -76,7 +76,7 @@ protected: return TestFail; } - const std::vector &sizes = sensor_->sizes(); + const std::vector &sizes = sensor_->sizes(*iter); auto iter2 = std::find(sizes.begin(), sizes.end(), Size(4096, 2160)); if (iter2 == sizes.end()) {