{"id":10788,"url":"https://patchwork.libcamera.org/api/1.1/patches/10788/?format=json","web_url":"https://patchwork.libcamera.org/patch/10788/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20201230230603.123486-4-jacopo@jmondi.org>","date":"2020-12-30T23:06:00","name":"[libcamera-devel,v4,3/6] libcamera: camera_sensor: Cache selection targets","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"a2928802fb00227933f0547858e8919cabf78b44","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/1.1/people/3/?format=json","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/10788/mbox/","series":[{"id":1561,"url":"https://patchwork.libcamera.org/api/1.1/series/1561/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1561","date":"2020-12-30T23:05:57","name":"libcamera: camera_sensor: Make validation more strict","version":4,"mbox":"https://patchwork.libcamera.org/series/1561/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/10788/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/10788/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 11730C0F1A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 30 Dec 2020 23:05:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0053261FF3;\n\tThu, 31 Dec 2020 00:05:57 +0100 (CET)","from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3BFFD6159A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 31 Dec 2020 00:05:55 +0100 (CET)","from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id A05B8C0004;\n\tWed, 30 Dec 2020 23:05:54 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"libcamera-devel@lists.libcamera.org","Date":"Thu, 31 Dec 2020 00:06:00 +0100","Message-Id":"<20201230230603.123486-4-jacopo@jmondi.org>","X-Mailer":"git-send-email 2.29.2","In-Reply-To":"<20201230230603.123486-1-jacopo@jmondi.org>","References":"<20201230230603.123486-1-jacopo@jmondi.org>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH v4 3/6] libcamera: camera_sensor: Cache\n\tselection targets","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Support for the V4L2 selection API is currently optional in the\nCameraSensor class. Properties registered by using values read through\nthat API are defaulted in several different places (the Android camera\nHAL or the CameraSensor class).\n\nIn future support for the selection API will be made mandatory, but to\ngive time to sensor drivers in all test platforms to be updated, provide\na default for the sensor pixel array properties and cache them as\nclass member variables.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n include/libcamera/internal/camera_sensor.h |  3 ++\n src/libcamera/camera_sensor.cpp            | 61 +++++++++-------------\n 2 files changed, 28 insertions(+), 36 deletions(-)","diff":"diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h\nindex aee10aa6e3c7..86902b85ada8 100644\n--- a/include/libcamera/internal/camera_sensor.h\n+++ b/include/libcamera/internal/camera_sensor.h\n@@ -84,6 +84,9 @@ private:\n \tstd::vector<unsigned int> mbusCodes_;\n \tstd::vector<Size> sizes_;\n \n+\tSize pixelArraySize_;\n+\tRectangle activeArea_;\n+\n \tControlList properties_;\n };\n \ndiff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp\nindex 048fcd6a1fae..bf0d6b06ae20 100644\n--- a/src/libcamera/camera_sensor.cpp\n+++ b/src/libcamera/camera_sensor.cpp\n@@ -31,6 +31,9 @@ namespace libcamera {\n \n LOG_DEFINE_CATEGORY(CameraSensor)\n \n+static constexpr Size defaultPixelArraySize = { 2592, 1944 };\n+static constexpr Rectangle defaultActiveArea = { 16, 12, 2560, 1920 };\n+\n /**\n  * \\struct CameraSensorInfo\n  * \\brief Report the image sensor characteristics\n@@ -269,15 +272,22 @@ int CameraSensor::validateSensorDriver()\n \tRectangle rect;\n \tint ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_BOUNDS, &rect);\n \tif (ret) {\n+\t\trect.width = defaultPixelArraySize.width;\n+\t\trect.height = defaultPixelArraySize.height;\n \t\tLOG(CameraSensor, Warning)\n-\t\t\t<< \"Failed to retrieve the readable pixel array size\";\n+\t\t\t<< \"The PixelArraySize property has been defaulted to \"\n+\t\t\t<< rect.toString();\n \t\terr = -EINVAL;\n \t}\n+\tpixelArraySize_.width = rect.width;\n+\tpixelArraySize_.height = rect.height;\n \n-\tret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &rect);\n+\tret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &activeArea_);\n \tif (ret) {\n+\t\tactiveArea_ = defaultActiveArea;\n \t\tLOG(CameraSensor, Warning)\n-\t\t\t<< \"Failed to retrieve the active pixel array size\";\n+\t\t\t<< \"The PixelArrayActiveAreas property has been defaulted to: \"\n+\t\t\t<< activeArea_.toString();\n \t\terr = -EINVAL;\n \t}\n \n@@ -373,24 +383,8 @@ int CameraSensor::initProperties()\n \t\tpropertyValue = 0;\n \tproperties_.set(properties::Rotation, propertyValue);\n \n-\tRectangle bounds;\n-\tret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_BOUNDS, &bounds);\n-\tif (!ret)\n-\t\tproperties_.set(properties::PixelArraySize, bounds.size());\n-\n-\tRectangle crop;\n-\tret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &crop);\n-\tif (!ret) {\n-\t\t/*\n-\t\t * V4L2_SEL_TGT_CROP_DEFAULT and V4L2_SEL_TGT_CROP_BOUNDS are\n-\t\t * defined relatively to the sensor full pixel array size,\n-\t\t * while properties::PixelArrayActiveAreas is defined relatively\n-\t\t * to properties::PixelArraySize. Adjust it.\n-\t\t */\n-\t\tcrop.x -= bounds.x;\n-\t\tcrop.y -= bounds.y;\n-\t\tproperties_.set(properties::PixelArrayActiveAreas, { crop });\n-\t}\n+\tproperties_.set(properties::PixelArraySize, pixelArraySize_);\n+\tproperties_.set(properties::PixelArrayActiveAreas, { activeArea_ });\n \n \t/* Color filter array pattern, register only for RAW sensors. */\n \tfor (const auto &format : formats_) {\n@@ -646,20 +640,15 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const\n {\n \tinfo->model = model();\n \n-\t/* Get the active area size. */\n-\tRectangle rect;\n-\tint ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &rect);\n-\tif (ret) {\n-\t\tLOG(CameraSensor, Error)\n-\t\t\t<< \"Failed to construct camera sensor info: \"\n-\t\t\t<< \"the camera sensor does not report the active area\";\n-\n-\t\treturn ret;\n-\t}\n-\tinfo->activeAreaSize = { rect.width, rect.height };\n+\t/*\n+\t * The active area size is a static property, while the crop\n+\t * rectangle needs to be re-read as it depends on the sensor\n+\t * configuration.\n+\t */\n+\tinfo->activeAreaSize = { activeArea_.width, activeArea_.height };\n \n \t/* It's mandatory for the subdevice to report its crop rectangle. */\n-\tret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &info->analogCrop);\n+\tint ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &info->analogCrop);\n \tif (ret) {\n \t\tLOG(CameraSensor, Error)\n \t\t\t<< \"Failed to construct camera sensor info: \"\n@@ -672,10 +661,10 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const\n \t * are defined relatively to the active pixel area, while V4L2's\n \t * TGT_CROP target is defined in respect to the full pixel array.\n \t *\n-\t * Compensate it by subtracting the active areas offset.\n+\t * Compensate it by subtracting the active area offset.\n \t */\n-\tinfo->analogCrop.x -= rect.x;\n-\tinfo->analogCrop.y -= rect.y;\n+\tinfo->analogCrop.x -= activeArea_.x;\n+\tinfo->analogCrop.y -= activeArea_.y;\n \n \t/* The bit depth and image size depend on the currently applied format. */\n \tV4L2SubdeviceFormat format{};\n","prefixes":["libcamera-devel","v4","3/6"]}