[{"id":26724,"web_url":"https://patchwork.libcamera.org/comment/26724/","msgid":"<20230324090902.qza4mfsv3rptf436@uno.localdomain>","date":"2023-03-24T09:09:02","subject":"Re: [libcamera-devel] [PATCH v1 06/10] ipa: raspberrypi: Generalise\n\tthe contrast algorithm","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Naush\n\nOn Wed, Mar 22, 2023 at 01:06:08PM +0000, Naushir Patuck via libcamera-devel wrote:\n> Generalise the contrast algorithm code by removing any hard-coded\n> assumptions about the target hardware platform. Instead, the algorithm\n> code creates a generic Pwl that gets returned to the IPA, where it gets\n> converted to the bcm2835 hardware specific lookup table.\n>\n> As a drive-by, remove an unused mutex.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks\n  j\n\n> ---\n>  .../raspberrypi/controller/contrast_status.h  | 11 ++-----\n>  .../raspberrypi/controller/rpi/contrast.cpp   | 30 ++++---------------\n>  src/ipa/raspberrypi/controller/rpi/contrast.h |  1 -\n>  src/ipa/raspberrypi/raspberrypi.cpp           | 15 +++++++---\n>  4 files changed, 20 insertions(+), 37 deletions(-)\n>\n> diff --git a/src/ipa/raspberrypi/controller/contrast_status.h b/src/ipa/raspberrypi/controller/contrast_status.h\n> index ef2a7c680fc2..fb9fe4bace71 100644\n> --- a/src/ipa/raspberrypi/controller/contrast_status.h\n> +++ b/src/ipa/raspberrypi/controller/contrast_status.h\n> @@ -6,20 +6,15 @@\n>   */\n>  #pragma once\n>\n> +#include \"pwl.h\"\n> +\n>  /*\n>   * The \"contrast\" algorithm creates a gamma curve, optionally doing a little bit\n>   * of contrast stretching based on the AGC histogram.\n>   */\n>\n> -constexpr unsigned int ContrastNumPoints = 33;\n> -\n> -struct ContrastPoint {\n> -\tuint16_t x;\n> -\tuint16_t y;\n> -};\n> -\n>  struct ContrastStatus {\n> -\tstruct ContrastPoint points[ContrastNumPoints];\n> +\tRPiController::Pwl gammaCurve;\n>  \tdouble brightness;\n>  \tdouble contrast;\n>  };\n> diff --git a/src/ipa/raspberrypi/controller/rpi/contrast.cpp b/src/ipa/raspberrypi/controller/rpi/contrast.cpp\n> index a4f8c4f04fc4..bee1eadd3657 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/contrast.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/contrast.cpp\n> @@ -65,34 +65,19 @@ void Contrast::setContrast(double contrast)\n>  \tcontrast_ = contrast;\n>  }\n>\n> -static void fillInStatus(ContrastStatus &status, double brightness,\n> -\t\t\t double contrast, Pwl &gammaCurve)\n> -{\n> -\tstatus.brightness = brightness;\n> -\tstatus.contrast = contrast;\n> -\tfor (unsigned int i = 0; i < ContrastNumPoints - 1; i++) {\n> -\t\tint x = i < 16 ? i * 1024\n> -\t\t\t       : (i < 24 ? (i - 16) * 2048 + 16384\n> -\t\t\t\t\t : (i - 24) * 4096 + 32768);\n> -\t\tstatus.points[i].x = x;\n> -\t\tstatus.points[i].y = std::min(65535.0, gammaCurve.eval(x));\n> -\t}\n> -\tstatus.points[ContrastNumPoints - 1].x = 65535;\n> -\tstatus.points[ContrastNumPoints - 1].y = 65535;\n> -}\n> -\n>  void Contrast::initialise()\n>  {\n>  \t/*\n>  \t * Fill in some default values as Prepare will run before Process gets\n>  \t * called.\n>  \t */\n> -\tfillInStatus(status_, brightness_, contrast_, config_.gammaCurve);\n> +\tstatus_.brightness = brightness_;\n> +\tstatus_.contrast = contrast_;\n> +\tstatus_.gammaCurve = config_.gammaCurve;\n>  }\n>\n>  void Contrast::prepare(Metadata *imageMetadata)\n>  {\n> -\tstd::unique_lock<std::mutex> lock(mutex_);\n>  \timageMetadata->set(\"contrast.status\", status_);\n>  }\n>\n> @@ -183,12 +168,9 @@ void Contrast::process(StatisticsPtr &stats,\n>  \t * And fill in the status for output. Use more points towards the bottom\n>  \t * of the curve.\n>  \t */\n> -\tContrastStatus status;\n> -\tfillInStatus(status, brightness_, contrast_, gammaCurve);\n> -\t{\n> -\t\tstd::unique_lock<std::mutex> lock(mutex_);\n> -\t\tstatus_ = status;\n> -\t}\n> +\tstatus_.brightness = brightness_;\n> +\tstatus_.contrast = contrast_;\n> +\tstatus_.gammaCurve = std::move(gammaCurve);\n>  }\n>\n>  /* Register algorithm with the system. */\n> diff --git a/src/ipa/raspberrypi/controller/rpi/contrast.h b/src/ipa/raspberrypi/controller/rpi/contrast.h\n> index c68adbc9e463..9c81277a0450 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/contrast.h\n> +++ b/src/ipa/raspberrypi/controller/rpi/contrast.h\n> @@ -46,7 +46,6 @@ private:\n>  \tdouble brightness_;\n>  \tdouble contrast_;\n>  \tContrastStatus status_;\n> -\tstd::mutex mutex_;\n>  };\n>\n>  } /* namespace RPiController */\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\n> index 0fa79bb4af41..b6e5465ca32a 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -1592,14 +1592,21 @@ void IPARPi::applyCCM(const struct CcmStatus *ccmStatus, ControlList &ctrls)\n>\n>  void IPARPi::applyGamma(const struct ContrastStatus *contrastStatus, ControlList &ctrls)\n>  {\n> +\tconst unsigned int numGammaPoints = controller_.getHardwareConfig().numGammaPoints;\n>  \tstruct bcm2835_isp_gamma gamma;\n>\n> -\tgamma.enabled = 1;\n> -\tfor (unsigned int i = 0; i < ContrastNumPoints; i++) {\n> -\t\tgamma.x[i] = contrastStatus->points[i].x;\n> -\t\tgamma.y[i] = contrastStatus->points[i].y;\n> +\tfor (unsigned int i = 0; i < numGammaPoints - 1; i++) {\n> +\t\tint x = i < 16 ? i * 1024\n> +\t\t\t       : (i < 24 ? (i - 16) * 2048 + 16384\n> +\t\t\t\t\t : (i - 24) * 4096 + 32768);\n> +\t\tgamma.x[i] = x;\n> +\t\tgamma.y[i] = std::min<uint16_t>(65535, contrastStatus->gammaCurve.eval(x));\n>  \t}\n>\n> +\tgamma.x[numGammaPoints - 1] = 65535;\n> +\tgamma.y[numGammaPoints - 1] = 65535;\n> +\tgamma.enabled = 1;\n> +\n>  \tControlValue c(Span<const uint8_t>{ reinterpret_cast<uint8_t *>(&gamma),\n>  \t\t\t\t\t    sizeof(gamma) });\n>  \tctrls.set(V4L2_CID_USER_BCM2835_ISP_GAMMA, c);\n> --\n> 2.34.1\n>","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 B13F0C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Mar 2023 09:09:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D735E626E3;\n\tFri, 24 Mar 2023 10:09:07 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B1C4861ED0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Mar 2023 10:09:06 +0100 (CET)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 12DC1A49;\n\tFri, 24 Mar 2023 10:09:06 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1679648947;\n\tbh=iw0aMtGm0K1B3YBdk1gEx3cafAJxNggFvWmsj59xt7c=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=W9TXwC/ibp35UKTcMaNtBl0ZQhDZOIorsjWZujfvgFtlX1hGp2cR8JZs7jD3sPQWd\n\tWvPuPajA6uQ20IXxaJ+e6QUsA5gy4O/Ut5QpGT850lU/0OFggsRNeb6Vgi2+POBmMG\n\tHXZqTSUMYAYV1opaL8qNec+xeRcaJKIe6A54eyeVmSUBj1fXRvqxYM9cpskyrHvFP1\n\tGl4Ms3OT7lCgoebZCNcA4OHalSpTjVMzyS+W8Z3VyHZ8S+VawPUfUbEUzw+9yoazrO\n\tsVM2OIcMVEpukq0NnafzlH70+jG8r8rzlrxZZ723fQVFbtTtYbY3gTDjqfhGLY4gC6\n\tQm1hfzE51mLNw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1679648946;\n\tbh=iw0aMtGm0K1B3YBdk1gEx3cafAJxNggFvWmsj59xt7c=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=K/rshE1LFSfMZ4sof8UyDA//xoRv2mOMi8K5pivoG/CXNgVY3oMBlOr1wU2m7RpCv\n\tIHDsJ2qWaUuXZ9318fTAIvSxDX/FPv7lU74+33/azoLCX+IPk42Wp4mdIrVnSyWlcn\n\tnfIBpgm5L2Dwv4XsYop22MjK9WAatFjffKDdViaY="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"K/rshE1L\"; dkim-atps=neutral","Date":"Fri, 24 Mar 2023 10:09:02 +0100","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20230324090902.qza4mfsv3rptf436@uno.localdomain>","References":"<20230322130612.5208-1-naush@raspberrypi.com>\n\t<20230322130612.5208-7-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230322130612.5208-7-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v1 06/10] ipa: raspberrypi: Generalise\n\tthe contrast algorithm","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>","From":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]