[{"id":27684,"web_url":"https://patchwork.libcamera.org/comment/27684/","msgid":"<CAEmqJPpsP3StenVgu7E1yv7HrWjCc6o4P0HdsgGz-2sFaC0u=A@mail.gmail.com>","date":"2023-08-22T12:46:08","subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: rpi: agc: Add\n\tAgcChannelConstraint class","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi David,\n\nThank you for your work.\n\nOn Mon, 31 Jul 2023 at 10:46, David Plowman via libcamera-devel\n<libcamera-devel@lists.libcamera.org> wrote:\n>\n> A channel constraint is somewhat similar to the upper/lower bound\n> constraints that we use elsewhere, but these constraints apply between\n> multiple AGC channels. For example, it lets you say things like \"don't\n> let the channel 1 total exposure be more than 8x that of channel 0\",\n> and so on. By using both an upper and lower bound constraint, you\n> could fix one AGC channel always to be a fixed ratio of another.\n>\n> Also read a vector of them (if present) when loading the tuning file.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  src/ipa/rpi/controller/rpi/agc_channel.cpp | 42 ++++++++++++++++++++++\n>  src/ipa/rpi/controller/rpi/agc_channel.h   | 10 ++++++\n>  2 files changed, 52 insertions(+)\n>\n> diff --git a/src/ipa/rpi/controller/rpi/agc_channel.cpp b/src/ipa/rpi/controller/rpi/agc_channel.cpp\n> index ddec611f..ed8a3b30 100644\n> --- a/src/ipa/rpi/controller/rpi/agc_channel.cpp\n> +++ b/src/ipa/rpi/controller/rpi/agc_channel.cpp\n> @@ -173,6 +173,42 @@ readConstraintModes(std::map<std::string, AgcConstraintMode> &constraintModes,\n>         return { 0, first };\n>  }\n>\n> +int AgcChannelConstraint::read(const libcamera::YamlObject &params)\n> +{\n> +       std::string boundString = params[\"bound\"].get<std::string>(\"\");\n> +       transform(boundString.begin(), boundString.end(),\n> +                 boundString.begin(), ::toupper);\n> +       if (boundString != \"UPPER\" && boundString != \"LOWER\") {\n> +               LOG(RPiAgc, Error) << \"AGC channelconstraint type should be UPPER or LOWER\";\n> +               return -EINVAL;\n> +       }\n> +       bound = boundString == \"UPPER\" ? Bound::UPPER : Bound::LOWER;\n> +\n> +       auto value = params[\"factor\"].get<double>();\n> +       if (!value)\n> +               return -EINVAL;\n> +       factor = *value;\n> +\n> +       return 0;\n> +}\n> +\n> +int readChannelConstraints(std::vector<AgcChannelConstraint> channelConstraints,\n> +                          const libcamera::YamlObject &params)\n\nMake this function static?\n\n\n> +{\n> +       int ret = 0;\n> +\n> +       for (const auto &p : params.asList()) {\n> +               AgcChannelConstraint constraint;\n> +               ret = constraint.read(p);\n> +               if (ret)\n> +                       return ret;\n> +\n> +               channelConstraints.push_back(std::move(constraint));\n\nDo we need to move here?  Probably no practical difference though.\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n> +       }\n> +\n> +       return ret;\n> +}\n> +\n>  int AgcConfig::read(const libcamera::YamlObject &params)\n>  {\n>         LOG(RPiAgc, Debug) << \"AgcConfig\";\n> @@ -191,6 +227,12 @@ int AgcConfig::read(const libcamera::YamlObject &params)\n>         if (ret)\n>                 return ret;\n>\n> +       if (params.contains(\"channel_constraints\")) {\n> +               ret = readChannelConstraints(channelConstraints, params[\"channel_constraints\"]);\n> +               if (ret)\n> +                       return ret;\n> +       }\n> +\n>         ret = yTarget.read(params[\"y_target\"]);\n>         if (ret)\n>                 return ret;\n> diff --git a/src/ipa/rpi/controller/rpi/agc_channel.h b/src/ipa/rpi/controller/rpi/agc_channel.h\n> index 0e3d44b0..446125ef 100644\n> --- a/src/ipa/rpi/controller/rpi/agc_channel.h\n> +++ b/src/ipa/rpi/controller/rpi/agc_channel.h\n> @@ -42,11 +42,21 @@ struct AgcConstraint {\n>\n>  typedef std::vector<AgcConstraint> AgcConstraintMode;\n>\n> +struct AgcChannelConstraint {\n> +       enum class Bound { LOWER = 0,\n> +                          UPPER = 1 };\n> +       Bound bound;\n> +       unsigned int channel;\n> +       double factor;\n> +       int read(const libcamera::YamlObject &params);\n> +};\n> +\n>  struct AgcConfig {\n>         int read(const libcamera::YamlObject &params);\n>         std::map<std::string, AgcMeteringMode> meteringModes;\n>         std::map<std::string, AgcExposureMode> exposureModes;\n>         std::map<std::string, AgcConstraintMode> constraintModes;\n> +       std::vector<AgcChannelConstraint> channelConstraints;\n>         Pwl yTarget;\n>         double speed;\n>         uint16_t startupFrames;\n> --\n> 2.30.2\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 7057FBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 22 Aug 2023 12:46:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5F6B8627E0;\n\tTue, 22 Aug 2023 14:46:16 +0200 (CEST)","from mail-yw1-x1133.google.com (mail-yw1-x1133.google.com\n\t[IPv6:2607:f8b0:4864:20::1133])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 63A7C6055E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 22 Aug 2023 14:46:15 +0200 (CEST)","by mail-yw1-x1133.google.com with SMTP id\n\t00721157ae682-58fb8963617so33829527b3.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 22 Aug 2023 05:46:15 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1692708376;\n\tbh=jfBSm7ikb4pr9YmdDrUM1zAMETOEDa08DSwIex/8B1U=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=cu5yfy3eyZhXi6/Izn25DQXaaLy/J7aktO4KzUrzQ51O3ELUtiuiDFGtEOCG838Ua\n\txjpZPsf/endXrhhu6VsKiiK7Kb1yMKYeQIL0aTGUwKz0Lndo2eCMPznpxi81hXDXc1\n\teWEj18WhlOr1bd0i0m9oRIw3rf9I6NPiaLaiyOS+PGESvYRWfiCk+1YhIDxQSW6lNp\n\tFUTMx2Tg0BENXHvurcoRI4uaLCCHyZFHkxZ/gZzgmLkEXprjdXHBro8zEMinwT0qUo\n\tLPwFQSqxXlgpwlUUQ6ZNWnet4UWPu6LGnoTL0AWGeJZs+0/xJAuDHvWGvkFjDGaH3E\n\tx6uMCpJIXH8BA==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1692708374; x=1693313174;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=JOgn2792rnwamD8joFodpRGKg+aDf99XaLhnKxZnt+E=;\n\tb=RkpivHltcpcGoTg7HLnIg0oxcz+f5tsYe2Z7+6Jdv4zdMcPmwOQH8vyeelYO74Rlmq\n\tJEnZBuCXn+MjjZ6yAgqKKdZGJ/9xA/CfnaD9TmoPus9NIBzwCmg0DGp+kw4fuZnJg2JM\n\tdICelFzH1XMPsTlVW9Ie/phazBoPFD5KWzvGibCJnFIkrcnCaHeU6+U9JIugCT9Vpr9J\n\tDzmYcV5ryEJdeWFb8WAeCp6pTPwc1TTCYd/AOmpFcFZ0xxLSVeoC/zDOYYZ8nFR72+DK\n\tZA6N8zkeKCvM9Im6QyMDw+XCnKgoZbFAxMlUiAM4+OUawNhqz6nBXPvrZ5H+bPbfV8OK\n\tArAw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"RkpivHlt\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20221208; t=1692708374; x=1693313174;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=JOgn2792rnwamD8joFodpRGKg+aDf99XaLhnKxZnt+E=;\n\tb=gfbKGzn74W7RtyWVFHzONGwe8zFOoU6srJTNgJ4ggifomFfEEXtiT7RTHvYTIm9Xoe\n\tSn4EH3fubpVkVSNGHLRLgQcNGd//E+LKHFaqJV6N/h12CnYo1AGctf6cJc0RmC3ovYlq\n\tTRa9f6URZEwjUPwNF3l8Kyzr88b8CitcbAXNzmwceKz6VZZHio53y+L6mf3/WOYWdYHo\n\t51aZo3xutj+hz3zlTZjGxAMQuF4zLvsJwKfeXeBk4GtmnOT7cUaIIFoaMFHt86y18V3f\n\t+XlPJF1PcnVwvDJEMplciLtXFcPdCAbKuVd0DRmk+sqcXEUL50sIsuzPo6ztvwcjtP/E\n\tnNNg==","X-Gm-Message-State":"AOJu0YyCqjPjYnsi2uE9PFWgZnGYmuNGi7e7SuqmfMvDLxzf8TS9ZM1m\n\tmMluydlkHOqRJYfHsvkINqzpNf2n7E7Szl5+JPDby5dEu7RdWYdXWHg=","X-Google-Smtp-Source":"AGHT+IHx5UQ+ekHeZuMbgbLZfSPTDRcNVAhhITU1NsvzYiIwRldb9cr0R9R+3zmap0wvVp6uTZhCPPBEudU2fP2jGw8=","X-Received":"by 2002:a81:8882:0:b0:55a:3ce9:dc3d with SMTP id\n\ty124-20020a818882000000b0055a3ce9dc3dmr9675551ywf.13.1692708374113;\n\tTue, 22 Aug 2023 05:46:14 -0700 (PDT)","MIME-Version":"1.0","References":"<20230731094641.73646-1-david.plowman@raspberrypi.com>\n\t<20230731094641.73646-5-david.plowman@raspberrypi.com>","In-Reply-To":"<20230731094641.73646-5-david.plowman@raspberrypi.com>","Date":"Tue, 22 Aug 2023 13:46:08 +0100","Message-ID":"<CAEmqJPpsP3StenVgu7E1yv7HrWjCc6o4P0HdsgGz-2sFaC0u=A@mail.gmail.com>","To":"David Plowman <david.plowman@raspberrypi.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: rpi: agc: Add\n\tAgcChannelConstraint class","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":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":27690,"web_url":"https://patchwork.libcamera.org/comment/27690/","msgid":"<CAHW6GYKMqtx8_MOFR6zQ-0qqKVhG+1CSbWFU9V9XUXyzHi_nJw@mail.gmail.com>","date":"2023-08-23T09:48:02","subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: rpi: agc: Add\n\tAgcChannelConstraint class","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Naush\n\nThanks for the review.\n\nOn Tue, 22 Aug 2023 at 13:46, Naushir Patuck <naush@raspberrypi.com> wrote:\n>\n> Hi David,\n>\n> Thank you for your work.\n>\n> On Mon, 31 Jul 2023 at 10:46, David Plowman via libcamera-devel\n> <libcamera-devel@lists.libcamera.org> wrote:\n> >\n> > A channel constraint is somewhat similar to the upper/lower bound\n> > constraints that we use elsewhere, but these constraints apply between\n> > multiple AGC channels. For example, it lets you say things like \"don't\n> > let the channel 1 total exposure be more than 8x that of channel 0\",\n> > and so on. By using both an upper and lower bound constraint, you\n> > could fix one AGC channel always to be a fixed ratio of another.\n> >\n> > Also read a vector of them (if present) when loading the tuning file.\n> >\n> > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> > ---\n> >  src/ipa/rpi/controller/rpi/agc_channel.cpp | 42 ++++++++++++++++++++++\n> >  src/ipa/rpi/controller/rpi/agc_channel.h   | 10 ++++++\n> >  2 files changed, 52 insertions(+)\n> >\n> > diff --git a/src/ipa/rpi/controller/rpi/agc_channel.cpp b/src/ipa/rpi/controller/rpi/agc_channel.cpp\n> > index ddec611f..ed8a3b30 100644\n> > --- a/src/ipa/rpi/controller/rpi/agc_channel.cpp\n> > +++ b/src/ipa/rpi/controller/rpi/agc_channel.cpp\n> > @@ -173,6 +173,42 @@ readConstraintModes(std::map<std::string, AgcConstraintMode> &constraintModes,\n> >         return { 0, first };\n> >  }\n> >\n> > +int AgcChannelConstraint::read(const libcamera::YamlObject &params)\n> > +{\n> > +       std::string boundString = params[\"bound\"].get<std::string>(\"\");\n> > +       transform(boundString.begin(), boundString.end(),\n> > +                 boundString.begin(), ::toupper);\n> > +       if (boundString != \"UPPER\" && boundString != \"LOWER\") {\n> > +               LOG(RPiAgc, Error) << \"AGC channelconstraint type should be UPPER or LOWER\";\n> > +               return -EINVAL;\n> > +       }\n> > +       bound = boundString == \"UPPER\" ? Bound::UPPER : Bound::LOWER;\n> > +\n> > +       auto value = params[\"factor\"].get<double>();\n> > +       if (!value)\n> > +               return -EINVAL;\n> > +       factor = *value;\n> > +\n> > +       return 0;\n> > +}\n> > +\n> > +int readChannelConstraints(std::vector<AgcChannelConstraint> channelConstraints,\n> > +                          const libcamera::YamlObject &params)\n>\n> Make this function static?\n\nWill do.\n\n>\n>\n> > +{\n> > +       int ret = 0;\n> > +\n> > +       for (const auto &p : params.asList()) {\n> > +               AgcChannelConstraint constraint;\n> > +               ret = constraint.read(p);\n> > +               if (ret)\n> > +                       return ret;\n> > +\n> > +               channelConstraints.push_back(std::move(constraint));\n>\n> Do we need to move here?  Probably no practical difference though.\n\nYep, will change!\n\nThanks\nDavid\n\n>\n> Reviewed-by: Naushir Patuck <naush@raspberrypi.com>\n>\n> > +       }\n> > +\n> > +       return ret;\n> > +}\n> > +\n> >  int AgcConfig::read(const libcamera::YamlObject &params)\n> >  {\n> >         LOG(RPiAgc, Debug) << \"AgcConfig\";\n> > @@ -191,6 +227,12 @@ int AgcConfig::read(const libcamera::YamlObject &params)\n> >         if (ret)\n> >                 return ret;\n> >\n> > +       if (params.contains(\"channel_constraints\")) {\n> > +               ret = readChannelConstraints(channelConstraints, params[\"channel_constraints\"]);\n> > +               if (ret)\n> > +                       return ret;\n> > +       }\n> > +\n> >         ret = yTarget.read(params[\"y_target\"]);\n> >         if (ret)\n> >                 return ret;\n> > diff --git a/src/ipa/rpi/controller/rpi/agc_channel.h b/src/ipa/rpi/controller/rpi/agc_channel.h\n> > index 0e3d44b0..446125ef 100644\n> > --- a/src/ipa/rpi/controller/rpi/agc_channel.h\n> > +++ b/src/ipa/rpi/controller/rpi/agc_channel.h\n> > @@ -42,11 +42,21 @@ struct AgcConstraint {\n> >\n> >  typedef std::vector<AgcConstraint> AgcConstraintMode;\n> >\n> > +struct AgcChannelConstraint {\n> > +       enum class Bound { LOWER = 0,\n> > +                          UPPER = 1 };\n> > +       Bound bound;\n> > +       unsigned int channel;\n> > +       double factor;\n> > +       int read(const libcamera::YamlObject &params);\n> > +};\n> > +\n> >  struct AgcConfig {\n> >         int read(const libcamera::YamlObject &params);\n> >         std::map<std::string, AgcMeteringMode> meteringModes;\n> >         std::map<std::string, AgcExposureMode> exposureModes;\n> >         std::map<std::string, AgcConstraintMode> constraintModes;\n> > +       std::vector<AgcChannelConstraint> channelConstraints;\n> >         Pwl yTarget;\n> >         double speed;\n> >         uint16_t startupFrames;\n> > --\n> > 2.30.2\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 9BEEDBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 23 Aug 2023 09:48:16 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F2F5261F19;\n\tWed, 23 Aug 2023 11:48:15 +0200 (CEST)","from mail-qt1-x833.google.com (mail-qt1-x833.google.com\n\t[IPv6:2607:f8b0:4864:20::833])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6E04961E06\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Aug 2023 11:48:14 +0200 (CEST)","by mail-qt1-x833.google.com with SMTP id\n\td75a77b69052e-4103fdba0fbso30010961cf.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Aug 2023 02:48:14 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1692784096;\n\tbh=mFROfZ65BcE5fbQiaemNi+D50OnCHDFXWoP8RzMRz3s=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=bS6oWJFdI1lmK/sT5QWwY2IYQIP9CrrEm+gtG2DSxgAY04Lnigl+teukp3zzwhIxe\n\tuUP2y0ufo6qxx+kVDgN04OcugC27EabHYafj3WTmWdEREnMZOi+//wipNwTuGlvqGq\n\tEdCAyG/gFyD4GOSmcBEmEtRFc2fCfkg5g2LFu24VgRfa2jk9TNC+aRPmkAGDM8lNR2\n\t+DJa68bODBHNQ53AedSvGGRGDCXwnvNTtkolC0sPdw7sp6esXQkpk/gdtEM70SHhOf\n\tFvwuexlaooFxMmH1ULAX/fz1I7eOHTO7ZqS3cqCwhwJaK9zPVdVffspMF3hhAN2pcK\n\tGU2lyg9HSSp+A==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1692784093; x=1693388893;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=nmhb3NVH2DXQhXQ8qtIhl0KhPi03T+BpceiwsUyxWYs=;\n\tb=HkLW1oWofZgcLpuLF84nbLNJABg+RjjNgVfq68jWA+h75ac006DH2EtN+9LdNya8PM\n\t/wI7PQRX0mcDF0TpAgFxnqj0IINp5SWgJ0g59XryxD5x0ysCkxF6cUUogXN4plZ1IXXd\n\tFIHIzVw7SQU0s9K/s1O5TMIS3oq5YbGBP1wTMnS3PwThUyqKYDYS0s7WLfvqTox1g3Rp\n\tfVW+03kd4/j4+j72G9Qf9y3vJUfPPUpEu5ts4NdPFLBLNOEwRPYN9EQVUxFAbbKUWv3a\n\tsBFadBwThxR1uCl6OvhyUtaz0krPnWhcKC1ZT7XARTBAotrVDYZiE/j0w4+nPlr8eZPM\n\tvPfQ=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"HkLW1oWo\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20221208; t=1692784093; x=1693388893;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=nmhb3NVH2DXQhXQ8qtIhl0KhPi03T+BpceiwsUyxWYs=;\n\tb=WQaYsEkX1BAgmCyxbcZmfVKCyxowk79WgmPocFJO/OG8fO49WIIlFYooX3301Ct4s1\n\tq/gs3fWHByqjprKWnkOzjor5PLDzT86feg6SgMMlKMplICPWj6M1n8bKMWXe34QAmfqT\n\ti3kSfRgp6BSlxA2eYCS3MBnknOcbbavYelsdX/WaiqrL+YQIFiV5c0ve16yxkqFR7tYk\n\t2XxdJPv4UA14M7A4qGg6Hpxtk03oivZpEZ465grpTvbxxSdKJEdqdJxLAWD+/LYD8t08\n\tcELQ5cuasR5RBont2NiVr2OiPO7Fs0gGgyWitN53hZ/Xn9OENpN7nn0uCF6zfq9G2aJP\n\tve8Q==","X-Gm-Message-State":"AOJu0YxgrIf/RcGg2qb2L5ykbeTka6WpgdyTxpZIKv3/0xFjB7pbVd+u\n\t5TJpxxR4UzrcV6Lk2tBPG2Ey8PGhBwtTwNeiIEZ+Aumd+Asp9+h4","X-Google-Smtp-Source":"AGHT+IEdIzWcLQHKfg58CGV8qO3K/1s4ArSBhSEc7RCqq0oR0s+0TnxbRUIqmE6CxA/VJRcXQ3aqXx9TJyC9TehU5LA=","X-Received":"by 2002:a05:622a:44c:b0:410:9626:f0bf with SMTP id\n\to12-20020a05622a044c00b004109626f0bfmr9701056qtx.13.1692784093102;\n\tWed, 23 Aug 2023 02:48:13 -0700 (PDT)","MIME-Version":"1.0","References":"<20230731094641.73646-1-david.plowman@raspberrypi.com>\n\t<20230731094641.73646-5-david.plowman@raspberrypi.com>\n\t<CAEmqJPpsP3StenVgu7E1yv7HrWjCc6o4P0HdsgGz-2sFaC0u=A@mail.gmail.com>","In-Reply-To":"<CAEmqJPpsP3StenVgu7E1yv7HrWjCc6o4P0HdsgGz-2sFaC0u=A@mail.gmail.com>","Date":"Wed, 23 Aug 2023 10:48:02 +0100","Message-ID":"<CAHW6GYKMqtx8_MOFR6zQ-0qqKVhG+1CSbWFU9V9XUXyzHi_nJw@mail.gmail.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH 4/5] ipa: rpi: agc: Add\n\tAgcChannelConstraint class","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":"David Plowman via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"David Plowman <david.plowman@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]