[{"id":27971,"web_url":"https://patchwork.libcamera.org/comment/27971/","msgid":"<qtmv5ct5lpopfqt4grdfoqqrnfsjjx6iiqegioeoqa6bbe6vds@7dugih7kb2qq>","date":"2023-10-13T08:22:20","subject":"Re: [libcamera-devel] [PATCH v2 14/20] pipeline: rpi: Move flip\n\thandling validation code","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Naush\n\nOn Fri, Oct 13, 2023 at 08:48:35AM +0100, Naushir Patuck via libcamera-devel wrote:\n> Move the handling of Bayer order changes due to flips to run before\n> platformValidate(). This removes the need for this code to be split\n> between platformValidate() and validate() as it is right now.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  .../pipeline/rpi/common/pipeline_base.cpp     | 43 +++++++++++++------\n>  src/libcamera/pipeline/rpi/vc4/vc4.cpp        | 14 +-----\n>  2 files changed, 31 insertions(+), 26 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> index 825eae80d014..7c88b87e0608 100644\n> --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> @@ -231,16 +231,12 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()\n>  \t\t}\n>  \t}\n>\n> -\t/* Do any platform specific fixups. */\n> -\tstatus = data_->platformValidate(this);\n> -\tif (status == Invalid)\n> -\t\treturn Invalid;\n> -\n> -\t/* Further fixups on the RAW streams. */\n> +\t/* Start with some initial generic RAW stream adjustments. */\n>  \tfor (auto &raw : rawStreams_) {\n> -\t\tint ret = raw.dev->tryFormat(&raw.format);\n> -\t\tif (ret)\n> -\t\t\treturn Invalid;\n> +\t\tStreamConfiguration *rawStream = raw.cfg;\n> +\n> +\t\t/* Adjust the RAW stream to match the computed sensor format. */\n> +\t\tBayerFormat sensorBayer = BayerFormat::fromMbusCode(sensorFormat_.mbus_code);\n>\n>  \t\t/*\n>  \t\t * Some sensors change their Bayer order when they are h-flipped\n> @@ -249,12 +245,33 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()\n>  \t\t * Note how we must fetch the \"native\" (i.e. untransformed) Bayer\n>  \t\t * order, because the sensor may currently be flipped!\n>  \t\t */\n> -\t\tBayerFormat bayer = BayerFormat::fromPixelFormat(raw.cfg->pixelFormat);\n>  \t\tif (data_->flipsAlterBayerOrder_) {\n> -\t\t\tbayer.order = data_->nativeBayerOrder_;\n> -\t\t\tbayer = bayer.transform(combinedTransform_);\n> +\t\t\tsensorBayer.order = data_->nativeBayerOrder_;\n> +\t\t\tsensorBayer = sensorBayer.transform(combinedTransform_);\n> +\t\t}\n> +\n> +\t\t/* Apply the sensor adjusted Bayer order to the user request. */\n> +\t\tBayerFormat cfgBayer = BayerFormat::fromPixelFormat(rawStream->pixelFormat);\n> +\t\tcfgBayer.order = sensorBayer.order;\n\nI was puzzled for a while on why you would need cfgBayer and can't use\nsensorBayer directly, but indeed on pisp the two formats might not be\nhave the same packing.\n\n> +\n> +\t\tif (rawStream->pixelFormat != cfgBayer.toPixelFormat()) {\n> +\t\t\trawStream->pixelFormat = cfgBayer.toPixelFormat();\n> +\t\t\tstatus = Adjusted;\n>  \t\t}\n> -\t\traw.cfg->pixelFormat = bayer.toPixelFormat();\n> +\t}\n> +\n> +\t/* Do any platform specific fixups. */\n> +\tStatus st = data_->platformValidate(this);\n> +\tif (st == Invalid)\n> +\t\treturn Invalid;\n> +\telse if (st == Adjusted)\n> +\t\tstatus = Adjusted;\n> +\n> +\t/* Further fixups on the RAW streams. */\n> +\tfor (auto &raw : rawStreams_) {\n> +\t\tint ret = raw.dev->tryFormat(&raw.format);\n> +\t\tif (ret)\n> +\t\t\treturn Invalid;\n>\n>  \t\tif (RPi::PipelineHandlerBase::updateStreamConfig(raw.cfg, raw.format))\n>  \t\t\tstatus = Adjusted;\n> diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> index 233473e2fe2b..cf7b45985738 100644\n> --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> @@ -409,21 +409,9 @@ CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfig\n>\n>  \t\t/* Adjust the RAW stream to match the computed sensor format. */\n>  \t\tStreamConfiguration *rawStream = rawStreams[0].cfg;\n> -\t\tBayerFormat rawBayer = BayerFormat::fromMbusCode(rpiConfig->sensorFormat_.mbus_code);\n>\n> -\t\t/* Handle flips to make sure to match the RAW stream format. */\n> -\t\tif (flipsAlterBayerOrder_)\n> -\t\t\trawBayer = rawBayer.transform(rpiConfig->combinedTransform_);\n> -\n> -\t\t/* Apply the user requested packing. */\n> -\t\trawBayer.packing = BayerFormat::fromPixelFormat(rawStream->pixelFormat).packing;\n> -\t\tPixelFormat rawFormat = rawBayer.toPixelFormat();\n> -\n> -\t\tif (rawStream->pixelFormat != rawFormat ||\n> -\t\t    rawStream->size != rpiConfig->sensorFormat_.size) {\n> -\t\t\trawStream->pixelFormat = rawFormat;\n\nAre you sure the pixel format adjustment shall be removed here ?\nOn vc4 the sensor and raw formats should match, while now in\nvalidate() you only make sure the bayer order and bitdepth of the two\nformat match, while packing can still be different ? Do I read it\nwrong ?\n\nWith this clarified, this is indeed a nice simplification :\n\n\n> +\t\tif (rawStream->size != rpiConfig->sensorFormat_.size) {\n>  \t\t\trawStream->size = rpiConfig->sensorFormat_.size;\n> -\n>  \t\t\tstatus = CameraConfiguration::Adjusted;\n>  \t\t}\n>\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 E6AA8C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Oct 2023 08:22:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4DBF26297B;\n\tFri, 13 Oct 2023 10:22:24 +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 3C2BB6295F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Oct 2023 10:22:23 +0200 (CEST)","from ideasonboard.com (unknown\n\t[IPv6:2001:b07:5d2e:52c9:72c3:346:a663:c82d])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 61EEF2E4;\n\tFri, 13 Oct 2023 10:22:19 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1697185344;\n\tbh=tahEHXWkP/WCTNEUi1LRR2zbkvKEp9c07PyEGO1P9wU=;\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=ycw1cx+ixOnwagoRymsgpIjuXk89GwLTSJs9P98YlHoKKGH/g3cwKv4FWA3WmsasW\n\tRE8Ul1AcxpBhpgOfC/dVASe/DquzATNwcMvMx6aYHuBzUhgxqsgBoOr/ttf/NURHyn\n\tZGSCN9i2awyV4NAJ9iNlhBWxssBs5axePfb5JSsDGtOiPzRvCy+vrmtfS3KAofqVcF\n\tgAxpsVQk6WX/1+Ea/eM3QnVxP9ufeKadPuuANbfSEp5aOEL0f1LhXSAxXILe4MRpsB\n\tBlZmvp96ziZB2Cy1Htv2ORvmQ6emq2o58h+Ao4Gi6zj4fXN91wReaKV5sAY1V9jQBZ\n\t72jpeCBSD40iw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1697185339;\n\tbh=tahEHXWkP/WCTNEUi1LRR2zbkvKEp9c07PyEGO1P9wU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Pj3L0fp0SnIIFeTc7d8fSRtzev2Pd7JddR1JFzgyVf7MN2/4We9nsoGnuey2Mt2XQ\n\tj//MJWocX4fqYKtMIC+dO+QVg3SeMSuXhFPXlPhnC6L7vikF09icvlPd8kTsK7bREo\n\t18m1aV2G4hFK+dK16ZmP35JdZ4luacgPMvvfNTqo="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Pj3L0fp0\"; dkim-atps=neutral","Date":"Fri, 13 Oct 2023 10:22:20 +0200","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<qtmv5ct5lpopfqt4grdfoqqrnfsjjx6iiqegioeoqa6bbe6vds@7dugih7kb2qq>","References":"<20231013074841.16972-1-naush@raspberrypi.com>\n\t<20231013074841.16972-15-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20231013074841.16972-15-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v2 14/20] pipeline: rpi: Move flip\n\thandling validation code","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>"}},{"id":27972,"web_url":"https://patchwork.libcamera.org/comment/27972/","msgid":"<CAEmqJPrEXCu=QVi2UQH=74SStiYR5BUg0_CP0Ww0=utofhzW1w@mail.gmail.com>","date":"2023-10-13T08:41:32","subject":"Re: [libcamera-devel] [PATCH v2 14/20] pipeline: rpi: Move flip\n\thandling validation code","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Jacopo,\n\nOn Fri, 13 Oct 2023 at 09:22, Jacopo Mondi\n<jacopo.mondi@ideasonboard.com> wrote:\n>\n> Hi Naush\n>\n> On Fri, Oct 13, 2023 at 08:48:35AM +0100, Naushir Patuck via libcamera-devel wrote:\n> > Move the handling of Bayer order changes due to flips to run before\n> > platformValidate(). This removes the need for this code to be split\n> > between platformValidate() and validate() as it is right now.\n> >\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> > ---\n> >  .../pipeline/rpi/common/pipeline_base.cpp     | 43 +++++++++++++------\n> >  src/libcamera/pipeline/rpi/vc4/vc4.cpp        | 14 +-----\n> >  2 files changed, 31 insertions(+), 26 deletions(-)\n> >\n> > diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > index 825eae80d014..7c88b87e0608 100644\n> > --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > @@ -231,16 +231,12 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()\n> >               }\n> >       }\n> >\n> > -     /* Do any platform specific fixups. */\n> > -     status = data_->platformValidate(this);\n> > -     if (status == Invalid)\n> > -             return Invalid;\n> > -\n> > -     /* Further fixups on the RAW streams. */\n> > +     /* Start with some initial generic RAW stream adjustments. */\n> >       for (auto &raw : rawStreams_) {\n> > -             int ret = raw.dev->tryFormat(&raw.format);\n> > -             if (ret)\n> > -                     return Invalid;\n> > +             StreamConfiguration *rawStream = raw.cfg;\n> > +\n> > +             /* Adjust the RAW stream to match the computed sensor format. */\n> > +             BayerFormat sensorBayer = BayerFormat::fromMbusCode(sensorFormat_.mbus_code);\n> >\n> >               /*\n> >                * Some sensors change their Bayer order when they are h-flipped\n> > @@ -249,12 +245,33 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()\n> >                * Note how we must fetch the \"native\" (i.e. untransformed) Bayer\n> >                * order, because the sensor may currently be flipped!\n> >                */\n> > -             BayerFormat bayer = BayerFormat::fromPixelFormat(raw.cfg->pixelFormat);\n> >               if (data_->flipsAlterBayerOrder_) {\n> > -                     bayer.order = data_->nativeBayerOrder_;\n> > -                     bayer = bayer.transform(combinedTransform_);\n> > +                     sensorBayer.order = data_->nativeBayerOrder_;\n> > +                     sensorBayer = sensorBayer.transform(combinedTransform_);\n> > +             }\n> > +\n> > +             /* Apply the sensor adjusted Bayer order to the user request. */\n> > +             BayerFormat cfgBayer = BayerFormat::fromPixelFormat(rawStream->pixelFormat);\n> > +             cfgBayer.order = sensorBayer.order;\n>\n> I was puzzled for a while on why you would need cfgBayer and can't use\n> sensorBayer directly, but indeed on pisp the two formats might not be\n> have the same packing.\n>\n> > +\n> > +             if (rawStream->pixelFormat != cfgBayer.toPixelFormat()) {\n> > +                     rawStream->pixelFormat = cfgBayer.toPixelFormat();\n> > +                     status = Adjusted;\n> >               }\n> > -             raw.cfg->pixelFormat = bayer.toPixelFormat();\n> > +     }\n> > +\n> > +     /* Do any platform specific fixups. */\n> > +     Status st = data_->platformValidate(this);\n> > +     if (st == Invalid)\n> > +             return Invalid;\n> > +     else if (st == Adjusted)\n> > +             status = Adjusted;\n> > +\n> > +     /* Further fixups on the RAW streams. */\n> > +     for (auto &raw : rawStreams_) {\n> > +             int ret = raw.dev->tryFormat(&raw.format);\n> > +             if (ret)\n> > +                     return Invalid;\n> >\n> >               if (RPi::PipelineHandlerBase::updateStreamConfig(raw.cfg, raw.format))\n> >                       status = Adjusted;\n> > diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> > index 233473e2fe2b..cf7b45985738 100644\n> > --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> > +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp\n> > @@ -409,21 +409,9 @@ CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfig\n> >\n> >               /* Adjust the RAW stream to match the computed sensor format. */\n> >               StreamConfiguration *rawStream = rawStreams[0].cfg;\n> > -             BayerFormat rawBayer = BayerFormat::fromMbusCode(rpiConfig->sensorFormat_.mbus_code);\n> >\n> > -             /* Handle flips to make sure to match the RAW stream format. */\n> > -             if (flipsAlterBayerOrder_)\n> > -                     rawBayer = rawBayer.transform(rpiConfig->combinedTransform_);\n> > -\n> > -             /* Apply the user requested packing. */\n> > -             rawBayer.packing = BayerFormat::fromPixelFormat(rawStream->pixelFormat).packing;\n> > -             PixelFormat rawFormat = rawBayer.toPixelFormat();\n> > -\n> > -             if (rawStream->pixelFormat != rawFormat ||\n> > -                 rawStream->size != rpiConfig->sensorFormat_.size) {\n> > -                     rawStream->pixelFormat = rawFormat;\n>\n> Are you sure the pixel format adjustment shall be removed here ?\n> On vc4 the sensor and raw formats should match, while now in\n> validate() you only make sure the bayer order and bitdepth of the two\n> format match, while packing can still be different ? Do I read it\n> wrong ?\n\nI was going to say that this is fine, but thinking about it a bit\nmore, this is indeed wrong.  platformValidate() will need to adjust\nthe bit depth as well as enusing packing can only be set to Unpacked\nor CSI2 packing.  Let me work on an update to this patch and post an\nupdate in-reply-to this email.\n\nRegards,\nNaush\n\n\n>\n> With this clarified, this is indeed a nice simplification :\n>\n>\n> > +             if (rawStream->size != rpiConfig->sensorFormat_.size) {\n> >                       rawStream->size = rpiConfig->sensorFormat_.size;\n> > -\n> >                       status = CameraConfiguration::Adjusted;\n> >               }\n> >\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 ED4B8BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Oct 2023 08:42:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2BCCE6297E;\n\tFri, 13 Oct 2023 10:42:04 +0200 (CEST)","from mail-yw1-x112d.google.com (mail-yw1-x112d.google.com\n\t[IPv6:2607:f8b0:4864:20::112d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B5CC36295F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Oct 2023 10:42:02 +0200 (CEST)","by mail-yw1-x112d.google.com with SMTP id\n\t00721157ae682-5a7db1f864bso21566877b3.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Oct 2023 01:42:02 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1697186524;\n\tbh=A4NsLrvT51sMRJWa/hkrasXXK8l55rSB51hzllclbfM=;\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=X2bmap0hUR57pMIaTtAV3Y/8pNXDOa0FNb5HZdK7YWc7YtWyQ7NIOXC06kI3aFVCN\n\tRDEC/LnkrL/MFLlUen87kJRLsSEWLPWpHEm0xM1/GB1fFbEbRxgyodrD+sjTuWZtd2\n\tzQQtxW0+I+d99m6VYjRjab2g8TxZvptcQen29BCk5IDNYvmEXx9enuuleYTUTTILaB\n\t1Cc7AjGFTW6pqeC/VuP1R/fY4oR6YZFz4Q+h4xF9ZnVVwaMVcwT/E5QztBqA7JvOoL\n\tmPdoPw5jE5ELApWt8YG9naskU0ghPhp2c6hMdoFP2lVSWprfvAYNwSZ6GrsbuUPyx3\n\tW91TlvQHs9boQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1697186521; x=1697791321;\n\tdarn=lists.libcamera.org; \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=p1fc9iA1bH7n+CM42TnvjNrgIQuwM8YQtJ/61PxGcpg=;\n\tb=cwCPzNeFCNcLVACufRVk3Qb8tTPiy3HBAhoRXxhJ+UbTokQr65zCKvZwNveYncZFFx\n\tC0GldsA5H4smGdJVY/OwdWqU5mRLv9XLLFqOgEeJYt9ZtXswGdF9LCchqo5422SuCDzU\n\tTpuKe+5k6PHa/xnGvxk2cdY7TSkhfqGM8622S7jZIKkM6p1/HCcbgcBene9yVd0ftmhn\n\tBXBmpvZVvY3+CROPWHtNOiFD3123Gpd5hN62U3R3uHtdmYjmG3znaV4t6Ht3mCpQYiYi\n\tJyqCYCZwsvPR0Zc/cHuS/j9/CUdn0u0nCEC6NFW8pv1Jf6Dh5a9enhB8+jE2iCN4pTd5\n\tHuLA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"cwCPzNeF\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1697186521; x=1697791321;\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=p1fc9iA1bH7n+CM42TnvjNrgIQuwM8YQtJ/61PxGcpg=;\n\tb=LiKiOKOHM1Y6agjeh+2HErx37o31e/x95SRgfb3dqGxm3pdwwg9gAN3Epp3A4aPFe4\n\tVycWFf1s27bXeGuBFfYomJz2LqvCmWM2u+zd2lT0RbYlzBFY8sEfRLmmkiSMyQvGwP5q\n\tO/dZQiAKAmOOQGG5ITyikGAHOAZec1vxddeEne4S6ksvtQAhmPueTrExWYNSdczDeZDd\n\t53A+X4TbViAaTv0EHla2hQGwIy0TWU8778lmH4CJzIJeExJnsWAdwj8CQNwwbrEbKnib\n\tpXG/Ff2dr33iw5niC0TX5KHFTlbLO2BSszuFPY7gYrNT/qNm1BDeaiCI6LPY6W718+kK\n\trgYw==","X-Gm-Message-State":"AOJu0Ywy2kioZOh/pc0ng7Xlxuq1t2xS9LrfNHivJH8I5D1SU9gUhAg2\n\tYyeTRwy+LXSX4KjB+YCanKVDcd3nrEWstpp3dms4fg==","X-Google-Smtp-Source":"AGHT+IFLPlU1R4aFnuXl+MoA1QBmdkL7d+f7jg6nZbuAbNh0vjmSPWbjgOqh7F35RzOuivJdqm3gRBfJkndsrkqwe+Y=","X-Received":"by 2002:a81:4e0f:0:b0:5a7:ba53:6544 with SMTP id\n\tc15-20020a814e0f000000b005a7ba536544mr11321672ywb.12.1697186521403;\n\tFri, 13 Oct 2023 01:42:01 -0700 (PDT)","MIME-Version":"1.0","References":"<20231013074841.16972-1-naush@raspberrypi.com>\n\t<20231013074841.16972-15-naush@raspberrypi.com>\n\t<qtmv5ct5lpopfqt4grdfoqqrnfsjjx6iiqegioeoqa6bbe6vds@7dugih7kb2qq>","In-Reply-To":"<qtmv5ct5lpopfqt4grdfoqqrnfsjjx6iiqegioeoqa6bbe6vds@7dugih7kb2qq>","Date":"Fri, 13 Oct 2023 09:41:32 +0100","Message-ID":"<CAEmqJPrEXCu=QVi2UQH=74SStiYR5BUg0_CP0Ww0=utofhzW1w@mail.gmail.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH v2 14/20] pipeline: rpi: Move flip\n\thandling validation code","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>"}}]