From patchwork Mon Jun 28 12:23:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12724 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 AC0BCC3220 for ; Mon, 28 Jun 2021 12:23:30 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 10119684DF; Mon, 28 Jun 2021 14:23:29 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="P0Fr1Zp8"; dkim-atps=neutral Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E9D86684D3 for ; Mon, 28 Jun 2021 14:23:26 +0200 (CEST) Received: by mail-wm1-x333.google.com with SMTP id u20so6143069wmq.4 for ; Mon, 28 Jun 2021 05:23:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dQUAlMqJR8YJ6M8zpXZBuaYmsqRmi0LWRoG1purqV1s=; b=P0Fr1Zp83yvRnS+bgjZUdi9yu5SkC6kdQsDlNSU60KEDn1sN4z1vh9hG4LO1My40hl r8dQoH3mJVEYt7L8Z5oX5H0cvVeTsSs5jWX78F1rqTXPyg6fBZKeUm38ZMVfDnWFraHJ QyvwM0KuzEAVGWBH6cTtOslJK6KOgPFBmL36eTfoKuZnh1Ok1D9ltNXOmx+neuxykuKp FgnVUx1JcJgQWvDAfQTIhOaP+GjDT3wQ4xdIUK0T+TMsVIY5GjoUBfGAgW/n6KeADz6w qH0f9SD1s1dMpywSjTMcWGVINa67mFPt7M6looS2pPLcuoLUWoSdKrjMamctwlW/nKqt cT0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dQUAlMqJR8YJ6M8zpXZBuaYmsqRmi0LWRoG1purqV1s=; b=o3K3INxLPootcevKyO76VTCRqwpuPvhy5XZOEKhOmlo0GcHSVKoGoCS1ePqrYQuFCf bNr25mPfQ9yN/XnNcQ/BPidS4gnJHQd0900x6kBEs4s2weF441y6qziAW0EpoPAdoKhv VFjkU3qaX/tTjWkwUXGxsBIj5eU8D2f9nZA2a6YG7PH8mTiu5d4E1W8Sq4ej87TZVDZ2 dgS9VyES9xjLGQE7w7GsvrA6gQNKas9EySK7qdywRgN4vIx5BKiPAr6CPmt5MvowDV0+ dQ3WtLy7W2vCwNGVhYuWO/RF1toZVrYZVJP3tbrDSfMczA5KX5xHiOib+ALUiuG+ZA2e H3pg== X-Gm-Message-State: AOAM530yNlEIGkBjOrJTPUpd45ySgJyDS0ARBJWjf9blC8kDi1SncXw0 kTO4k/27cF++dVzS+uvZ8bebaoxe2ovqMw== X-Google-Smtp-Source: ABdhPJzTZ7pCqJg+mWkihK0R+GcGKNnYFZ5/dz7mKVGFsbBnn0PFzr3Kd8JFkzVoki28di6e8SQwAA== X-Received: by 2002:a05:600c:2248:: with SMTP id a8mr5330108wmm.188.1624883006493; Mon, 28 Jun 2021 05:23:26 -0700 (PDT) Received: from pi4-davidp.pitowers.org ([2a00:1098:3142:14:1ce1:9965:4328:89c4]) by smtp.gmail.com with ESMTPSA id s62sm19606542wms.13.2021.06.28.05.23.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 05:23:26 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Mon, 28 Jun 2021 13:23:22 +0100 Message-Id: <20210628122324.14541-2-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210628122324.14541-1-david.plowman@raspberrypi.com> References: <20210628122324.14541-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 1/3] libcamera: Add support for monochrome sensors 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" This commit adds support for monochrome (greyscale) raw sensors. These are sensors that have no colour filter array, so all pixels are the same and there are no distinct colour channels. These sensors still require many of an ISP's processing stages, such as denoise, tone mapping, but not those that involve colours (such as demosaic, or colour matrices). Signed-off-by: David Plowman Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- include/libcamera/internal/bayer_format.h | 3 ++- src/libcamera/bayer_format.cpp | 14 ++++++++++++-- src/libcamera/camera_sensor.cpp | 3 +++ src/libcamera/property_ids.yaml | 4 ++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h index 5b8c1dc9..723382d4 100644 --- a/include/libcamera/internal/bayer_format.h +++ b/include/libcamera/internal/bayer_format.h @@ -23,7 +23,8 @@ public: BGGR = 0, GBRG = 1, GRBG = 2, - RGGB = 3 + RGGB = 3, + MONO = 4 }; enum Packing : uint16_t { diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp index ed61202c..11355f14 100644 --- a/src/libcamera/bayer_format.cpp +++ b/src/libcamera/bayer_format.cpp @@ -45,6 +45,8 @@ namespace libcamera { * \brief G then R on the first row, B then G on the second row. * \var BayerFormat::RGGB * \brief R then G on the first row, G then B on the second row. + * \var BayerFormat::MONO + * \brief Monochrome image data, there is no colour filter array. */ /** @@ -111,6 +113,8 @@ const std::map bayerToV4l2{ { { BayerFormat::GBRG, 16, BayerFormat::None }, V4L2PixelFormat(V4L2_PIX_FMT_SGBRG16) }, { { BayerFormat::GRBG, 16, BayerFormat::None }, V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16) }, { { BayerFormat::RGGB, 16, BayerFormat::None }, V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16) }, + { { BayerFormat::MONO, 8, BayerFormat::None }, V4L2PixelFormat(V4L2_PIX_FMT_GREY) }, + { { BayerFormat::MONO, 10, BayerFormat::CSI2Packed }, V4L2PixelFormat(V4L2_PIX_FMT_Y10P) }, }; const std::unordered_map mbusCodeToBayer{ @@ -146,6 +150,8 @@ const std::unordered_map mbusCodeToBayer{ { MEDIA_BUS_FMT_SGBRG16_1X16, { BayerFormat::GBRG, 16, BayerFormat::None } }, { MEDIA_BUS_FMT_SGRBG16_1X16, { BayerFormat::GRBG, 16, BayerFormat::None } }, { MEDIA_BUS_FMT_SRGGB16_1X16, { BayerFormat::RGGB, 16, BayerFormat::None } }, + { MEDIA_BUS_FMT_Y8_1X8, { BayerFormat::MONO, 8, BayerFormat::None } }, + { MEDIA_BUS_FMT_Y10_1X10, { BayerFormat::MONO, 10, BayerFormat::None } }, }; } /* namespace */ @@ -198,9 +204,10 @@ std::string BayerFormat::toString() const "BGGR", "GBRG", "GRBG", - "RGGB" + "RGGB", + "MONO" }; - if (isValid() && order <= RGGB) + if (isValid() && order <= MONO) result = orderStrings[order]; else return "INVALID"; @@ -280,6 +287,9 @@ BayerFormat BayerFormat::transform(Transform t) const { BayerFormat result = *this; + if (order == MONO) + return result; + /* * Observe that flipping bit 0 of the Order enum performs a horizontal * mirror on the Bayer pattern (e.g. RGGB goes to GRBG). Similarly, diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index 3e135353..fb67c15a 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -427,6 +427,9 @@ int CameraSensor::initProperties() case BayerFormat::RGGB: cfa = properties::draft::RGGB; break; + case BayerFormat::MONO: + cfa = properties::draft::MONO; + break; } properties_.set(properties::draft::ColorFilterArrangement, cfa); diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml index 104e9aaf..12ecbce5 100644 --- a/src/libcamera/property_ids.yaml +++ b/src/libcamera/property_ids.yaml @@ -706,5 +706,9 @@ controls: description: | Sensor is not Bayer; output has 3 16-bit values for each pixel, instead of just 1 16-bit value per pixel. + - name: MONO + value: 5 + description: | + Sensor is not Bayer; output consists of a single colour channel. ... From patchwork Mon Jun 28 12:23:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12725 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 870EBC3220 for ; Mon, 28 Jun 2021 12:23:31 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 10087684D6; Mon, 28 Jun 2021 14:23:30 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="aojMhd0i"; dkim-atps=neutral Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 99876684D3 for ; Mon, 28 Jun 2021 14:23:27 +0200 (CEST) Received: by mail-wm1-x333.google.com with SMTP id o33-20020a05600c5121b02901e360c98c08so11862524wms.5 for ; Mon, 28 Jun 2021 05:23:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=E9nCDyDkwew2QWgv+wjfgUYgt/K9qJddnw+iPJh6jz8=; b=aojMhd0i21Fi7CHeq+qaceC+y5N6HPBE+6vHsPs9gWeBbNvok+nYSorO+HVFd0KAol S8OwglgcPBLKxoS/U2eUzhMBocguZsQbUNcOv2Kfi/K903OHTXcBPL2kmEc2xnMtVsNn 7gaZdO9WSp7qSti1TkjsT6vRU7xwKexkRKulpkCr/7udCUJGirOB4f87r5IDPj6ho1q2 YfH2ptjqlRnzfzh+SCWXKgEPablyVn03l4Un+udqV5vbhumNX1NKeOOxiWwRE7XHbSm5 rgUk4JOn779xX8+G7jSmhv2vk1tNW556rC+bKY5yUA1p7Gbo5fxPJ1hDE46W5VqLbtJv mZgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=E9nCDyDkwew2QWgv+wjfgUYgt/K9qJddnw+iPJh6jz8=; b=WXD6ZnWjK0BReSj9/+5BTaYXwtkfuHISn85Z+I0yJL2cfHC2C+okndkjjsVm5Ry49w tS0uiixgUOeKxsWifxAAU2sj49j+ZXxDdz9JEhBv2z1hDZRpPIIOS4tAhw1VOAKRxIb3 c/krXvDmU1rLZXrzA4MXeTHUUmZfq1Mr9DHv4hkl6aYTkHg5z4cdx53a1NPKqD04j4ms 2Im1t4f5mrmoMHh4CUxFt+tT8qd+aV0DQMQHYxTaBLjDTZgQFlYs+NDTwNkYy9s6CD0B Oma4YmLvFZBeJLKhTZwefuK6aBlJ0rnSSOw4JVGeG+z+U+v7IJyBZduq4AtkJyo5Pdf/ BIoA== X-Gm-Message-State: AOAM531+yylGYl2NjomHdRXiKKwBs99GV8n6ceBFusGmglttGDj/MukY JMo7lOILD4yMLEGXLtii+BJOf3D+ekXhZg== X-Google-Smtp-Source: ABdhPJx443yqzdVg7CdNhwVIHRNPJu0ahteDp3Ba60sNd/LQujPrAQhrsNfOI9MlOKR26oYP3USXmA== X-Received: by 2002:a05:600c:3502:: with SMTP id h2mr23683974wmq.68.1624883007121; Mon, 28 Jun 2021 05:23:27 -0700 (PDT) Received: from pi4-davidp.pitowers.org ([2a00:1098:3142:14:1ce1:9965:4328:89c4]) by smtp.gmail.com with ESMTPSA id s62sm19606542wms.13.2021.06.28.05.23.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 05:23:26 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Mon, 28 Jun 2021 13:23:23 +0100 Message-Id: <20210628122324.14541-3-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210628122324.14541-1-david.plowman@raspberrypi.com> References: <20210628122324.14541-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 2/3] libcamera: ipa: raspberrypi: Demote warnings about lack of AWB results 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" Warnings about the lack of AWB status results are demoted to being just "Debug". With monochrome sensors becoming more common this would otherwise overwhelm the console output, and in practice nothing is really lost as it is normally very evident if AWB is failing to run. Signed-off-by: David Plowman Reviewed-by: Naushir Patuck Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/ipa/raspberrypi/controller/rpi/agc.cpp | 2 +- src/ipa/raspberrypi/controller/rpi/alsc.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp index 55e80ac7..2c95f287 100644 --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp @@ -481,7 +481,7 @@ void Agc::fetchAwbStatus(Metadata *image_metadata) awb_.gain_g = 1.0; awb_.gain_b = 1.0; if (image_metadata->Get("awb.status", awb_) != 0) - LOG(RPiAgc, Warning) << "Agc: no AWB status found"; + LOG(RPiAgc, Debug) << "Agc: no AWB status found"; } static double compute_initial_Y(bcm2835_isp_stats *stats, AwbStatus const &awb, diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp index b0d24aa2..ef99c1b0 100644 --- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp +++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp @@ -267,8 +267,8 @@ double get_ct(Metadata *metadata, double default_ct) AwbStatus awb_status; awb_status.temperature_K = default_ct; // in case nothing found if (metadata->Get("awb.status", awb_status) != 0) - LOG(RPiAlsc, Warning) << "no AWB results found, using " - << awb_status.temperature_K; + LOG(RPiAlsc, Debug) << "no AWB results found, using " + << awb_status.temperature_K; else LOG(RPiAlsc, Debug) << "AWB results found, using " << awb_status.temperature_K; From patchwork Mon Jun 28 12:23:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12726 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 2B5ADC3220 for ; Mon, 28 Jun 2021 12:23:32 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E1A3B684D9; Mon, 28 Jun 2021 14:23:31 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="XYbTlbAA"; dkim-atps=neutral Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2B2A1684D6 for ; Mon, 28 Jun 2021 14:23:28 +0200 (CEST) Received: by mail-wm1-x32e.google.com with SMTP id v20-20020a05600c2154b02901dcefb16af0so11035937wml.5 for ; Mon, 28 Jun 2021 05:23:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=cI1Bogz/D11yXqXoXsnxUcCBS7ZdZXJpXnGGD6l2Ekk=; b=XYbTlbAA7zuVLJLSGbk85QaxOL1QVOszocd6TbZaqFRk970jwI1kLrkBUl5MN8dGJA 8tfhJ2mXcvPkYU6kc/21jA5mB/8VZY0N6U7eBkSB1nqxv54fvTW1+nPunOPAMPUbms1i dghi1rDpWgclX+iTAVVgF5yPDFV2kju48rbQ3eoICthrSnHn2eD/IwyfihknW0BHOJ1V iHviEPdiPKcOixibb/62GOFMEeMXPrlQrZreV0k6mKQNwRhrgNPjTYdebeaNGOYsfp5j Rme5RagR67wWWsRC8Jqc+aNPpg4pYSl59KpXBBccnAAy3pU9Bq6tZJVNVMAa6exXVpv2 9Yrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cI1Bogz/D11yXqXoXsnxUcCBS7ZdZXJpXnGGD6l2Ekk=; b=mT8lgtf7wrLCvenH7u2R+/lVldtSg+kBqVsMo/UhL52Yum2smvtsTpcg7RW/HrSt+q 49NuJooPdyhU04w2exYFc7TkNtLBib4X071iGzOX52Ku9BSF0L/S6+UOEqmlnIbP6pJs GtOqSMNMToiYj3Gk4G61jByfpe4rLpVt70bE6CdwWf+0zCRqagFVEkfbHQz283UEwozC QELY58VpSotKQ9JgnOcvW+P21X7Yx08rrPFg1QeDgaF4tIMxeX5yPXAUEqDSSdMTup6E 173hACs+usXP23qdwPNCBRODWKmBpCSskHGH/GBtCf5tkG2huUpGP2c2ClpUAQ4WyzdY B/+w== X-Gm-Message-State: AOAM531oP0T0bdY3pnszKxlHRU5MhdYA6BAXwYO/i3vIBoW9Cg3CJohl SUt1z/0raicMBnJN+u+tCNY5ASnlA5qneA== X-Google-Smtp-Source: ABdhPJxaY+GBy/0/wN8u6hniFGKql8z1A5WdgMnuoYzMGp3iE20VkZXcvnO/xejgd1qzoxPlpFX1gQ== X-Received: by 2002:a7b:cb03:: with SMTP id u3mr26866640wmj.119.1624883007696; Mon, 28 Jun 2021 05:23:27 -0700 (PDT) Received: from pi4-davidp.pitowers.org ([2a00:1098:3142:14:1ce1:9965:4328:89c4]) by smtp.gmail.com with ESMTPSA id s62sm19606542wms.13.2021.06.28.05.23.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 05:23:27 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Mon, 28 Jun 2021 13:23:24 +0100 Message-Id: <20210628122324.14541-4-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210628122324.14541-1-david.plowman@raspberrypi.com> References: <20210628122324.14541-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 3/3] libcamera: ipa: raspberrypi: Add support for ov9281 sensor 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" The necessary tuning file and CamHelper is added for the ov9281 sensor. The ov9281 is a 1280x800 monochrome global shutter sensor. To enable it, please add dtoverlay=ov9281 to the /boot/config.txt file and reboot the Pi. Signed-off-by: David Plowman Reviewed-by: Naushir Patuck Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/ipa/raspberrypi/cam_helper_ov9281.cpp | 65 ++++++++++++++++ src/ipa/raspberrypi/data/meson.build | 1 + src/ipa/raspberrypi/data/ov9281.json | 92 +++++++++++++++++++++++ src/ipa/raspberrypi/meson.build | 1 + 4 files changed, 159 insertions(+) create mode 100644 src/ipa/raspberrypi/cam_helper_ov9281.cpp create mode 100644 src/ipa/raspberrypi/data/ov9281.json diff --git a/src/ipa/raspberrypi/cam_helper_ov9281.cpp b/src/ipa/raspberrypi/cam_helper_ov9281.cpp new file mode 100644 index 00000000..54091f83 --- /dev/null +++ b/src/ipa/raspberrypi/cam_helper_ov9281.cpp @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2021, Raspberry Pi (Trading) Limited + * + * cam_helper_ov9281.cpp - camera information for ov9281 sensor + */ + +#include + +#include "cam_helper.hpp" + +using namespace RPiController; + +class CamHelperOv9281 : public CamHelper +{ +public: + CamHelperOv9281(); + uint32_t GainCode(double gain) const override; + double Gain(uint32_t gain_code) const override; + void GetDelays(int &exposure_delay, int &gain_delay, + int &vblank_delay) const override; + +private: + /* + * Smallest difference between the frame length and integration time, + * in units of lines. + */ + static constexpr int frameIntegrationDiff = 4; +}; + +/* + * OV9281 doesn't output metadata, so we have to use the "unicam parser" which + * works by counting frames. + */ + +CamHelperOv9281::CamHelperOv9281() + : CamHelper(nullptr, frameIntegrationDiff) +{ +} + +uint32_t CamHelperOv9281::GainCode(double gain) const +{ + return static_cast(gain * 16.0); +} + +double CamHelperOv9281::Gain(uint32_t gain_code) const +{ + return static_cast(gain_code) / 16.0; +} + +void CamHelperOv9281::GetDelays(int &exposure_delay, int &gain_delay, + int &vblank_delay) const +{ + /* The driver appears to behave as follows: */ + exposure_delay = 2; + gain_delay = 2; + vblank_delay = 2; +} + +static CamHelper *Create() +{ + return new CamHelperOv9281(); +} + +static RegisterCamHelper reg("ov9281", &Create); diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build index 92ad3272..adf89dbd 100644 --- a/src/ipa/raspberrypi/data/meson.build +++ b/src/ipa/raspberrypi/data/meson.build @@ -4,6 +4,7 @@ conf_files = files([ 'imx219.json', 'imx290.json', 'imx477.json', + 'ov9281.json', 'ov5647.json', 'se327m12.json', 'uncalibrated.json', diff --git a/src/ipa/raspberrypi/data/ov9281.json b/src/ipa/raspberrypi/data/ov9281.json new file mode 100644 index 00000000..ecd262be --- /dev/null +++ b/src/ipa/raspberrypi/data/ov9281.json @@ -0,0 +1,92 @@ +{ + "rpi.black_level": + { + "black_level": 4096 + }, + "rpi.lux": + { + "reference_shutter_speed": 2000, + "reference_gain": 1.0, + "reference_aperture": 1.0, + "reference_lux": 800, + "reference_Y": 20000 + }, + "rpi.noise": + { + "reference_constant": 0, + "reference_slope": 2.5 + }, + "rpi.sdn": + { + }, + "rpi.agc": + { + "metering_modes": + { + "centre-weighted": { + "weights": [4, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0] + } + }, + "exposure_modes": + { + "normal": + { + "shutter": [ 100, 15000, 30000, 60000, 120000 ], + "gain": [ 1.0, 2.0, 3.0, 4.0, 6.0 ] + } + }, + "constraint_modes": + { + "normal": + [ + { "bound": "LOWER", "q_lo": 0.98, "q_hi": 1.0, "y_target": [ 0, 0.4, 1000, 0.4 ] } + ] + }, + "y_target": [ 0, 0.16, 1000, 0.165, 10000, 0.17 ] + }, + "rpi.alsc": + { + "n_iter": 0, + "luminance_strength": 1.0, + "corner_strength": 1.5 + }, + "rpi.contrast": + { + "ce_enable": 0, + "gamma_curve": [ + 0, 0, + 1024, 5040, + 2048, 9338, + 3072, 12356, + 4096, 15312, + 5120, 18051, + 6144, 20790, + 7168, 23193, + 8192, 25744, + 9216, 27942, + 10240, 30035, + 11264, 32005, + 12288, 33975, + 13312, 35815, + 14336, 37600, + 15360, 39168, + 16384, 40642, + 18432, 43379, + 20480, 45749, + 22528, 47753, + 24576, 49621, + 26624, 51253, + 28672, 52698, + 30720, 53796, + 32768, 54876, + 36864, 57012, + 40960, 58656, + 45056, 59954, + 49152, 61183, + 53248, 62355, + 57344, 63419, + 61440, 64476, + 65535, 65535 + ] + } +} diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build index 230356d3..714ac27e 100644 --- a/src/ipa/raspberrypi/meson.build +++ b/src/ipa/raspberrypi/meson.build @@ -22,6 +22,7 @@ rpi_ipa_sources = files([ 'cam_helper_imx219.cpp', 'cam_helper_imx290.cpp', 'cam_helper_imx477.cpp', + 'cam_helper_ov9281.cpp', 'controller/controller.cpp', 'controller/histogram.cpp', 'controller/algorithm.cpp',