[{"id":25268,"web_url":"https://patchwork.libcamera.org/comment/25268/","msgid":"<Yzxn8FgJ7BsM7woW@pendragon.ideasonboard.com>","date":"2022-10-04T17:05:52","subject":"Re: [libcamera-devel] [PATCH v1 4/9] pipeline: ipa: raspberrypi:\n\tAdd HBLANK control to DelayedControls","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush,\n\nThank you for the patch.\n\nOn Mon, Oct 03, 2022 at 09:39:30AM +0100, Naushir Patuck via libcamera-devel wrote:\n> Update CamHelper::getDelays() to return the sensor HBLANK delay. The HBLANK\n> delay is set to the same value as VBLANK delay for all sensors in the Raspberry\n> Pi IPA.\n> \n> Return the HBLANK gain delay from the IPA to the pipeline handler, and\n> initialise DelayedControls to handle V4L2_CID_HBLANK with this delay value.\n> \n> As a drive-by, check that the V4L2_CID_HBLANK control is aviailable when calling\n\ns/aviailable/available/\n\n> IPARPi::configure().\n> \n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  include/libcamera/ipa/raspberrypi.mojom            | 1 +\n>  src/ipa/raspberrypi/cam_helper.cpp                 | 3 ++-\n>  src/ipa/raspberrypi/cam_helper.h                   | 2 +-\n>  src/ipa/raspberrypi/cam_helper_imx290.cpp          | 5 +++--\n\nYou will need to also address imx296, as another patch has been merged\nin the meantime.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  src/ipa/raspberrypi/cam_helper_imx477.cpp          | 5 +++--\n>  src/ipa/raspberrypi/cam_helper_imx519.cpp          | 5 +++--\n>  src/ipa/raspberrypi/cam_helper_ov5647.cpp          | 5 +++--\n>  src/ipa/raspberrypi/cam_helper_ov9281.cpp          | 5 +++--\n>  src/ipa/raspberrypi/raspberrypi.cpp                | 6 ++++--\n>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 1 +\n>  10 files changed, 24 insertions(+), 14 deletions(-)\n> \n> diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom\n> index c0de435b7b33..40f78d9e3b3f 100644\n> --- a/include/libcamera/ipa/raspberrypi.mojom\n> +++ b/include/libcamera/ipa/raspberrypi.mojom\n> @@ -23,6 +23,7 @@ struct SensorConfig {\n>  \tuint32 gainDelay;\n>  \tuint32 exposureDelay;\n>  \tuint32 vblankDelay;\n> +\tuint32 hblankDelay;\n>  \tuint32 sensorMetadata;\n>  };\n>  \n> diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp\n> index fd3527b94501..916632f83037 100644\n> --- a/src/ipa/raspberrypi/cam_helper.cpp\n> +++ b/src/ipa/raspberrypi/cam_helper.cpp\n> @@ -114,7 +114,7 @@ void CamHelper::setCameraMode(const CameraMode &mode)\n>  }\n>  \n>  void CamHelper::getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t\t  int &vblankDelay) const\n> +\t\t\t  int &vblankDelay, int &hblankDelay) const\n>  {\n>  \t/*\n>  \t * These values are correct for many sensors. Other sensors will\n> @@ -123,6 +123,7 @@ void CamHelper::getDelays(int &exposureDelay, int &gainDelay,\n>  \texposureDelay = 2;\n>  \tgainDelay = 1;\n>  \tvblankDelay = 2;\n> +\thblankDelay = 2;\n>  }\n>  \n>  bool CamHelper::sensorEmbeddedDataPresent() const\n> diff --git a/src/ipa/raspberrypi/cam_helper.h b/src/ipa/raspberrypi/cam_helper.h\n> index 9b5e602689f3..1bbdd715d2b1 100644\n> --- a/src/ipa/raspberrypi/cam_helper.h\n> +++ b/src/ipa/raspberrypi/cam_helper.h\n> @@ -88,7 +88,7 @@ public:\n>  \tvirtual uint32_t gainCode(double gain) const = 0;\n>  \tvirtual double gain(uint32_t gainCode) const = 0;\n>  \tvirtual void getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t\t       int &vblankDelay) const;\n> +\t\t\t       int &vblankDelay, int &hblankDelay) const;\n>  \tvirtual bool sensorEmbeddedDataPresent() const;\n>  \tvirtual double getModeSensitivity(const CameraMode &mode) const;\n>  \tvirtual unsigned int hideFramesStartup() const;\n> diff --git a/src/ipa/raspberrypi/cam_helper_imx290.cpp b/src/ipa/raspberrypi/cam_helper_imx290.cpp\n> index 25f23d531c72..7d6f5b549a73 100644\n> --- a/src/ipa/raspberrypi/cam_helper_imx290.cpp\n> +++ b/src/ipa/raspberrypi/cam_helper_imx290.cpp\n> @@ -18,7 +18,7 @@ public:\n>  \tuint32_t gainCode(double gain) const override;\n>  \tdouble gain(uint32_t gainCode) const override;\n>  \tvoid getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t       int &vblankDelay) const override;\n> +\t\t       int &vblankDelay, int &hblankDelay) const override;\n>  \tunsigned int hideFramesModeSwitch() const override;\n>  \n>  private:\n> @@ -46,11 +46,12 @@ double CamHelperImx290::gain(uint32_t gainCode) const\n>  }\n>  \n>  void CamHelperImx290::getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t\t\tint &vblankDelay) const\n> +\t\t\t\tint &vblankDelay, int &hblankDelay) const\n>  {\n>  \texposureDelay = 2;\n>  \tgainDelay = 2;\n>  \tvblankDelay = 2;\n> +\thblankDelay = 2;\n>  }\n>  \n>  unsigned int CamHelperImx290::hideFramesModeSwitch() const\n> diff --git a/src/ipa/raspberrypi/cam_helper_imx477.cpp b/src/ipa/raspberrypi/cam_helper_imx477.cpp\n> index 71529bdd3034..76a82cc51378 100644\n> --- a/src/ipa/raspberrypi/cam_helper_imx477.cpp\n> +++ b/src/ipa/raspberrypi/cam_helper_imx477.cpp\n> @@ -49,7 +49,7 @@ public:\n>  \tuint32_t getVBlanking(Duration &exposure, Duration minFrameDuration,\n>  \t\t\t      Duration maxFrameDuration) const override;\n>  \tvoid getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t       int &vblankDelay) const override;\n> +\t\t       int &vblankDelay, int &hblankDelay) const override;\n>  \tbool sensorEmbeddedDataPresent() const override;\n>  \n>  private:\n> @@ -153,11 +153,12 @@ uint32_t CamHelperImx477::getVBlanking(Duration &exposure,\n>  }\n>  \n>  void CamHelperImx477::getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t\t\tint &vblankDelay) const\n> +\t\t\t\tint &vblankDelay, int &hblankDelay) const\n>  {\n>  \texposureDelay = 2;\n>  \tgainDelay = 2;\n>  \tvblankDelay = 3;\n> +\thblankDelay = 3;\n>  }\n>  \n>  bool CamHelperImx477::sensorEmbeddedDataPresent() const\n> diff --git a/src/ipa/raspberrypi/cam_helper_imx519.cpp b/src/ipa/raspberrypi/cam_helper_imx519.cpp\n> index 2c120dad1680..9dff1eeb899f 100644\n> --- a/src/ipa/raspberrypi/cam_helper_imx519.cpp\n> +++ b/src/ipa/raspberrypi/cam_helper_imx519.cpp\n> @@ -49,7 +49,7 @@ public:\n>  \tuint32_t getVBlanking(Duration &exposure, Duration minFrameDuration,\n>  \t\t\t      Duration maxFrameDuration) const override;\n>  \tvoid getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t       int &vblankDelay) const override;\n> +\t\t       int &vblankDelay, int &hblankDelay) const override;\n>  \tbool sensorEmbeddedDataPresent() const override;\n>  \n>  private:\n> @@ -153,11 +153,12 @@ uint32_t CamHelperImx519::getVBlanking(Duration &exposure,\n>  }\n>  \n>  void CamHelperImx519::getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t\t\tint &vblankDelay) const\n> +\t\t\t\tint &vblankDelay, int &hblankDelay) const\n>  {\n>  \texposureDelay = 2;\n>  \tgainDelay = 2;\n>  \tvblankDelay = 3;\n> +\thblankDelay = 3;\n>  }\n>  \n>  bool CamHelperImx519::sensorEmbeddedDataPresent() const\n> diff --git a/src/ipa/raspberrypi/cam_helper_ov5647.cpp b/src/ipa/raspberrypi/cam_helper_ov5647.cpp\n> index 04fb725d42db..5a99083dee78 100644\n> --- a/src/ipa/raspberrypi/cam_helper_ov5647.cpp\n> +++ b/src/ipa/raspberrypi/cam_helper_ov5647.cpp\n> @@ -18,7 +18,7 @@ public:\n>  \tuint32_t gainCode(double gain) const override;\n>  \tdouble gain(uint32_t gainCode) const override;\n>  \tvoid getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t       int &vblankDelay) const override;\n> +\t\t       int &vblankDelay, int &hblankDelay) const override;\n>  \tunsigned int hideFramesStartup() const override;\n>  \tunsigned int hideFramesModeSwitch() const override;\n>  \tunsigned int mistrustFramesStartup() const override;\n> @@ -53,7 +53,7 @@ double CamHelperOv5647::gain(uint32_t gainCode) const\n>  }\n>  \n>  void CamHelperOv5647::getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t\t\tint &vblankDelay) const\n> +\t\t\t\tint &vblankDelay, int &hblankDelay) const\n>  {\n>  \t/*\n>  \t * We run this sensor in a mode where the gain delay is bumped up to\n> @@ -62,6 +62,7 @@ void CamHelperOv5647::getDelays(int &exposureDelay, int &gainDelay,\n>  \texposureDelay = 2;\n>  \tgainDelay = 2;\n>  \tvblankDelay = 2;\n> +\thblankDelay = 2;\n>  }\n>  \n>  unsigned int CamHelperOv5647::hideFramesStartup() const\n> diff --git a/src/ipa/raspberrypi/cam_helper_ov9281.cpp b/src/ipa/raspberrypi/cam_helper_ov9281.cpp\n> index 66f56a31e1b8..86c5bc4c8fda 100644\n> --- a/src/ipa/raspberrypi/cam_helper_ov9281.cpp\n> +++ b/src/ipa/raspberrypi/cam_helper_ov9281.cpp\n> @@ -18,7 +18,7 @@ public:\n>  \tuint32_t gainCode(double gain) const override;\n>  \tdouble gain(uint32_t gainCode) const override;\n>  \tvoid getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t       int &vblankDelay) const override;\n> +\t\t       int &vblankDelay, int &hblankDelay) const override;\n>  \n>  private:\n>  \t/*\n> @@ -49,12 +49,13 @@ double CamHelperOv9281::gain(uint32_t gainCode) const\n>  }\n>  \n>  void CamHelperOv9281::getDelays(int &exposureDelay, int &gainDelay,\n> -\t\t\t\tint &vblankDelay) const\n> +\t\t\t\tint &vblankDelay, int &hblankDelay) const\n>  {\n>  \t/* The driver appears to behave as follows: */\n>  \texposureDelay = 2;\n>  \tgainDelay = 2;\n>  \tvblankDelay = 2;\n> +\thblankDelay = 2;\n>  }\n>  \n>  static CamHelper *create()\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\n> index 13807f4d47f7..9b0ad4361c97 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -219,13 +219,14 @@ int IPARPi::init(const IPASettings &settings, IPAInitResult *result)\n>  \t * Pass out the sensor config to the pipeline handler in order\n>  \t * to setup the staggered writer class.\n>  \t */\n> -\tint gainDelay, exposureDelay, vblankDelay, sensorMetadata;\n> -\thelper_->getDelays(exposureDelay, gainDelay, vblankDelay);\n> +\tint gainDelay, exposureDelay, vblankDelay, hblankDelay, sensorMetadata;\n> +\thelper_->getDelays(exposureDelay, gainDelay, vblankDelay, hblankDelay);\n>  \tsensorMetadata = helper_->sensorEmbeddedDataPresent();\n>  \n>  \tresult->sensorConfig.gainDelay = gainDelay;\n>  \tresult->sensorConfig.exposureDelay = exposureDelay;\n>  \tresult->sensorConfig.vblankDelay = vblankDelay;\n> +\tresult->sensorConfig.hblankDelay = hblankDelay;\n>  \tresult->sensorConfig.sensorMetadata = sensorMetadata;\n>  \n>  \t/* Load the tuning file for this sensor. */\n> @@ -607,6 +608,7 @@ bool IPARPi::validateSensorControls()\n>  \t\tV4L2_CID_ANALOGUE_GAIN,\n>  \t\tV4L2_CID_EXPOSURE,\n>  \t\tV4L2_CID_VBLANK,\n> +\t\tV4L2_CID_HBLANK,\n>  \t};\n>  \n>  \tfor (auto c : ctrls) {\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index dcd81650c32d..623bec6bea3c 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -1299,6 +1299,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, Me\n>  \tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n>  \t\t{ V4L2_CID_ANALOGUE_GAIN, { result.sensorConfig.gainDelay, false } },\n>  \t\t{ V4L2_CID_EXPOSURE, { result.sensorConfig.exposureDelay, false } },\n> +\t\t{ V4L2_CID_HBLANK, { result.sensorConfig.hblankDelay, false } },\n>  \t\t{ V4L2_CID_VBLANK, { result.sensorConfig.vblankDelay, true } }\n>  \t};\n>  \tdata->delayedCtrls_ = std::make_unique<DelayedControls>(data->sensor_->device(), params);","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 2EAD5C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  4 Oct 2022 17:05:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6CD7B60AB0;\n\tTue,  4 Oct 2022 19:05:57 +0200 (CEST)","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 32477601C7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  4 Oct 2022 19:05:56 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9C8662D9;\n\tTue,  4 Oct 2022 19:05:55 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1664903157;\n\tbh=z25CPBTTCkTf/MmHMiuFCr6/DrNp5H/97NoN0bN3/Us=;\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=4h4ORfjT7M+t1eHjosNEkiZn3LauptkjvWS071T+GlH4aUfXCaPQ/l3EoTjkbAJMl\n\tdxO9LxF2d8GYGQDwmT7eatQO2pLIiA1X7I14eBKE9sjCl5paK0IMNk0ngHOR0eXqWu\n\tjinZeXFz15/bwN4F+tcqkZhGJKM/+nlwXKR7uSVb3pcwLp5TSmYyKG3S28wmp/0IYr\n\tW3970PUzRYjfeCsczDyYKX9R1eyt/O6wgiVOAz8i7pHoQ9x/driJgAygdCZSQKC5HA\n\t9FVJgIwhMe3B39zL4DUNt80g19jnrLIrE3K2cESIcJ0sb1GS7a88GaU7cRqmelJk6b\n\tJk4N26/LE/Dlg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1664903155;\n\tbh=z25CPBTTCkTf/MmHMiuFCr6/DrNp5H/97NoN0bN3/Us=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=bJHD43Js+JEassOC14RH0v/6iIaZwwdCrYWg/R5LmQW1FFIWnMYAgO2X1YgwBCiNz\n\tvlX56LMdRV6pFzOmjrG7bO9iwQiyGuWZeTO7OHsb3wSZnq7v5m2vW4EFCCa36v/KSh\n\tjnEudQWiANCTb7Zf2f/3cBLoDCjO/qgcka4kus3A="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"bJHD43Js\"; dkim-atps=neutral","Date":"Tue, 4 Oct 2022 20:05:52 +0300","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<Yzxn8FgJ7BsM7woW@pendragon.ideasonboard.com>","References":"<20221003083934.31629-1-naush@raspberrypi.com>\n\t<20221003083934.31629-5-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221003083934.31629-5-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v1 4/9] pipeline: ipa: raspberrypi:\n\tAdd HBLANK control to DelayedControls","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":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@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>"}}]