From patchwork Mon Feb 8 01:38:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 11181 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 D8563BD162 for ; Mon, 8 Feb 2021 01:38:35 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 573C760300; Mon, 8 Feb 2021 02:38:35 +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="URkVQQv3"; 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 9084960106 for ; Mon, 8 Feb 2021 02:38:33 +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 62CF83D7 for ; Mon, 8 Feb 2021 02:38:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1612748312; bh=9yHqxdNo2RSD12Y5FsVxryjExNdkAwHQl0u1hjbyVZs=; h=From:To:Subject:Date:From; b=URkVQQv3CFkBDTbyao6zQOhTTf6MOhU3VAhRc3/CF/3jVKu4aBP2YtlBAro/guJmB nzHMwNYy/LBBHpDGjE/Z19Ni33ozj1ehU+GYSFi9MPCimaC+9DIjqO+zBqrY9Dd7NB N5tJBdVXcVy8GwIP847YvnlcA6UUnl7pe3PAways= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Mon, 8 Feb 2021 03:38:05 +0200 Message-Id: <20210208013805.30842-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH] libcamera: camera_sensor: Use active area size as resolution 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" When a sensor can upscale the image, the native sensor resolution isn't equal to the largest size reported by the sensor. Use the active area size instead, and default it to the largest enumerated size if the crop rectangle targets are not supported. Signed-off-by: Laurent Pinchart --- include/libcamera/internal/camera_sensor.h | 3 +-- src/libcamera/camera_sensor.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index c8f81882a958..74c35d1c8922 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -55,7 +55,7 @@ public: const MediaEntity *entity() const { return entity_; } const std::vector &mbusCodes() const { return mbusCodes_; } const std::vector &sizes() const { return sizes_; } - const Size &resolution() const { return resolution_; } + Size resolution() const { return activeArea_.size(); } V4L2SubdeviceFormat getFormat(const std::vector &mbusCodes, const Size &size) const; @@ -87,7 +87,6 @@ private: std::string id_; V4L2Subdevice::Formats formats_; - Size resolution_; std::vector mbusCodes_; std::vector sizes_; diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index c9e8d49b7935..59834ffcdd94 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -234,10 +234,12 @@ int CameraSensor::init() sizes_.erase(last, sizes_.end()); /* - * The sizes_ vector is sorted in ascending order, the resolution is - * thus the last element of the vector. + * Initialize the pixel array size as the largest size supported by the + * sensor. It will be overridden later using the crop bounds. The + * sizes_ vector is sorted in ascending order, the largest size is thus + * the last element of the vector. */ - resolution_ = sizes_.back(); + pixelArraySize_ = sizes_.back(); /* * VIMC is a bit special, as it does not yet support all the mandatory @@ -307,14 +309,13 @@ int CameraSensor::validateSensorDriver() Rectangle rect; int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_BOUNDS, &rect); if (ret) { - rect = Rectangle(resolution()); LOG(CameraSensor, Warning) << "The PixelArraySize property has been defaulted to " - << rect.toString(); + << pixelArraySize_.toString(); err = -EINVAL; + } else { + pixelArraySize_ = rect.size(); } - pixelArraySize_.width = rect.width; - pixelArraySize_.height = rect.height; ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &activeArea_); if (ret) { @@ -380,7 +381,6 @@ int CameraSensor::validateSensorDriver() */ void CameraSensor::initVimcDefaultProperties() { - pixelArraySize_ = resolution(); activeArea_ = Rectangle(pixelArraySize_); }