From patchwork Fri Jun 18 16:18:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12649 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 E9EA2BD78E for ; Fri, 18 Jun 2021 16:18:16 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9087D68942; Fri, 18 Jun 2021 18:18:15 +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="VWCdEynX"; dkim-atps=neutral Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8607460298 for ; Fri, 18 Jun 2021 18:18:13 +0200 (CEST) Received: by mail-wm1-x332.google.com with SMTP id k42so4116959wms.0 for ; Fri, 18 Jun 2021 09:18:13 -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=dX7vDkJOH13e4PMs9zqtfbDImO7crkG0/86wTonUNiI=; b=VWCdEynXpS5UFLow2lvRQr9sO5c64YX/vnu8C0izIXgL3gFDP+pv9ZB/Amci7fOhE7 lbQ4/BDdMBSfeAq5kox2LV62rcaVVndSm9zMlPFVACdMYQTJE2UabS6O1c+TEnWATIIi l3ua41JplepKXA++zwZu2/m2FVSdyxODl0d4QKNZKg7tmT5vdFiO0Ufn1KQFf81QbESC Z9puk+3j/5iiXjltOLHRub8vMk7BPlUb0mEaz6nsaoBnrA4z671fWDeTOi2v1G4aoyVN nIjHCP+/ZopNK1pM/k6kfyooaWQYZOGaDRHkitb2A1bNDDNxYRon74GxYWDQq/6xnwQN Gm9Q== 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=dX7vDkJOH13e4PMs9zqtfbDImO7crkG0/86wTonUNiI=; b=DjboRjL+qJfOWueN1hsdTK5n/zGDxcPPtZrVXkFwSDIQW5cpTagfDaSp32XUgtGC4R WggDsMnPireqaE/NxFR5k8CWAxeTIWchlZJ2AqAclN0vuOLC1oWEjhTdR4H3J9g3dtDN X8dDwxtBo8G+6Dp+NH1mvfCKEcmYvQDi5vQnNFVEo4s1vOscx2Ir/uk1cAiNukFvEtRh 0qg3MUQnbTobVJCNIdAoB3JwNhGXI6zVgmlwJ/M7y/xye/LWH3SE9YlMBV9fEuwK3GBZ xhQrkvR/HTBO8kIetS8xb06btGJStKhnF4qQZAHJsBe8ss1YejGTPSRJOF7ncym7u7Dq Su/w== X-Gm-Message-State: AOAM531unL1PNEoPZuJ/CSeQMh0XnVbIwG08jz0ffEATUfG5DqoQwdKE 0kpMpbtthUpUR+4S4zcAs3N7F44zPONtSb2l X-Google-Smtp-Source: ABdhPJxbK1sr/yeUXS5Gi351SYyrw/PqhAZbydVbc+WXaz7fdP/gXH0DIhEh9U6zWuvcfwb9I0rW/Q== X-Received: by 2002:a05:600c:2150:: with SMTP id v16mr10502668wml.170.1624033093067; Fri, 18 Jun 2021 09:18:13 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id z5sm8908492wrp.92.2021.06.18.09.18.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 09:18:12 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Fri, 18 Jun 2021 17:18:05 +0100 Message-Id: <20210618161807.24242-2-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210618161807.24242-1-david.plowman@raspberrypi.com> References: <20210618161807.24242-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 --- 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..87be68f7 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 consits of a single colour channel. ... From patchwork Fri Jun 18 16:18:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12651 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 9EBABC3219 for ; Fri, 18 Jun 2021 16:18:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E457A6894C; Fri, 18 Jun 2021 18:18:15 +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="Sxx32nof"; dkim-atps=neutral Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 66ACE68941 for ; Fri, 18 Jun 2021 18:18:14 +0200 (CEST) Received: by mail-wr1-x42b.google.com with SMTP id j2so807882wrs.12 for ; Fri, 18 Jun 2021 09:18:14 -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=QVArBmBrjrypsLGJa1m5fvTRw+qpuCABtPTcmqBl12A=; b=Sxx32nofExNzHAO/sOzvl3bvOqeoNalp3aMai1nJpn36snprfVDz677miptn6xarRL wH9yciEPzRXR8/+aQFVe4deV9gPlj9wS7kod8sYQ0G9ppeW5mpf+x/Pr9WjRcI3i1GA5 Cy+BJ8VxXdLsLlM/icxmg7eKmccHGVrpETn/OcQ+M4igKu9rVj6izRMJVLIDH66Txasc daItJ31x28vKeOlbRHjiFEdT8Xb0IXqGmwW2LlF74CO2bTs3i10T5zGMOEIN5V2PMJZR N1JWct4Kk9cktWZFvg8at+qURYybPFPkDE7Fl0b226wR540Z7C87gCBcOhSjjYc/3YRI OhZA== 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=QVArBmBrjrypsLGJa1m5fvTRw+qpuCABtPTcmqBl12A=; b=cTkSdNlC7ETC1OKeXeeqM1hZUDr+K5NNWEFRMVFj9cjHxiJXt8tDO5C9m1CtNLicdS p86pr2j8Xq/GtBZ4K0eBteZ7055zOwsEqo+JlXTDK1s+U6lYL8jhtv1X7ft9sfhsgRgl xhSipktgCjX40npTyL2CstHqfn+78X9fLzT24o2xMjKMhoxK086TFxWDQYDV/1WPuF1N lnf6JetiwVSqg30v75Vb6sz0utJYb+X09C3nc6oMl+aB2KPsbg5W1EHwcsqQFJQmsrzw itJMAxQIgBE7VSX81SmQ9+IqPOjpcY9amknAsj0bvtD4ZMaWaPvkqK5Jvmo2lakFII0R ptwg== X-Gm-Message-State: AOAM531Smx8KkJYk/Z8iaQQdZznhnd74PcuZLN/kICDK6W54/I4iCl92 JLff7dTu8KB8V8jfuz1Q55yuWNZt8NifNH0N X-Google-Smtp-Source: ABdhPJxiB4y9zbs1b0eHKp7BrOBFj8WaSRdX16WMZnTj8INISPAoQHwQxHcldFbeJCeEq/ENQvpdEw== X-Received: by 2002:a05:6000:1084:: with SMTP id y4mr12159565wrw.173.1624033093979; Fri, 18 Jun 2021 09:18:13 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id z5sm8908492wrp.92.2021.06.18.09.18.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 09:18:13 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Fri, 18 Jun 2021 17:18:06 +0100 Message-Id: <20210618161807.24242-3-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210618161807.24242-1-david.plowman@raspberrypi.com> References: <20210618161807.24242-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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: Kieran Bingham --- src/ipa/raspberrypi/controller/rpi/agc.cpp | 2 +- src/ipa/raspberrypi/controller/rpi/alsc.cpp | 2 +- 2 files changed, 2 insertions(+), 2 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..c58ef7d0 100644 --- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp +++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp @@ -267,7 +267,7 @@ 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 " + LOG(RPiAlsc, Debug) << "no AWB results found, using " << awb_status.temperature_K; else LOG(RPiAlsc, Debug) << "AWB results found, using " From patchwork Fri Jun 18 16:18:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12650 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 D22A5BD78E for ; Fri, 18 Jun 2021 16:18:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 34B2B6894A; Fri, 18 Jun 2021 18:18:17 +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="Vibopeq8"; dkim-atps=neutral Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2F6AC68947 for ; Fri, 18 Jun 2021 18:18:15 +0200 (CEST) Received: by mail-wr1-x42a.google.com with SMTP id a11so11370167wrt.13 for ; Fri, 18 Jun 2021 09:18:15 -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=rD2fOE2ZAq2xWCGOAoFE7nsUFVoRUOuwB3DfHfo7qIg=; b=Vibopeq8h4Zkj/GWuLVsgcdhxZrGtCvJU0SlvnjkM0ERYxhfgEZDfL5NJLBlSvaCs4 2gYAa7DKbzxLmYNVU+h+ehJQAnwO097voduAlQ5i3cfpi2UMjOepQWZNKwhZ/DWHsmPw 9B9V1VM1A09Oq8Lg2UZ1nkyQRI6IHnPIbm976G0oCZqpKePyEkGKh/Mo0PrRfcXzrDmG 4MLCN+bCSv2/w2m4rp8FdX8jDfan2idAuj4wjskgkz6iCFwsR6XlaufrTIsmr5pYey/n XbjEunoapr0CCvcEME90R14vWCWoD84/M7DD7b2dnC80wVvZwC/wLenF/qbbFHuhKe4v CRpw== 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=rD2fOE2ZAq2xWCGOAoFE7nsUFVoRUOuwB3DfHfo7qIg=; b=ejlC3uHnrPtoFR4YRORH/QP4zF/vxhthk57LhYATZ7Q+Kt/xilpSbFM48L36stvEa8 WXTQvgS+lHGwCMgMKhsZ2y6Qm5KhwW/KfLVchtYzK7vPlI/2sWzyOqALEyu/Bax2FY7D hEbMnTx2o6HYGpG7rAxoqyr2hRpd0XtozVi3iZXuKz8AD6215jMX5wj3pC47TAkztaJj p9W6hw9PRbn1GddajeCsKPrFReJybCS9v7QizWVp2JksrmD3CsonaWcNoA3jilUcnH0P /2lQ4Ah2gafDA8CRbq1UYo1Dq1eMeWdRMvNEj9aQGHxnnjAotUUOu2AWX6MgsjVSoT1C 7fGQ== X-Gm-Message-State: AOAM532RpK/WVEuo88pjouc2qOtwdMYiFmFRZdQFBbYjQbD/sVD83DMV ajTbrq7diwcT6U7BH1U7L1dvIHT5dDby6W5k X-Google-Smtp-Source: ABdhPJyC1eiu1Ny6fr9XtUoqc+AnCaQ/2pfbTTIcLE2s1m65Us5vC6CKjV17xrGns+RpjxfsDDkc9w== X-Received: by 2002:a5d:6646:: with SMTP id f6mr13399404wrw.399.1624033094560; Fri, 18 Jun 2021 09:18:14 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id z5sm8908492wrp.92.2021.06.18.09.18.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 09:18:14 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Fri, 18 Jun 2021 17:18:07 +0100 Message-Id: <20210618161807.24242-4-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210618161807.24242-1-david.plowman@raspberrypi.com> References: <20210618161807.24242-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 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 (which the driver names as the "mov9281"). 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 --- src/ipa/raspberrypi/cam_helper_mov9281.cpp | 65 +++++++++++++++ src/ipa/raspberrypi/data/meson.build | 1 + src/ipa/raspberrypi/data/mov9281.json | 92 ++++++++++++++++++++++ src/ipa/raspberrypi/meson.build | 1 + 4 files changed, 159 insertions(+) create mode 100644 src/ipa/raspberrypi/cam_helper_mov9281.cpp create mode 100644 src/ipa/raspberrypi/data/mov9281.json diff --git a/src/ipa/raspberrypi/cam_helper_mov9281.cpp b/src/ipa/raspberrypi/cam_helper_mov9281.cpp new file mode 100644 index 00000000..29519cb0 --- /dev/null +++ b/src/ipa/raspberrypi/cam_helper_mov9281.cpp @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2021, Raspberry Pi (Trading) Limited + * + * cam_helper_mov9281.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("mov9281", &Create); diff --git a/src/ipa/raspberrypi/data/meson.build b/src/ipa/raspberrypi/data/meson.build index 92ad3272..f8baab6d 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', + 'mov9281.json', 'ov5647.json', 'se327m12.json', 'uncalibrated.json', diff --git a/src/ipa/raspberrypi/data/mov9281.json b/src/ipa/raspberrypi/data/mov9281.json new file mode 100644 index 00000000..ecd262be --- /dev/null +++ b/src/ipa/raspberrypi/data/mov9281.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..93f04e9e 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_mov9281.cpp', 'controller/controller.cpp', 'controller/histogram.cpp', 'controller/algorithm.cpp',