[{"id":25880,"web_url":"https://patchwork.libcamera.org/comment/25880/","msgid":"<166921348552.1079859.17921886373730370317@Monstersaurus>","date":"2022-11-23T14:24:45","subject":"Re: [libcamera-devel] [PATCH v2 4/4] ipa: rkisp1: add\n\tFrameDurationLimits control","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Jacopo Mondi via libcamera-devel (2022-11-23 13:43:46)\n> From: Nicholas Roth <nicholas@rothemail.net>\n> \n> Currently, the Android HAL does not work on rkisp1-based devices because\n> required FrameDurationLimits metadata is missing from the IPA\n> implementation.\n> \n> This change sets FrameDurationLimits for rkisp1 based on the existing\n> ipu3 implementation, using the sensor's reported range of vertical\n> blanking intervals with the minimum reported horizontal blanking\n> interval.\n> \n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> Signed-off-by: Nicholas Roth <nicholas@rothemail.net>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  include/libcamera/ipa/rkisp1.mojom       |  6 ++-\n>  src/ipa/rkisp1/rkisp1.cpp                | 57 +++++++++++++++++++++---\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 17 ++++---\n>  3 files changed, 67 insertions(+), 13 deletions(-)\n> \n> diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom\n> index 36bf291e8a51..1009e970a1b5 100644\n> --- a/include/libcamera/ipa/rkisp1.mojom\n> +++ b/include/libcamera/ipa/rkisp1.mojom\n> @@ -15,14 +15,16 @@ struct IPAConfigInfo {\n>  \n>  interface IPARkISP1Interface {\n>         init(libcamera.IPASettings settings,\n> -            uint32 hwRevision)\n> +            uint32 hwRevision,\n> +            libcamera.IPACameraSensorInfo sensorInfo,\n> +            libcamera.ControlInfoMap sensorControls)\n>                 => (int32 ret, libcamera.ControlInfoMap ipaControls);\n>         start() => (int32 ret);\n>         stop();\n>  \n>         configure(IPAConfigInfo configInfo,\n>                   map<uint32, libcamera.IPAStream> streamConfig)\n> -               => (int32 ret);\n> +               => (int32 ret, libcamera.ControlInfoMap ipaControls);\n>  \n>         mapBuffers(array<libcamera.IPABuffer> buffers);\n>         unmapBuffers(array<uint32> ids);\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index a9e144303072..9265d3c9f53c 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -49,12 +49,15 @@ public:\n>         IPARkISP1();\n>  \n>         int init(const IPASettings &settings, unsigned int hwRevision,\n> +                const IPACameraSensorInfo &sensorInfo,\n> +                const ControlInfoMap &sensorControls,\n>                  ControlInfoMap *ipaControls) override;\n>         int start() override;\n>         void stop() override;\n>  \n>         int configure(const IPAConfigInfo &ipaConfig,\n> -                     const std::map<uint32_t, IPAStream> &streamConfig) override;\n> +                     const std::map<uint32_t, IPAStream> &streamConfig,\n> +                     ControlInfoMap *ipaControls) override;\n>         void mapBuffers(const std::vector<IPABuffer> &buffers) override;\n>         void unmapBuffers(const std::vector<unsigned int> &ids) override;\n>  \n> @@ -67,6 +70,9 @@ protected:\n>         std::string logPrefix() const override;\n>  \n>  private:\n> +       void updateControls(const IPACameraSensorInfo &sensorInfo,\n> +                           const ControlInfoMap &sensorControls,\n> +                           ControlInfoMap *ipaControls);\n>         void setControls(unsigned int frame);\n>  \n>         std::map<unsigned int, FrameBuffer> buffers_;\n> @@ -114,6 +120,8 @@ std::string IPARkISP1::logPrefix() const\n>  }\n>  \n>  int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,\n> +                   const IPACameraSensorInfo &sensorInfo,\n> +                   const ControlInfoMap &sensorControls,\n>                     ControlInfoMap *ipaControls)\n>  {\n>         /* \\todo Add support for other revisions */\n> @@ -180,9 +188,8 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,\n>         if (ret)\n>                 return ret;\n>  \n> -       /* Return the controls handled by the IPA. */\n> -       ControlInfoMap::Map ctrlMap = rkisp1Controls;\n> -       *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);\n> +       /* Initialize controls. */\n> +       updateControls(sensorInfo, sensorControls, ipaControls);\n>  \n>         return 0;\n>  }\n> @@ -200,7 +207,8 @@ void IPARkISP1::stop()\n>  }\n>  \n>  int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,\n> -                        [[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig)\n> +                        [[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig,\n> +                        ControlInfoMap *ipaControls)\n>  {\n>         sensorControls_ = ipaConfig.sensorControls;\n>  \n> @@ -230,6 +238,9 @@ int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,\n>         context_.configuration.sensor.size = info.outputSize;\n>         context_.configuration.sensor.lineDuration = info.minLineLength * 1.0s / info.pixelRate;\n>  \n> +       /* Update the camera controls using the new sensor settings. */\n> +       updateControls(info, sensorControls_, ipaControls);\n> +\n>         /*\n>          * When the AGC computes the new exposure values for a frame, it needs\n>          * to know the limits for shutter speed and analogue gain.\n> @@ -332,6 +343,42 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId\n>         metadataReady.emit(frame, metadata);\n>  }\n>  \n> +void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,\n> +                              const ControlInfoMap &sensorControls,\n> +                              ControlInfoMap *ipaControls)\n> +{\n> +       ControlInfoMap::Map ctrlMap = rkisp1Controls;\n> +\n> +       /*\n> +        * Compute the frame duration limits.\n> +        *\n> +        * The frame length is computed assuming a fixed line length combined\n> +        * with the vertical frame sizes.\n> +        */\n> +       const ControlInfo &v4l2HBlank = sensorControls.find(V4L2_CID_HBLANK)->second;\n> +       uint32_t hblank = v4l2HBlank.def().get<int32_t>();\n> +       uint32_t lineLength = sensorInfo.outputSize.width + hblank;\n> +\n> +       const ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second;\n> +       std::array<uint32_t, 3> frameHeights{\n> +               v4l2VBlank.min().get<int32_t>() + sensorInfo.outputSize.height,\n> +               v4l2VBlank.max().get<int32_t>() + sensorInfo.outputSize.height,\n> +               v4l2VBlank.def().get<int32_t>() + sensorInfo.outputSize.height,\n> +       };\n> +\n> +       std::array<int64_t, 3> frameDurations;\n> +       for (unsigned int i = 0; i < frameHeights.size(); ++i) {\n> +               uint64_t frameSize = lineLength * frameHeights[i];\n> +               frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);\n> +       }\n> +\n> +       ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],\n> +                                                             frameDurations[1],\n> +                                                             frameDurations[2]);\n> +\n> +       *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);\n> +}\n> +\n>  void IPARkISP1::setControls(unsigned int frame)\n>  {\n>         /*\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index e946ccc4c930..231b16eca110 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -347,8 +347,15 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)\n>                 ipaTuningFile = std::string(configFromEnv);\n>         }\n>  \n> -       int ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,\n> -                            &controlInfo_);\n> +       IPACameraSensorInfo sensorInfo{};\n> +       int ret = sensor_->sensorInfo(&sensorInfo);\n> +       if (ret) {\n> +               LOG(RkISP1, Error) << \"Camera sensor information not available\";\n> +               return ret;\n> +       }\n> +\n> +       ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,\n> +                        sensorInfo, sensor_->controls(), &controlInfo_);\n>         if (ret < 0) {\n>                 LOG(RkISP1, Error) << \"IPA initialization failure\";\n>                 return ret;\n> @@ -718,14 +725,12 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n>         ipa::rkisp1::IPAConfigInfo ipaConfig{};\n>  \n>         ret = data->sensor_->sensorInfo(&ipaConfig.sensorInfo);\n> -       if (ret) {\n> -               LOG(RkISP1, Error) << \"Camera sensor information not available\";\n> +       if (ret)\n>                 return ret;\n> -       }\n>  \n>         ipaConfig.sensorControls = data->sensor_->controls();\n>  \n> -       ret = data->ipa_->configure(ipaConfig, streamConfig);\n> +       ret = data->ipa_->configure(ipaConfig, streamConfig, &data->controlInfo_);\n>         if (ret) {\n>                 LOG(RkISP1, Error) << \"failed configuring IPA (\" << ret << \")\";\n>                 return ret;\n> -- \n> 2.38.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 73BFBBDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 23 Nov 2022 14:24:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F39A76331A;\n\tWed, 23 Nov 2022 15:24:49 +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 75F4D63311\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Nov 2022 15:24:48 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id F111A890;\n\tWed, 23 Nov 2022 15:24:47 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669213490;\n\tbh=ns88EwBex4Dn4MUXUIMsw7OkY1Zhq1tYJbzPG+24vZg=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=KpGOsHOigLdIi6e+54SfAovUppl2V1ENRLt4rkcfa46GkamlO8SNAKJnlByRRwLEa\n\tvKZ9laROI8AaTu5ub+5+uuJa8XBdxprnfnB0GST3lj3xQgAYiK6pjVFHjqn15VF3EY\n\tUeTtrV9H+ie5EJORUfepSiEMYFSfm0ancyJFX/iH+vXksHBgreZ4i/gMYPsHN0nU9o\n\t3Wo62PtmQtodnZux7WWm1TKTzny/MZiwwMpG7N7wRzHnRDRXS7uCc8WlN7ZbqaHbwu\n\tsYG5rImf/dwi5zDQ3mC1PQqsJMG8v1C5xKIbqXCSijJD53p8u5evxkk+vpp3maSMIV\n\tB6zSbznahEcRA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1669213488;\n\tbh=ns88EwBex4Dn4MUXUIMsw7OkY1Zhq1tYJbzPG+24vZg=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=ADeZLzFSKgTdMnmo4lMehWD3NU9lEe0hRhL/y3gJuZ3O+wIcwZFN8YuSc/cQx+GKV\n\tEU+ME6DL38WXELVzxFMvvtZOHJb1P1diGoTdnklISwD1A4AHixCZevHcKeSzJBXofB\n\tGPibH/my2Fj6ndTize/V7okRG6rm/CWZSfJbtdr0="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"ADeZLzFS\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20221123134346.129807-5-jacopo@jmondi.org>","References":"<20221123134346.129807-1-jacopo@jmondi.org>\n\t<20221123134346.129807-5-jacopo@jmondi.org>","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","Date":"Wed, 23 Nov 2022 14:24:45 +0000","Message-ID":"<166921348552.1079859.17921886373730370317@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v2 4/4] ipa: rkisp1: add\n\tFrameDurationLimits control","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":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Nicholas Roth <nicholas@rothemail.net>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25882,"web_url":"https://patchwork.libcamera.org/comment/25882/","msgid":"<Y34whmfRiDqQiIzR@pendragon.ideasonboard.com>","date":"2022-11-23T14:39:02","subject":"Re: [libcamera-devel] [PATCH v2 4/4] ipa: rkisp1: add\n\tFrameDurationLimits control","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hello Nicholas and Jacopo,\n\nThank you for the patch.\n\nOn Wed, Nov 23, 2022 at 02:43:46PM +0100, Jacopo Mondi via libcamera-devel wrote:\n> From: Nicholas Roth <nicholas@rothemail.net>\n> \n> Currently, the Android HAL does not work on rkisp1-based devices because\n> required FrameDurationLimits metadata is missing from the IPA\n> implementation.\n> \n> This change sets FrameDurationLimits for rkisp1 based on the existing\n> ipu3 implementation, using the sensor's reported range of vertical\n> blanking intervals with the minimum reported horizontal blanking\n> interval.\n> \n> Signed-off-by: Nicholas Roth <nicholas@rothemail.net>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> ---\n>  include/libcamera/ipa/rkisp1.mojom       |  6 ++-\n>  src/ipa/rkisp1/rkisp1.cpp                | 57 +++++++++++++++++++++---\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 17 ++++---\n>  3 files changed, 67 insertions(+), 13 deletions(-)\n> \n> diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom\n> index 36bf291e8a51..1009e970a1b5 100644\n> --- a/include/libcamera/ipa/rkisp1.mojom\n> +++ b/include/libcamera/ipa/rkisp1.mojom\n> @@ -15,14 +15,16 @@ struct IPAConfigInfo {\n>  \n>  interface IPARkISP1Interface {\n>  \tinit(libcamera.IPASettings settings,\n> -\t     uint32 hwRevision)\n> +\t     uint32 hwRevision,\n> +\t     libcamera.IPACameraSensorInfo sensorInfo,\n> +\t     libcamera.ControlInfoMap sensorControls)\n>  \t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls);\n>  \tstart() => (int32 ret);\n>  \tstop();\n>  \n>  \tconfigure(IPAConfigInfo configInfo,\n>  \t\t  map<uint32, libcamera.IPAStream> streamConfig)\n> -\t\t=> (int32 ret);\n> +\t\t=> (int32 ret, libcamera.ControlInfoMap ipaControls);\n>  \n>  \tmapBuffers(array<libcamera.IPABuffer> buffers);\n>  \tunmapBuffers(array<uint32> ids);\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index a9e144303072..9265d3c9f53c 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -49,12 +49,15 @@ public:\n>  \tIPARkISP1();\n>  \n>  \tint init(const IPASettings &settings, unsigned int hwRevision,\n> +\t\t const IPACameraSensorInfo &sensorInfo,\n> +\t\t const ControlInfoMap &sensorControls,\n>  \t\t ControlInfoMap *ipaControls) override;\n>  \tint start() override;\n>  \tvoid stop() override;\n>  \n>  \tint configure(const IPAConfigInfo &ipaConfig,\n> -\t\t      const std::map<uint32_t, IPAStream> &streamConfig) override;\n> +\t\t      const std::map<uint32_t, IPAStream> &streamConfig,\n> +\t\t      ControlInfoMap *ipaControls) override;\n>  \tvoid mapBuffers(const std::vector<IPABuffer> &buffers) override;\n>  \tvoid unmapBuffers(const std::vector<unsigned int> &ids) override;\n>  \n> @@ -67,6 +70,9 @@ protected:\n>  \tstd::string logPrefix() const override;\n>  \n>  private:\n> +\tvoid updateControls(const IPACameraSensorInfo &sensorInfo,\n> +\t\t\t    const ControlInfoMap &sensorControls,\n> +\t\t\t    ControlInfoMap *ipaControls);\n>  \tvoid setControls(unsigned int frame);\n>  \n>  \tstd::map<unsigned int, FrameBuffer> buffers_;\n> @@ -114,6 +120,8 @@ std::string IPARkISP1::logPrefix() const\n>  }\n>  \n>  int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,\n> +\t\t    const IPACameraSensorInfo &sensorInfo,\n> +\t\t    const ControlInfoMap &sensorControls,\n>  \t\t    ControlInfoMap *ipaControls)\n>  {\n>  \t/* \\todo Add support for other revisions */\n> @@ -180,9 +188,8 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,\n>  \tif (ret)\n>  \t\treturn ret;\n>  \n> -\t/* Return the controls handled by the IPA. */\n> -\tControlInfoMap::Map ctrlMap = rkisp1Controls;\n> -\t*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);\n> +\t/* Initialize controls. */\n> +\tupdateControls(sensorInfo, sensorControls, ipaControls);\n>  \n>  \treturn 0;\n>  }\n> @@ -200,7 +207,8 @@ void IPARkISP1::stop()\n>  }\n>  \n>  int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,\n> -\t\t\t [[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig)\n> +\t\t\t [[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig,\n> +\t\t\t ControlInfoMap *ipaControls)\n>  {\n>  \tsensorControls_ = ipaConfig.sensorControls;\n>  \n> @@ -230,6 +238,9 @@ int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,\n>  \tcontext_.configuration.sensor.size = info.outputSize;\n>  \tcontext_.configuration.sensor.lineDuration = info.minLineLength * 1.0s / info.pixelRate;\n>  \n> +\t/* Update the camera controls using the new sensor settings. */\n> +\tupdateControls(info, sensorControls_, ipaControls);\n> +\n>  \t/*\n>  \t * When the AGC computes the new exposure values for a frame, it needs\n>  \t * to know the limits for shutter speed and analogue gain.\n> @@ -332,6 +343,42 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId\n>  \tmetadataReady.emit(frame, metadata);\n>  }\n>  \n> +void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo,\n> +\t\t\t       const ControlInfoMap &sensorControls,\n> +\t\t\t       ControlInfoMap *ipaControls)\n> +{\n> +\tControlInfoMap::Map ctrlMap = rkisp1Controls;\n> +\n> +\t/*\n> +\t * Compute the frame duration limits.\n> +\t *\n> +\t * The frame length is computed assuming a fixed line length combined\n> +\t * with the vertical frame sizes.\n> +\t */\n> +\tconst ControlInfo &v4l2HBlank = sensorControls.find(V4L2_CID_HBLANK)->second;\n> +\tuint32_t hblank = v4l2HBlank.def().get<int32_t>();\n> +\tuint32_t lineLength = sensorInfo.outputSize.width + hblank;\n> +\n> +\tconst ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second;\n> +\tstd::array<uint32_t, 3> frameHeights{\n> +\t\tv4l2VBlank.min().get<int32_t>() + sensorInfo.outputSize.height,\n> +\t\tv4l2VBlank.max().get<int32_t>() + sensorInfo.outputSize.height,\n> +\t\tv4l2VBlank.def().get<int32_t>() + sensorInfo.outputSize.height,\n> +\t};\n> +\n> +\tstd::array<int64_t, 3> frameDurations;\n> +\tfor (unsigned int i = 0; i < frameHeights.size(); ++i) {\n> +\t\tuint64_t frameSize = lineLength * frameHeights[i];\n> +\t\tframeDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U);\n> +\t}\n> +\n> +\tctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0],\n> +\t\t\t\t\t\t\t      frameDurations[1],\n> +\t\t\t\t\t\t\t      frameDurations[2]);\n> +\n> +\t*ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls);\n> +}\n> +\n>  void IPARkISP1::setControls(unsigned int frame)\n>  {\n>  \t/*\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index e946ccc4c930..231b16eca110 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -347,8 +347,15 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)\n>  \t\tipaTuningFile = std::string(configFromEnv);\n>  \t}\n>  \n> -\tint ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,\n> -\t\t\t     &controlInfo_);\n> +\tIPACameraSensorInfo sensorInfo{};\n> +\tint ret = sensor_->sensorInfo(&sensorInfo);\n> +\tif (ret) {\n> +\t\tLOG(RkISP1, Error) << \"Camera sensor information not available\";\n> +\t\treturn ret;\n> +\t}\n> +\n> +\tret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision,\n> +\t\t\t sensorInfo, sensor_->controls(), &controlInfo_);\n>  \tif (ret < 0) {\n>  \t\tLOG(RkISP1, Error) << \"IPA initialization failure\";\n>  \t\treturn ret;\n> @@ -718,14 +725,12 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n>  \tipa::rkisp1::IPAConfigInfo ipaConfig{};\n>  \n>  \tret = data->sensor_->sensorInfo(&ipaConfig.sensorInfo);\n> -\tif (ret) {\n> -\t\tLOG(RkISP1, Error) << \"Camera sensor information not available\";\n> +\tif (ret)\n>  \t\treturn ret;\n> -\t}\n>  \n>  \tipaConfig.sensorControls = data->sensor_->controls();\n>  \n> -\tret = data->ipa_->configure(ipaConfig, streamConfig);\n> +\tret = data->ipa_->configure(ipaConfig, streamConfig, &data->controlInfo_);\n>  \tif (ret) {\n>  \t\tLOG(RkISP1, Error) << \"failed configuring IPA (\" << ret << \")\";\n>  \t\treturn ret;","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 9425FBDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 23 Nov 2022 14:39:20 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 01DA16331A;\n\tWed, 23 Nov 2022 15:39:20 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C29CE63311\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Nov 2022 15:39:18 +0100 (CET)","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 22368890;\n\tWed, 23 Nov 2022 15:39:18 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669214360;\n\tbh=YoZlvSbzWaLM+fMVPxKgZD53OBzc5lYUOW6kguF0HME=;\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=2ISRq5EYxexnPzfc6SaX37SNpqMgbHcL4FW5YYqLv+JW6NcFfggjTfRiuguA/UjbA\n\tEAAIjCPhDCPBKC7h6fC42ulnyZgHB1CEaZZ3/IuShHZkrzTIe1PKhkDLMNLPBwyZf/\n\tvkk7FulkiGX6tPOCu8Lq2cbC5ClUjjU6yHSyO9/5EnA22HKQrZ3LYfF6pNYplOiyzB\n\t4dfZnrT4xkHcGghULHQ5f17gG4TeF9+R3MaP6Bcv77+tVs2g2rCUWXpPgb8fAwPcQk\n\tuXFjItn6JTkeJN8SnNmJxyIpZCxjQoKn/Yuu/uuOYFogCWliF9FWF/Cloh56jNLTRt\n\t8qkOHT3Vtck8g==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1669214358;\n\tbh=YoZlvSbzWaLM+fMVPxKgZD53OBzc5lYUOW6kguF0HME=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=llOwf6Co48AZu+M4H7uFlb0ylKCh80DASok2sNhNRsomfCSCMcVbamY6ZzdVX4paC\n\tcoUfO9uFDE57qZcVVY53QC05ALETXfz4pdEnmlz8op2llvpNnFK09cy4g/pdAg+9ch\n\ts6oF+qrX+4u99BFiLctbOuCrCv9sasdgF45QsBok="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"llOwf6Co\"; dkim-atps=neutral","Date":"Wed, 23 Nov 2022 16:39:02 +0200","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<Y34whmfRiDqQiIzR@pendragon.ideasonboard.com>","References":"<20221123134346.129807-1-jacopo@jmondi.org>\n\t<20221123134346.129807-5-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221123134346.129807-5-jacopo@jmondi.org>","Subject":"Re: [libcamera-devel] [PATCH v2 4/4] ipa: rkisp1: add\n\tFrameDurationLimits control","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":"Nicholas Roth <nicholas@rothemail.net>,\n\tlibcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]