From patchwork Wed Oct 6 14:00:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean-Michel Hautbois X-Patchwork-Id: 14064 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 A839EC323E for ; Wed, 6 Oct 2021 14:01:12 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5C868691E3; Wed, 6 Oct 2021 16:01:12 +0200 (CEST) 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="HfXZ/lio"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3CB9B691B9 for ; Wed, 6 Oct 2021 16:01:03 +0200 (CEST) Received: from tatooine.ideasonboard.com (unknown [IPv6:2a01:e0a:169:7140:843b:c831:54de:6e8c]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B584C1909; Wed, 6 Oct 2021 16:01:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1633528862; bh=2YCuR9APHq6A/RiU6Vp0nBlesxn1903OFYld5uk3tyU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HfXZ/liosrXbCnBktz+xdeqNQ581hff3yloUzEhGHNCq+EGVBe5dnpolMESKzB1sS H90/XOJRuadxTmKt3+uNvAxmpNekoinXz2ieOsj+eH4MNiB+zr8KEH8iMuSn9IF9pG SrNhX3i+B2/ZcB3mUYp5izb3Y1B9QmQhxh2USs3E= From: Jean-Michel Hautbois To: libcamera-devel@lists.libcamera.org Date: Wed, 6 Oct 2021 16:00:40 +0200 Message-Id: <20211006140041.964542-11-jeanmichel.hautbois@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211006140041.964542-1-jeanmichel.hautbois@ideasonboard.com> References: <20211006140041.964542-1-jeanmichel.hautbois@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 10/12] ipa: ipu3: awb: Introduce Black Level Correction 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 pixels output by the camera normally include a black level, because sensors do not always report a signal level of '0' for black. Pixels at or below this level should be considered black and to achieve that, we need to substract an offset to all the pixels. This can be taken into account by reading the lowest value of a special region on sensors which is not exposed to light. This provides a substracting factor to be able to adjust the expected black levels in the resulting images. For a camera outputting 10-bit pixel values (in the range 0 to 1023) a typical black level might be 64. It is a fixed value, obtained by capturing a raw frame with minimum exposure and gain fixed to 1.0 while covering the sensor (the darker the better). We consider it good enough as a very first approximation, until we measure it during a tuning process and include it in a configuration file Signed-off-by: Jean-Michel Hautbois Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/ipa/ipu3/algorithms/blc.cpp | 66 +++++++++++++++++++++++++++++ src/ipa/ipu3/algorithms/blc.h | 28 ++++++++++++ src/ipa/ipu3/algorithms/meson.build | 1 + src/ipa/ipu3/ipu3.cpp | 2 + 4 files changed, 97 insertions(+) create mode 100644 src/ipa/ipu3/algorithms/blc.cpp create mode 100644 src/ipa/ipu3/algorithms/blc.h diff --git a/src/ipa/ipu3/algorithms/blc.cpp b/src/ipa/ipu3/algorithms/blc.cpp new file mode 100644 index 00000000..df56e292 --- /dev/null +++ b/src/ipa/ipu3/algorithms/blc.cpp @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google inc. + * + * blc.cpp - IPU3 Black Level Correction control + */ + +#include "blc.h" + +#include + +/** + * \file blc.h + */ + +namespace libcamera { + +namespace ipa::ipu3::algorithms { + +/** + * \class BlackLevelCorrection + * \brief A class to handle optical black correction + * + * The pixels output by the camera normally include a black level, because + * sensors do not always report a signal level of '0' for black. Pixels at or + * below this level should be considered black. To achieve that, the ImgU BLC + * algorithm subtracts a configurable offset from all pixels. + * + * The black level can be measured at runtime from an optical dark region of the + * camera sensor, or measured during the camera tuning process. The first option + * isn't currently supported. + */ + +BlackLevelCorrection::BlackLevelCorrection() +{ +} + +/** + * \brief Fill in the parameter structure, and enable optical black correction + * \param context The shared IPA context + * \param params The IPU3 parameters + * + * Populate the IPU3 parameter structure with the correction values for each + * channel and enable the corresponding ImgU block processing. + */ +void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context, + ipu3_uapi_params *params) +{ + /* + * The Optical Black Level correction values + * \todo The correction values should come from sensor specific + * tuning processes. This is a first rough approximation + */ + params->obgrid_param.gr = 64; + params->obgrid_param.r = 64; + params->obgrid_param.b = 64; + params->obgrid_param.gb = 64; + + /* Enable the custom optical black correction processing */ + params->use.obgrid = 1; + params->use.obgrid_param = 1; +} + +} /* namespace ipa::ipu3::algorithms */ + +} /* namespace libcamera */ diff --git a/src/ipa/ipu3/algorithms/blc.h b/src/ipa/ipu3/algorithms/blc.h new file mode 100644 index 00000000..4b7cb483 --- /dev/null +++ b/src/ipa/ipu3/algorithms/blc.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google inc. + * + * black_correction.h - IPU3 Black Level Correction control + */ +#ifndef __LIBCAMERA_IPU3_ALGORITHMS_BLC_H__ +#define __LIBCAMERA_IPU3_ALGORITHMS_BLC_H__ + +#include "algorithm.h" + +namespace libcamera { + +namespace ipa::ipu3::algorithms { + +class BlackLevelCorrection : public Algorithm +{ +public: + BlackLevelCorrection(); + + void prepare(IPAContext &context, ipu3_uapi_params *params) override; +}; + +} /* namespace ipa::ipu3::algorithms */ + +} /* namespace libcamera */ + +#endif /* __LIBCAMERA_IPU3_ALGORITHMS_BLC_H__ */ diff --git a/src/ipa/ipu3/algorithms/meson.build b/src/ipa/ipu3/algorithms/meson.build index deae225b..3ec42f72 100644 --- a/src/ipa/ipu3/algorithms/meson.build +++ b/src/ipa/ipu3/algorithms/meson.build @@ -4,5 +4,6 @@ ipu3_ipa_algorithms = files([ 'agc.cpp', 'algorithm.cpp', 'awb.cpp', + 'blc.cpp', 'tone_mapping.cpp', ]) diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 06f53fbe..6d9bbf39 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -33,6 +33,7 @@ #include "algorithms/agc.h" #include "algorithms/algorithm.h" #include "algorithms/awb.h" +#include "algorithms/blc.h" #include "algorithms/tone_mapping.h" #include "libipa/camera_sensor_helper.h" @@ -282,6 +283,7 @@ int IPAIPU3::init(const IPASettings &settings, /* Construct our Algorithms */ algorithms_.push_back(std::make_unique()); algorithms_.push_back(std::make_unique()); + algorithms_.push_back(std::make_unique()); algorithms_.push_back(std::make_unique()); return 0;