[{"id":14047,"web_url":"https://patchwork.libcamera.org/comment/14047/","msgid":"<20201204113545.ybdczltx7s4ekkuc@uno.localdomain>","date":"2020-12-04T11:35:45","subject":"Re: [libcamera-devel] [PATCH v2 3/3] pipeline: ipa: raspberrypi:\n\tPass controls to IPA on start","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Naush,\n\nOn Thu, Nov 26, 2020 at 09:51:26AM +0000, Naushir Patuck wrote:\n> Forward any controls passed into the pipeline handler to the IPA.\n> The IPA then sets up the Raspberry Pi controller with these settings\n> appropriately, and passes back any V4L2 sensor controls that need\n> to be applied.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> Tested-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  include/libcamera/ipa/raspberrypi.h           |  1 +\n>  src/ipa/raspberrypi/raspberrypi.cpp           | 53 ++++++++++++-------\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 14 ++++-\n>  3 files changed, 47 insertions(+), 21 deletions(-)\n>\n> diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h\n> index 2b55dbfc..c91a14bd 100644\n> --- a/include/libcamera/ipa/raspberrypi.h\n> +++ b/include/libcamera/ipa/raspberrypi.h\n> @@ -21,6 +21,7 @@ enum ConfigParameters {\n>  \tIPA_CONFIG_STAGGERED_WRITE = (1 << 1),\n>  \tIPA_CONFIG_SENSOR = (1 << 2),\n>  \tIPA_CONFIG_DROP_FRAMES = (1 << 3),\n> +\tIPA_CONFIG_STARTUP = (1 << 4)\n>  };\n>\n>  enum Operations {\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\n> index 7a07b477..c09b3d07 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -77,8 +77,7 @@ public:\n>  \t}\n>\n>  \tint init(const IPASettings &settings) override;\n> -\tint start([[maybe_unused]] const IPAOperationData &ipaConfig,\n> -\t\t  [[maybe_unused]] IPAOperationData *result) override { return 0; }\n> +\tint start(const IPAOperationData &ipaConfig, IPAOperationData *result) override;\n>  \tvoid stop() override {}\n>\n>  \tvoid configure(const CameraSensorInfo &sensorInfo,\n> @@ -154,6 +153,35 @@ int IPARPi::init(const IPASettings &settings)\n>  \treturn 0;\n>  }\n>\n> +int IPARPi::start(const IPAOperationData &ipaConfig, IPAOperationData *result)\n> +{\n> +\tRPiController::Metadata metadata;\n> +\n> +\tresult->operation = 0;\n\nDo you need to assert (result) ?\nIt might help catch development errors\n\n> +\tif (ipaConfig.operation & RPi::IPA_CONFIG_STARTUP) {\n> +\t\t/* We have been given some controls to action before start. */\n> +\t\tqueueRequest(ipaConfig.controls[0]);\n\nThis seems to assume controls[0] is always populated...\n\n> +\t}\n> +\n> +\tcontroller_.SwitchMode(mode_, &metadata);\n> +\n> +\t/* SwitchMode may supply updated exposure/gain values to use. */\n> +\tAgcStatus agcStatus;\n> +\tagcStatus.shutter_time = 0.0;\n> +\tagcStatus.analogue_gain = 0.0;\n> +\n> +\t/* SwitchMode may supply updated exposure/gain values to use. */\n> +\tmetadata.Get(\"agc.status\", agcStatus);\n> +\tif (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain != 0.0) {\n> +\t\tControlList ctrls(unicamCtrls_);\n> +\t\tapplyAGC(&agcStatus, ctrls);\n> +\t\tresult->controls.emplace_back(ctrls);\n> +\t\tresult->operation |= RPi::IPA_CONFIG_SENSOR;\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n>  void IPARPi::setMode(const CameraSensorInfo &sensorInfo)\n>  {\n>  \tmode_.bitdepth = sensorInfo.bitsPerPixel;\n> @@ -229,7 +257,6 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,\n>  \t\tresult->data.push_back(gainDelay);\n>  \t\tresult->data.push_back(exposureDelay);\n>  \t\tresult->data.push_back(sensorMetadata);\n> -\n\nUnrelated, but nothing big\n\n>  \t\tresult->operation |= RPi::IPA_CONFIG_STAGGERED_WRITE;\n>  \t}\n>\n> @@ -285,11 +312,6 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,\n>  \tresult->data.push_back(dropFrame);\n>  \tresult->operation |= RPi::IPA_CONFIG_DROP_FRAMES;\n>\n> -\t/* These zero values mean not program anything (unless overwritten). */\n> -\tstruct AgcStatus agcStatus;\n> -\tagcStatus.shutter_time = 0.0;\n> -\tagcStatus.analogue_gain = 0.0;\n> -\n>  \tif (!controllerInit_) {\n>  \t\t/* Load the tuning file for this sensor. */\n>  \t\tcontroller_.Read(tuningFile_.c_str());\n> @@ -297,20 +319,13 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,\n>  \t\tcontrollerInit_ = true;\n>\n>  \t\t/* Supply initial values for gain and exposure. */\n> +\t\tControlList ctrls(unicamCtrls_);\n> +\t\tAgcStatus agcStatus;\n>  \t\tagcStatus.shutter_time = DefaultExposureTime;\n>  \t\tagcStatus.analogue_gain = DefaultAnalogueGain;\n> -\t}\n> -\n> -\tRPiController::Metadata metadata;\n> -\tcontroller_.SwitchMode(mode_, &metadata);\n\nI trust your judgment on this part that moves the mode switch to\nstart() unconditionally\n\n> -\n> -\t/* SwitchMode may supply updated exposure/gain values to use. */\n> -\tmetadata.Get(\"agc.status\", agcStatus);\n> -\tif (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain != 0.0) {\n> -\t\tControlList ctrls(unicamCtrls_);\n>  \t\tapplyAGC(&agcStatus, ctrls);\n> -\t\tresult->controls.push_back(ctrls);\n>\n> +\t\tresult->controls.emplace_back(ctrls);\n>  \t\tresult->operation |= RPi::IPA_CONFIG_SENSOR;\n>  \t}\n>\n> @@ -843,7 +858,7 @@ void IPARPi::processStats(unsigned int bufferId)\n>\n>  \t\tIPAOperationData op;\n>  \t\top.operation = RPi::IPA_ACTION_V4L2_SET_STAGGERED;\n> -\t\top.controls.push_back(ctrls);\n> +\t\top.controls.emplace_back(ctrls);\n>  \t\tqueueFrameAction.emit(0, op);\n>  \t}\n>  }\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 29bcef07..3eb8c190 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -748,7 +748,10 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont\n>\n>  \t/* Start the IPA. */\n>  \tIPAOperationData ipaConfig = {}, result = {};\n> -\tipaConfig.controls.emplace_back(*controls);\n> +\tif (controls) {\n> +\t\tipaConfig.operation = RPi::IPA_CONFIG_STARTUP;\n> +\t\tipaConfig.controls.emplace_back(*controls);\n> +\t}\n>  \tret = data->ipa_->start(ipaConfig, &result);\n>  \tif (ret) {\n>  \t\tLOG(RPI, Error)\n> @@ -757,6 +760,14 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont\n>  \t\treturn ret;\n>  \t}\n>\n> +\t/* Apply any gain/exposure settings that the IPA may have passed back. */\n> +\tASSERT(data->staggeredCtrl_);\n> +\tif (result.operation & RPi::IPA_CONFIG_SENSOR) {\n> +\t\tconst ControlList &ctrls = result.controls[0];\n> +\t\tif (!data->staggeredCtrl_.set(ctrls))\n> +\t\t\tLOG(RPI, Error) << \"V4L2 staggered set failed\";\n> +\t}\n> +\n>  \t/*\n>  \t * IPA configure may have changed the sensor flips - hence the bayer\n>  \t * order. Get the sensor format and set the ISP input now.\n> @@ -777,7 +788,6 @@ int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *cont\n>  \t * starting. First check that the staggered ctrl has been initialised\n>  \t * by configure().\n>  \t */\n> -\tASSERT(data->staggeredCtrl_);\n>  \tdata->staggeredCtrl_.reset();\n>  \tdata->staggeredCtrl_.write();\n>  \tdata->expectedSequence_ = 0;\n> --\n> 2.25.1\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 C2188BE177\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  4 Dec 2020 11:35:40 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C59D635F0;\n\tFri,  4 Dec 2020 12:35:40 +0100 (CET)","from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 27F86634C6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  4 Dec 2020 12:35:39 +0100 (CET)","from uno.localdomain (93-34-118-233.ip49.fastwebnet.it\n\t[93.34.118.233]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay12.mail.gandi.net (Postfix) with ESMTPSA id AC951200008;\n\tFri,  4 Dec 2020 11:35:38 +0000 (UTC)"],"Date":"Fri, 4 Dec 2020 12:35:45 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20201204113545.ybdczltx7s4ekkuc@uno.localdomain>","References":"<20201126095126.997055-1-naush@raspberrypi.com>\n\t<20201126095126.997055-3-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201126095126.997055-3-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v2 3/3] pipeline: ipa: raspberrypi:\n\tPass controls to IPA on start","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":14051,"web_url":"https://patchwork.libcamera.org/comment/14051/","msgid":"<CAEmqJPrWWvUfhbE8Q7iVc1TCy1=ssD_9rFos49PXBUMWj0r4Qg@mail.gmail.com>","date":"2020-12-04T13:20:25","subject":"Re: [libcamera-devel] [PATCH v2 3/3] pipeline: ipa: raspberrypi:\n\tPass controls to IPA on start","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Jacopo,\n\nThank you for your review comments.\n\nOn Fri, 4 Dec 2020 at 11:35, Jacopo Mondi <jacopo@jmondi.org> wrote:\n\n> Hi Naush,\n>\n> On Thu, Nov 26, 2020 at 09:51:26AM +0000, Naushir Patuck wrote:\n> > Forward any controls passed into the pipeline handler to the IPA.\n> > The IPA then sets up the Raspberry Pi controller with these settings\n> > appropriately, and passes back any V4L2 sensor controls that need\n> > to be applied.\n> >\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> > Tested-by: David Plowman <david.plowman@raspberrypi.com>\n> > ---\n> >  include/libcamera/ipa/raspberrypi.h           |  1 +\n> >  src/ipa/raspberrypi/raspberrypi.cpp           | 53 ++++++++++++-------\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 14 ++++-\n> >  3 files changed, 47 insertions(+), 21 deletions(-)\n> >\n> > diff --git a/include/libcamera/ipa/raspberrypi.h\n> b/include/libcamera/ipa/raspberrypi.h\n> > index 2b55dbfc..c91a14bd 100644\n> > --- a/include/libcamera/ipa/raspberrypi.h\n> > +++ b/include/libcamera/ipa/raspberrypi.h\n> > @@ -21,6 +21,7 @@ enum ConfigParameters {\n> >       IPA_CONFIG_STAGGERED_WRITE = (1 << 1),\n> >       IPA_CONFIG_SENSOR = (1 << 2),\n> >       IPA_CONFIG_DROP_FRAMES = (1 << 3),\n> > +     IPA_CONFIG_STARTUP = (1 << 4)\n> >  };\n> >\n> >  enum Operations {\n> > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp\n> b/src/ipa/raspberrypi/raspberrypi.cpp\n> > index 7a07b477..c09b3d07 100644\n> > --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> > +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> > @@ -77,8 +77,7 @@ public:\n> >       }\n> >\n> >       int init(const IPASettings &settings) override;\n> > -     int start([[maybe_unused]] const IPAOperationData &ipaConfig,\n> > -               [[maybe_unused]] IPAOperationData *result) override {\n> return 0; }\n> > +     int start(const IPAOperationData &ipaConfig, IPAOperationData\n> *result) override;\n> >       void stop() override {}\n> >\n> >       void configure(const CameraSensorInfo &sensorInfo,\n> > @@ -154,6 +153,35 @@ int IPARPi::init(const IPASettings &settings)\n> >       return 0;\n> >  }\n> >\n> > +int IPARPi::start(const IPAOperationData &ipaConfig, IPAOperationData\n> *result)\n> > +{\n> > +     RPiController::Metadata metadata;\n> > +\n> > +     result->operation = 0;\n>\n> Do you need to assert (result) ?\n> It might help catch development errors\n>\n\nGiven the only caller of this is the Raspberry Pi pipeline handler, result\nwill always be valid.  However, always good to be extra safe, so I will add\nan assertion as suggested.\n\n\n>\n> > +     if (ipaConfig.operation & RPi::IPA_CONFIG_STARTUP) {\n> > +             /* We have been given some controls to action before\n> start. */\n> > +             queueRequest(ipaConfig.controls[0]);\n>\n> This seems to assume controls[0] is always populated...\n>\n\nThe pipeline handler will only set RPi::IPA_CONFIG_STARTUP when a list of\nstartup controls is available.  Thus, ipaConfig.controls[0] is guaranteed\nto be populated within the if() clause.\n\n\n>\n> > +     }\n> > +\n> > +     controller_.SwitchMode(mode_, &metadata);\n> > +\n> > +     /* SwitchMode may supply updated exposure/gain values to use. */\n> > +     AgcStatus agcStatus;\n> > +     agcStatus.shutter_time = 0.0;\n> > +     agcStatus.analogue_gain = 0.0;\n> > +\n> > +     /* SwitchMode may supply updated exposure/gain values to use. */\n> > +     metadata.Get(\"agc.status\", agcStatus);\n> > +     if (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain !=\n> 0.0) {\n> > +             ControlList ctrls(unicamCtrls_);\n> > +             applyAGC(&agcStatus, ctrls);\n> > +             result->controls.emplace_back(ctrls);\n> > +             result->operation |= RPi::IPA_CONFIG_SENSOR;\n> > +     }\n> > +\n> > +     return 0;\n> > +}\n> > +\n> >  void IPARPi::setMode(const CameraSensorInfo &sensorInfo)\n> >  {\n> >       mode_.bitdepth = sensorInfo.bitsPerPixel;\n> > @@ -229,7 +257,6 @@ void IPARPi::configure(const CameraSensorInfo\n> &sensorInfo,\n> >               result->data.push_back(gainDelay);\n> >               result->data.push_back(exposureDelay);\n> >               result->data.push_back(sensorMetadata);\n> > -\n>\n> Unrelated, but nothing big\n>\n> >               result->operation |= RPi::IPA_CONFIG_STAGGERED_WRITE;\n> >       }\n> >\n> > @@ -285,11 +312,6 @@ void IPARPi::configure(const CameraSensorInfo\n> &sensorInfo,\n> >       result->data.push_back(dropFrame);\n> >       result->operation |= RPi::IPA_CONFIG_DROP_FRAMES;\n> >\n> > -     /* These zero values mean not program anything (unless\n> overwritten). */\n> > -     struct AgcStatus agcStatus;\n> > -     agcStatus.shutter_time = 0.0;\n> > -     agcStatus.analogue_gain = 0.0;\n> > -\n> >       if (!controllerInit_) {\n> >               /* Load the tuning file for this sensor. */\n> >               controller_.Read(tuningFile_.c_str());\n> > @@ -297,20 +319,13 @@ void IPARPi::configure(const CameraSensorInfo\n> &sensorInfo,\n> >               controllerInit_ = true;\n> >\n> >               /* Supply initial values for gain and exposure. */\n> > +             ControlList ctrls(unicamCtrls_);\n> > +             AgcStatus agcStatus;\n> >               agcStatus.shutter_time = DefaultExposureTime;\n> >               agcStatus.analogue_gain = DefaultAnalogueGain;\n> > -     }\n> > -\n> > -     RPiController::Metadata metadata;\n> > -     controller_.SwitchMode(mode_, &metadata);\n>\n> I trust your judgment on this part that moves the mode switch to\n> start() unconditionally\n>\n\nYes, this is correct.  The rationale is that our controller_.SwitchMode()\nwill return out the ISP and sensor configuration to apply before streaming,\nso must happen on every start.\n\nRegards,\nNaush\n\n\n\n>\n> > -\n> > -     /* SwitchMode may supply updated exposure/gain values to use. */\n> > -     metadata.Get(\"agc.status\", agcStatus);\n> > -     if (agcStatus.shutter_time != 0.0 && agcStatus.analogue_gain !=\n> 0.0) {\n> > -             ControlList ctrls(unicamCtrls_);\n> >               applyAGC(&agcStatus, ctrls);\n> > -             result->controls.push_back(ctrls);\n> >\n> > +             result->controls.emplace_back(ctrls);\n> >               result->operation |= RPi::IPA_CONFIG_SENSOR;\n> >       }\n> >\n> > @@ -843,7 +858,7 @@ void IPARPi::processStats(unsigned int bufferId)\n> >\n> >               IPAOperationData op;\n> >               op.operation = RPi::IPA_ACTION_V4L2_SET_STAGGERED;\n> > -             op.controls.push_back(ctrls);\n> > +             op.controls.emplace_back(ctrls);\n> >               queueFrameAction.emit(0, op);\n> >       }\n> >  }\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index 29bcef07..3eb8c190 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -748,7 +748,10 @@ int PipelineHandlerRPi::start(Camera *camera,\n> [[maybe_unused]] ControlList *cont\n> >\n> >       /* Start the IPA. */\n> >       IPAOperationData ipaConfig = {}, result = {};\n> > -     ipaConfig.controls.emplace_back(*controls);\n> > +     if (controls) {\n> > +             ipaConfig.operation = RPi::IPA_CONFIG_STARTUP;\n> > +             ipaConfig.controls.emplace_back(*controls);\n> > +     }\n> >       ret = data->ipa_->start(ipaConfig, &result);\n> >       if (ret) {\n> >               LOG(RPI, Error)\n> > @@ -757,6 +760,14 @@ int PipelineHandlerRPi::start(Camera *camera,\n> [[maybe_unused]] ControlList *cont\n> >               return ret;\n> >       }\n> >\n> > +     /* Apply any gain/exposure settings that the IPA may have passed\n> back. */\n> > +     ASSERT(data->staggeredCtrl_);\n> > +     if (result.operation & RPi::IPA_CONFIG_SENSOR) {\n> > +             const ControlList &ctrls = result.controls[0];\n> > +             if (!data->staggeredCtrl_.set(ctrls))\n> > +                     LOG(RPI, Error) << \"V4L2 staggered set failed\";\n> > +     }\n> > +\n> >       /*\n> >        * IPA configure may have changed the sensor flips - hence the\n> bayer\n> >        * order. Get the sensor format and set the ISP input now.\n> > @@ -777,7 +788,6 @@ int PipelineHandlerRPi::start(Camera *camera,\n> [[maybe_unused]] ControlList *cont\n> >        * starting. First check that the staggered ctrl has been\n> initialised\n> >        * by configure().\n> >        */\n> > -     ASSERT(data->staggeredCtrl_);\n> >       data->staggeredCtrl_.reset();\n> >       data->staggeredCtrl_.write();\n> >       data->expectedSequence_ = 0;\n> > --\n> > 2.25.1\n> >\n> > _______________________________________________\n> > libcamera-devel mailing list\n> > libcamera-devel@lists.libcamera.org\n> > https://lists.libcamera.org/listinfo/libcamera-devel\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 F03F6BE176\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  4 Dec 2020 13:20:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BE96F635EF;\n\tFri,  4 Dec 2020 14:20:45 +0100 (CET)","from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com\n\t[IPv6:2a00:1450:4864:20::12d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C40C1635D0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  4 Dec 2020 14:20:43 +0100 (CET)","by mail-lf1-x12d.google.com with SMTP id u18so7568460lfd.9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 04 Dec 2020 05:20:43 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"suGj9KQH\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=c722cCmcCy5qgvEWDBnRYHjIyrMSea1r4+VL28Pq114=;\n\tb=suGj9KQHVBuVePuTg9BoxBzsmImiU8c6VnNaJgj4jbfrTyD4aL+Qeqid2Srw2ZKeRe\n\tm9dW8QsPzLqg4iNNqFX0IgaDOyjmOHzXKrh8hlxQd2b4VcyBnpt7kCRy7yQrFDi3dmdm\n\tmsF6p6HUPrVrVB8Ea2QeZrZCMfXXRmjv4K4/Cg+LY5VVBNH/5iYSYeL/k4fAQYyDNWoo\n\tM5kjkJ3cSTjWFWp+oEL6UvY/iEb09iMCf0I/oEFhesDUHH9TIPYNR6uPQ6QU/JahNEKc\n\tT+TWA+eLef5Q3Z29nYPkh//vO75mFmXMZLJOjvNAObzDsc4+tGx7w874wfGQHKRt0W0z\n\tnBqg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=c722cCmcCy5qgvEWDBnRYHjIyrMSea1r4+VL28Pq114=;\n\tb=RwfO/tNB9WNco16GYP2nW1lOurOHHRYRAEOd5f6ciTpKhUJLN6JML64bA1+VWCMWfk\n\tx+AbJMVStx0sF1ZWtCavd1Vg/msKCooVySyoVrjLDXFy9yx7CpaooxBRuQ1VgrwOkzG2\n\toh3gMVZxfSyyycz/cvEA/QYUu73BWPvx5g6N8eqKV+vJZw/wID5C1RR83aG2B2S6c1bw\n\tZ1eTHdG8QuonGr/sChUNGtDOLk7fRMPJcPkuiC2C6cM9GleY/DIb8pt4BxrEwzuJ8Eo0\n\t+ecFodA0A3h3n45BoOVrMSFxhJLCWq+q/wYQYTmRuROUNlM9qGDAaGY7eNgKGn6gRxUz\n\t+rqg==","X-Gm-Message-State":"AOAM532ocwH/TtLCpEhIJgKvE+haPbpzTVKmDITnQJt3V2didBCwFhXp\n\tgqzQFf3Ps0LnZpfl75BZeqZyvBma97gtkrf6eQxmkg==","X-Google-Smtp-Source":"ABdhPJxXcdUO0InrjxuDjVGqwUleZmr8ZtCTk7DJlyRtX55LgwJ5S8pOCkzNUJOOIQB2gV4xHGKwtgg4OnlQw9+nY+o=","X-Received":"by 2002:a05:6512:3e6:: with SMTP id\n\tn6mr3359970lfq.413.1607088042906; \n\tFri, 04 Dec 2020 05:20:42 -0800 (PST)","MIME-Version":"1.0","References":"<20201126095126.997055-1-naush@raspberrypi.com>\n\t<20201126095126.997055-3-naush@raspberrypi.com>\n\t<20201204113545.ybdczltx7s4ekkuc@uno.localdomain>","In-Reply-To":"<20201204113545.ybdczltx7s4ekkuc@uno.localdomain>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Fri, 4 Dec 2020 13:20:25 +0000","Message-ID":"<CAEmqJPrWWvUfhbE8Q7iVc1TCy1=ssD_9rFos49PXBUMWj0r4Qg@mail.gmail.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Subject":"Re: [libcamera-devel] [PATCH v2 3/3] pipeline: ipa: raspberrypi:\n\tPass controls to IPA on start","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"multipart/mixed;\n\tboundary=\"===============5141067103223739737==\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]