From patchwork Tue Aug 10 07:58:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 13273 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 39019BD87D for ; Tue, 10 Aug 2021 07:59:06 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E51AE687FA; Tue, 10 Aug 2021 09:59:05 +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="F0B6Ut1+"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D793D687DE for ; Tue, 10 Aug 2021 09:59:04 +0200 (CEST) Received: from perceval.ideasonboard.com (unknown [103.238.109.8]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A734DEE; Tue, 10 Aug 2021 09:59:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1628582344; bh=1XEI1fJ8n+4eb+I77B9m/UzjzNxJl5yljDMjF//fpsc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F0B6Ut1+Zg20uFHAh51Brd1eG+5pSrp+wvegmdrS7nmoZhMCSz9FANxZ3k31MABot ZVtmKkctQ1U8UAwBq76p6tTpc2jxrNqLaUWC/17ZzY6iTpynJYBsQM1V644ISGYkrb XBrcUNJ+QHHobEKp6iSaEgr8F7s3WC985QCxUGKE= From: Umang Jain To: libcamera-devel@lists.libcamera.org Date: Tue, 10 Aug 2021 13:28:51 +0530 Message-Id: <20210810075854.86191-2-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210810075854.86191-1-umang.jain@ideasonboard.com> References: <20210810075854.86191-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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. The patch also transforms existing CIO2Device::sizes() in IPU3 pipeline handler to CIO2Device::sizes(PixelFormat) on a similar principle. The function is then plumbed to CameraSensor::sizes(mbusCode) to enumerate the per-format sizes as required in PipelineHandlerIPU3::generateConfiguration(). Signed-off-by: Umang Jain Tested-by: Umang Jain Tested-by: Jacopo Mondi Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham --- include/libcamera/internal/camera_sensor.h | 2 +- src/libcamera/camera_sensor.cpp | 25 ++++++++++++++++------ src/libcamera/pipeline/ipu3/cio2.cpp | 20 ++++++++++++----- src/libcamera/pipeline/ipu3/cio2.h | 2 +- src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +- test/camera-sensor.cpp | 2 +- 6 files changed, 38 insertions(+), 15 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 7a386415..87668509 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -472,14 +472,27 @@ int CameraSensor::initProperties() */ /** - * \fn CameraSensor::sizes() - * \brief Retrieve the frame sizes supported by the camera sensor + * \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 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 + * \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 Retrieve the camera sensor resolution diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp index 1bcd580e..8a40e955 100644 --- a/src/libcamera/pipeline/ipu3/cio2.cpp +++ b/src/libcamera/pipeline/ipu3/cio2.cpp @@ -64,16 +64,26 @@ std::vector CIO2Device::formats() const * \brief Retrieve the list of supported size ranges * \return The list of supported SizeRange */ -std::vector CIO2Device::sizes() const +std::vector CIO2Device::sizes(const PixelFormat &format) const { + std::vector szRange; + int mbusCode = -1; + if (!sensor_) return {}; - std::vector sizes; - for (const Size &size : sensor_->sizes()) - sizes.emplace_back(size, size); + for (const auto &iter : mbusCodesToPixelFormat) { + if (iter.second == format) + mbusCode = iter.first; + } + + if (!mbusCode) + return {}; + + for (const Size &sz: sensor_->sizes(mbusCode)) + szRange.emplace_back(sz); - return sizes; + return szRange; } /** diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h index f28e9f1d..24272dc5 100644 --- a/src/libcamera/pipeline/ipu3/cio2.h +++ b/src/libcamera/pipeline/ipu3/cio2.h @@ -35,7 +35,7 @@ public: CIO2Device(); std::vector formats() const; - std::vector sizes() const; + std::vector sizes(const PixelFormat &format) const; int init(const MediaDevice *media, unsigned int index); int configure(const Size &size, V4L2DeviceFormat *outputFormat); diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 19cb5c4e..c73540fb 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -455,7 +455,7 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, bufferCount = cio2Config.bufferCount; for (const PixelFormat &format : data->cio2_.formats()) - streamFormats[format] = data->cio2_.sizes(); + streamFormats[format] = data->cio2_.sizes(format); break; } 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()) {