From patchwork Fri Jun 18 22:04:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12656 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 0D9BEC3218 for ; Fri, 18 Jun 2021 22:04:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 14FD868948; Sat, 19 Jun 2021 00:04:36 +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="nzf8YnIU"; dkim-atps=neutral Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 00A3E6050D for ; Sat, 19 Jun 2021 00:04:34 +0200 (CEST) Received: by mail-wm1-x330.google.com with SMTP id l9so6472302wms.1 for ; Fri, 18 Jun 2021 15:04:33 -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=Hj6B0uf2+XfEkXDYnx6lc1j20xQ5DPDqDQm8tdePJ70=; b=nzf8YnIUqQmgtPAzAHNwl39UKcFkwKV94Og69eXmYEU8hebg54oYihKIeA++gbd8sX G71g/HPNwRKcY/6kwT9BZdesYoNwFJ6m73LoQalv3CrjWS+5Pggz9l+Tq4Wo/x8r9QOU R7B/OTi9i7wTaTTTbz5pKPGERSIcxbiUGAo3/hsIHrGIHkt39FIu8IT5Hmky5AhfRtIw HiLDMEiS12fUTOU+hwrb8Q5B66AILtp9ukd7fMt/sgPazZjdd2Lvix77Q0sMXVc8Km20 dcXRFy3cK5gaCDQK8jGpXD82Zbi1eft6xv1K2fEbmFdv+JkzoYEorIThdjPgraqBWsfe EbVA== 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=Hj6B0uf2+XfEkXDYnx6lc1j20xQ5DPDqDQm8tdePJ70=; b=JiCUHj7qv6os9LR/we6nYNDYxLW+Rn2QwH57ylH7u292tgyCMbN1w9hfY5hWfYUEcg Mf4BSMXyKGggBQyBfG1vxlgDjLjvpNBvNvcVnSmoIZU5Vld6csmL1HHqJEeT6yxUS/N/ NEvox7vY1q3U8TOV+8Z3qTfkE+Be+m/qcoV0abr5osqImZHqGevzRf2pLHQaUZXPHqqe 8Z+bow69/tJN6GNrptGFK4wzUhmYejA0qJoPPfMzi7HHlqJ1aowvs9x/QNbX+q/l82mf wIINkO4tYCSHYI7j6MoopFzVQffhaUV12Liwzd5hvvML7jvsHCujRtahb5CGvuWusQbo 3jug== X-Gm-Message-State: AOAM530jzUU8cCbqm2hv4qU1jC+l0RyppMwCljEMo7Ntcp7q7+ZO7lFX tN8+Xt4m86jWhFCFQGFtIQ73TDIIhCInYthQ X-Google-Smtp-Source: ABdhPJyT4Kzxt37LuboXd7PH5W2FfJTl9BQWd+Kz9OMoWHxQ8xH0ifWJtozh19Hefo7D9EZBrrKqzg== X-Received: by 2002:a1c:ed14:: with SMTP id l20mr13491892wmh.20.1624053873449; Fri, 18 Jun 2021 15:04:33 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id z6sm6966322wrl.15.2021.06.18.15.04.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 15:04:32 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Fri, 18 Jun 2021 23:04:28 +0100 Message-Id: <20210618220430.31457-2-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210618220430.31457-1-david.plowman@raspberrypi.com> References: <20210618220430.31457-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 Fri Jun 18 22:04:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12658 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 CEF34C3218 for ; Fri, 18 Jun 2021 22:04:39 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id BC9B968945; Sat, 19 Jun 2021 00:04:37 +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="PknzAU9T"; dkim-atps=neutral Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9405E68941 for ; Sat, 19 Jun 2021 00:04:34 +0200 (CEST) Received: by mail-wm1-x32c.google.com with SMTP id k42so4579537wms.0 for ; Fri, 18 Jun 2021 15:04:34 -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=Hcf9ofbdLPIh6tqcosN/IW8wPf9ss9qQbmBmaZ6sQUc=; b=PknzAU9T870XozakSQzOLtPq838TMNSYc2yLkhjFW9N+RcM40tMw6tWIlpz0yl0ZXY h+oIIHtNcl00gEyp2g3aRlDQDlB90M8xslL9cN8uahqZmP9uwW09sn6wTos1j+DUBFkT B98hLPkfGdd9HXYuM7yor5IGAO9FFQrCPwaWNlAz7sVteRTre2/tAl8kQHSe47jAbmvw JpesjTdB7mVpbNz1vlu0KZs/82weZDXRTnbpKaHdV5pbe9bo9mz1X8nysYoZlZo86OyX 7nWyO1SjiCwMz6Z9EHIDpU6C/JC4HjMawhIYNdGLc9znME7QpeKvyNTHqiL7wc5S56qj DJ3Q== 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=Hcf9ofbdLPIh6tqcosN/IW8wPf9ss9qQbmBmaZ6sQUc=; b=Jd2V/dapANJncV0N1WKt2oCtH4+Y4MoSWv9Oshx+71r4KH/G5o5Uc7I2+if/gcopys B8pxdKhB1JsKrsZYUFvz9rQMiGZ3h0sxM5kdehEfQvzewZnw0VksdAarfDP7cq60O5Nk UefXy/1JjAimNhngwDjqn+LW5MYOw8xAxKn04brVlo2c0aQtgv4ZN5H4tacSBy7d2251 9nWtIsyaTHY07tSjzt3UD7Dw4Tzdo9xzzJ8Wxp0T0nnqr6x0yIVFCpJ9dku5fE8Ov6ZE daHS+q2miARuIaLh8ylswOyFfs6Oh0yXVcw9/NpcHjlR0eNX2vGw93p2BNjjFpzArwlP AkpQ== X-Gm-Message-State: AOAM531MIi8N1wpepfdoM0/qK+LnK3zIBRD0hTQqFOxx/FEBXZrtPI6s aTK6EXVD/oxVSXem7Tfs8YjRvbZrurGGM2HR X-Google-Smtp-Source: ABdhPJy5SPpics3ay1EjhF+SS/LA079OAMNHEouQAc8VlmhD3ROoHP4kcT8lKj2reL+WAGXxj43vng== X-Received: by 2002:a1c:7c19:: with SMTP id x25mr7236139wmc.99.1624053874144; Fri, 18 Jun 2021 15:04:34 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id z6sm6966322wrl.15.2021.06.18.15.04.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 15:04:33 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Fri, 18 Jun 2021 23:04:29 +0100 Message-Id: <20210618220430.31457-3-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210618220430.31457-1-david.plowman@raspberrypi.com> References: <20210618220430.31457-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 Fri Jun 18 22:04:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 12659 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 B8508C3218 for ; Fri, 18 Jun 2021 22:04:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C3FC66894E; Sat, 19 Jun 2021 00:04:39 +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="IEBwXe//"; dkim-atps=neutral Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8785F68947 for ; Sat, 19 Jun 2021 00:04:35 +0200 (CEST) Received: by mail-wr1-x431.google.com with SMTP id m18so12276226wrv.2 for ; Fri, 18 Jun 2021 15:04:35 -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=6TGYeinK5u1yh1QsS2F056A7jIP5g12wIbkJ8+fEVfw=; b=IEBwXe//J3qsKqBtu9nggVwruAiwImycFYPkSGQsSp33x8TaRn5qmwqrBQ1DDGYt5c ATikfQbd990lqO+HIz9FTk7NyJfy9Zpk0Bv6AIoKn3mQ7ebZTkceQwjie9CTVMnRO0kk mIzLpj8SB+bphyVn/Z5npMNsuCkYnDFeOKonLQaEaJWIsDUp9iW6s2EpJebr6rNriX75 YWQKj8QEFgY3KcWpgYz6uaEQmJDsWCPrjMnT55Wo956ZC0c6ocMHgGgnfXSNjgp2O5GZ 341Eh94qdD5juooAa9CRiU79kdYSy+BsNxOphDuWrPQGw77vFXUAzgwxCI+hK53lHCav pEmA== 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=6TGYeinK5u1yh1QsS2F056A7jIP5g12wIbkJ8+fEVfw=; b=ktqp1m67jbptyYfYYzGVDt4brAUx7GRs1oiiVDH6hRqYSZwbSTH0EPjOfylIde+/u3 Uw1Gikdt4tXxqgs07dLaVGk7ojDsQalmxRYrwZZ2CtRSNxwpqN+Dd/8hUMBDEf+mXyz1 80iNhN63AZhbEI1Wcz7hTsQBwWQkUfYrlqvaWlFx286I60F+B1er8cTgL+jN8JLZULyr Isgp8+Dvo13J51JiJbJ0U04YxPc5gL064yNLI18BPJsAMuso/Us2UnQ545utKWFn6h2T VDPV5QbNQTOX+dlk5xPFwIRn2g6qcM5pgAqYdZqp0v/pS+7ezlxNIdHS8FuXIk9vC0QC Wc4Q== X-Gm-Message-State: AOAM531WNHViMEJ33xHLFB/6b5lIYNPYABW12cduMJ4nDQFq0A7D/ryM 37kKHvFOu2fE12FpVoCuIYcQBin0uvmzfVjo X-Google-Smtp-Source: ABdhPJwaxQEo52xkzfkwrkOk5w0qsjkoOKO8GJ75rRreOqQP9W2PPTr7u2I34+pfZd9f7xl3EYJqvg== X-Received: by 2002:adf:fa08:: with SMTP id m8mr14367450wrr.319.1624053874831; Fri, 18 Jun 2021 15:04:34 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id z6sm6966322wrl.15.2021.06.18.15.04.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Jun 2021 15:04:34 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Fri, 18 Jun 2021 23:04:30 +0100 Message-Id: <20210618220430.31457-4-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210618220430.31457-1-david.plowman@raspberrypi.com> References: <20210618220430.31457-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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 Reviewed-by: Naushir Patuck Acked-by: Kieran Bingham . --- 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',