[{"id":34273,"web_url":"https://patchwork.libcamera.org/comment/34273/","msgid":"<CAHW6GYKLw2dQWP8PG85HOqDvjCrk=4avCL6syp66igKQG7j5kA@mail.gmail.com>","date":"2025-05-19T10:17:21","subject":"Re: [PATCH v1 2/6] ipa: rpi: Replace dropFrameCount in the IPA -> PH\n\tinterface","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 patch.\n\nOn Mon, 19 May 2025 at 10:23, Naushir Patuck <naush@raspberrypi.com> wrote:\n>\n> Replace the dropFrameCount parameter returned from ipa::start() to the\n> pipeline handler by startupFrameCount and invalidFrameCount. The former\n> counts the number of frames required for AWB/AGC to converge, and the\n> latter counts the number of invalid frames produced by the sensor when\n> starting up.\n>\n> In the pipeline handler, use the sum of these 2 values to replicate the\n> existing dropFrameCount behaviour.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  include/libcamera/ipa/raspberrypi.mojom            |  3 ++-\n>  src/ipa/rpi/common/ipa_base.cpp                    | 14 ++++++++------\n>  .../pipeline/rpi/common/pipeline_base.cpp          |  4 ++--\n>  3 files changed, 12 insertions(+), 9 deletions(-)\n>\n> diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom\n> index e30c70bde08b..12b083e9d04b 100644\n> --- a/include/libcamera/ipa/raspberrypi.mojom\n> +++ b/include/libcamera/ipa/raspberrypi.mojom\n> @@ -52,7 +52,8 @@ struct ConfigResult {\n>\n>  struct StartResult {\n>         libcamera.ControlList controls;\n> -       int32 dropFrameCount;\n> +       int32 startupFrameCount;\n> +       int32 invalidFrameCount;\n>  };\n>\n>  struct PrepareParams {\n> diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\n> index e0a93daa9db2..c15f8a7bf71e 100644\n> --- a/src/ipa/rpi/common/ipa_base.cpp\n> +++ b/src/ipa/rpi/common/ipa_base.cpp\n> @@ -324,6 +324,7 @@ void IpaBase::start(const ControlList &controls, StartResult *result)\n>          * \"mistrusted\", which depends on whether this is a startup from cold,\n>          * or merely a mode switch in a running system.\n>          */\n> +       unsigned int agcConvergenceFrames = 0, awbConvergenceFrames = 0;\n>         frameCount_ = 0;\n>         if (firstStart_) {\n>                 dropFrameCount_ = helper_->hideFramesStartup();\n> @@ -336,7 +337,6 @@ void IpaBase::start(const ControlList &controls, StartResult *result)\n>                  * (mistrustCount_) that they won't see. But if zero (i.e.\n>                  * no convergence necessary), no frames need to be dropped.\n>                  */\n> -               unsigned int agcConvergenceFrames = 0;\n>                 RPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(\n>                         controller_.getAlgorithm(\"agc\"));\n>                 if (agc) {\n> @@ -345,7 +345,6 @@ void IpaBase::start(const ControlList &controls, StartResult *result)\n>                                 agcConvergenceFrames += mistrustCount_;\n>                 }\n>\n> -               unsigned int awbConvergenceFrames = 0;\n>                 RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(\n>                         controller_.getAlgorithm(\"awb\"));\n>                 if (awb) {\n> @@ -353,15 +352,18 @@ void IpaBase::start(const ControlList &controls, StartResult *result)\n>                         if (awbConvergenceFrames)\n>                                 awbConvergenceFrames += mistrustCount_;\n>                 }\n> -\n> -               dropFrameCount_ = std::max({ dropFrameCount_, agcConvergenceFrames, awbConvergenceFrames });\n> -               LOG(IPARPI, Debug) << \"Drop \" << dropFrameCount_ << \" frames on startup\";\n>         } else {\n>                 dropFrameCount_ = helper_->hideFramesModeSwitch();\n>                 mistrustCount_ = helper_->mistrustFramesModeSwitch();\n>         }\n>\n> -       result->dropFrameCount = dropFrameCount_;\n> +       result->startupFrameCount = std::max({ agcConvergenceFrames, awbConvergenceFrames });\n> +       result->invalidFrameCount = dropFrameCount_;\n> +\n> +       dropFrameCount_ = std::max({ dropFrameCount_, agcConvergenceFrames, awbConvergenceFrames });\n\nTBH, I'm not 100% clear why we do that max operation (I realise the\nold version does it too), do you remember?\n\n> +\n> +       LOG(IPARPI, Debug) << \"Startup frames: \" << result->startupFrameCount\n> +                          << \" Invalid frames: \" << result->invalidFrameCount;\n\nI just wondered very slightly whether it might be slightly easier to\nfollow if we don't use \"dropFrameCount\" or \"dropFrameCount_\" here,\nbecause in the PH it means something slightly different (is that\nright?).  So maybe replace it by \"invalidFrameCount\"? I know, very\nminor!\n\n>\n>         firstStart_ = false;\n>         lastRunTimestamp_ = 0;\n> diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> index 1f13e5230fae..5956485953a2 100644\n> --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> @@ -660,8 +660,8 @@ int PipelineHandlerBase::start(Camera *camera, const ControlList *controls)\n>                 data->setSensorControls(result.controls);\n>\n>         /* Configure the number of dropped frames required on startup. */\n> -       data->dropFrameCount_ = data->config_.disableStartupFrameDrops\n> -                             ? 0 : result.dropFrameCount;\n\nCan you say why we return \"result.dropFrameCount\" here and not\n\"result.invalidFrameCount\"? I've obviously forgotten what's going on\nhere!\n\nAssuming this is all just recollection failure on my part:\n\nReviewed-by: David Plowman <david.plowman@raspberrypi.com>\n\nThanks\nDavid\n\n> +       data->dropFrameCount_ = data->config_.disableStartupFrameDrops ?\n> +                       0 : result.startupFrameCount + result.invalidFrameCount;\n>\n>         for (auto const stream : data->streams_)\n>                 stream->resetBuffers();\n> --\n> 2.43.0\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 EDD35C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 19 May 2025 10:17:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DA27268B6C;\n\tMon, 19 May 2025 12:17:35 +0200 (CEST)","from mail-qt1-x82e.google.com (mail-qt1-x82e.google.com\n\t[IPv6:2607:f8b0:4864:20::82e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 63C5168B67\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 19 May 2025 12:17:33 +0200 (CEST)","by mail-qt1-x82e.google.com with SMTP id\n\td75a77b69052e-476ac73c76fso62353391cf.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 19 May 2025 03:17:33 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"Mgs8iPl7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1747649852; x=1748254652;\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=4JrHA8UmochJSfrsPqv8ZnkOnspquQWclTxZ4H3S5s0=;\n\tb=Mgs8iPl7msWEk8AU7LlVelWzXolqpjmJTe0WpWGniTe7yVG9UJCe4Cc1AB/cq8YpMj\n\tS4w7Lq0PsaHr2YtAA7wlknRtD+l3zEAfE1qW3sY19pTj51uEwbFb9bepdu+c/osXFfHS\n\t9ool9DEvGkcxo5ZE4WAZZbfFsGOpYk8khoVWDNE5IjafXUwj/z37OxjcSGGpJwytu7ML\n\t2TdOptHT0s+xjHcCiR0n5UnoOjn6QJE/u8eUImysR7vBDdVBjT4LDgbSyfYgbXHSJUvr\n\tjBWg3iqxVNSF0nv6DvnE8hQRwZL9hs+obGiqWpBxCYxoK1bEf4oPZoSAML9fy2orxe+J\n\tanhg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1747649852; x=1748254652;\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=4JrHA8UmochJSfrsPqv8ZnkOnspquQWclTxZ4H3S5s0=;\n\tb=djmM0jaZIW81hmrmW0Xy6rhdRywAitL/vyhRXBJwOFiK4PiLDVHB7DfV93/xq6xyVh\n\tHHL64fZ4YdwEWvV7BkWvuFiuQK7WDqgaZylaWiqjvLJ9zvBawPdzMQYDuOJAZ4uDEhY4\n\tbavH4ntw8oJo01Oircw2iqptPkmO0snaPxcQAqlTqliq3skoTTs4Hm678XwWJ9Lc39gD\n\tGlXyBJB3P2sb+vDMfXOjlKpGGxTGY4ud7cjQsSihANtSYJFqMvdamv1qDeJvoX2FIPwy\n\taApF5R5NLnslneNxEUEw522h49JiZBDnaq9NO078b/jdzl6smoMR9BhzzmzypYIbapXO\n\tSGYw==","X-Gm-Message-State":"AOJu0YwST/v05726SWkBiiiTwe+al8EAPJu6pKb0Ges1E1q4nzun91zp\n\t/unQa1NoxW1kKKTJ4TQFiJOsNMKloQWvwJDNf2hjW4R4II1eb27Jb9X7tVsRm7t3SBSspGMMnqw\n\tZei0NqIi4KZGjHncqaBoebwiYpIppyNyeI2yrQUtTk9Erp5mfRHV9HPcd7w==","X-Gm-Gg":"ASbGncsc86n8Z0Bqt8CEF6Pz0dq/kk3xHiu2AYm3Eu+Wtv7BbjoL48CTgtfbmPXumiF\n\tUXYkiP8AZR+T7yVycsAC5s3aFyRxOk8IU6AiaH7bEuB2KdjlP37AjhwODg/BQOPe642TDqSAfk6\n\trK/IJYvM8AEUncskpeNqomUKmzGJ0ufvBwdhuws8frEidqXDf71Al+9LJW+e9lMsU=","X-Google-Smtp-Source":"AGHT+IFyrCh3yk9r856+wkXd40zSEPO/+8Ei4pRR8DsSDxyEItugibUpuEDtS3gHpv0QaJzK85xB4ZBp7DAFDtLlU44=","X-Received":"by 2002:a05:622a:4895:b0:494:a4a5:4d1d with SMTP id\n\td75a77b69052e-494ae2639f0mr202510041cf.0.1747649852206;\n\tMon, 19 May 2025 03:17:32 -0700 (PDT)","MIME-Version":"1.0","References":"<20250519092245.269048-1-naush@raspberrypi.com>\n\t<20250519092245.269048-3-naush@raspberrypi.com>","In-Reply-To":"<20250519092245.269048-3-naush@raspberrypi.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Mon, 19 May 2025 11:17:21 +0100","X-Gm-Features":"AX0GCFvv61CQpZ1styEoYuDcmCDMu4ishdBw5QsD_v3oVzRkDGLeZtoeUpgCPbo","Message-ID":"<CAHW6GYKLw2dQWP8PG85HOqDvjCrk=4avCL6syp66igKQG7j5kA@mail.gmail.com>","Subject":"Re: [PATCH v1 2/6] ipa: rpi: Replace dropFrameCount in the IPA -> PH\n\tinterface","To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"UTF-8\"","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":34287,"web_url":"https://patchwork.libcamera.org/comment/34287/","msgid":"<CAEmqJPpwkj83LwFo8h+51NfOW2vXoQmD-UTk2Hgf3UrJxNOCFg@mail.gmail.com>","date":"2025-05-20T09:22:27","subject":"Re: [PATCH v1 2/6] ipa: rpi: Replace dropFrameCount in the IPA -> PH\n\tinterface","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi David,\n\n\nOn Mon, 19 May 2025 at 11:17, David Plowman <david.plowman@raspberrypi.com>\nwrote:\n\n> Hi Naush\n>\n> Thanks for the patch.\n>\n> On Mon, 19 May 2025 at 10:23, Naushir Patuck <naush@raspberrypi.com>\n> wrote:\n> >\n> > Replace the dropFrameCount parameter returned from ipa::start() to the\n> > pipeline handler by startupFrameCount and invalidFrameCount. The former\n> > counts the number of frames required for AWB/AGC to converge, and the\n> > latter counts the number of invalid frames produced by the sensor when\n> > starting up.\n> >\n> > In the pipeline handler, use the sum of these 2 values to replicate the\n> > existing dropFrameCount behaviour.\n> >\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > ---\n> >  include/libcamera/ipa/raspberrypi.mojom            |  3 ++-\n> >  src/ipa/rpi/common/ipa_base.cpp                    | 14 ++++++++------\n> >  .../pipeline/rpi/common/pipeline_base.cpp          |  4 ++--\n> >  3 files changed, 12 insertions(+), 9 deletions(-)\n> >\n> > diff --git a/include/libcamera/ipa/raspberrypi.mojom\n> b/include/libcamera/ipa/raspberrypi.mojom\n> > index e30c70bde08b..12b083e9d04b 100644\n> > --- a/include/libcamera/ipa/raspberrypi.mojom\n> > +++ b/include/libcamera/ipa/raspberrypi.mojom\n> > @@ -52,7 +52,8 @@ struct ConfigResult {\n> >\n> >  struct StartResult {\n> >         libcamera.ControlList controls;\n> > -       int32 dropFrameCount;\n> > +       int32 startupFrameCount;\n> > +       int32 invalidFrameCount;\n> >  };\n> >\n> >  struct PrepareParams {\n> > diff --git a/src/ipa/rpi/common/ipa_base.cpp\n> b/src/ipa/rpi/common/ipa_base.cpp\n> > index e0a93daa9db2..c15f8a7bf71e 100644\n> > --- a/src/ipa/rpi/common/ipa_base.cpp\n> > +++ b/src/ipa/rpi/common/ipa_base.cpp\n> > @@ -324,6 +324,7 @@ void IpaBase::start(const ControlList &controls,\n> StartResult *result)\n> >          * \"mistrusted\", which depends on whether this is a startup from\n> cold,\n> >          * or merely a mode switch in a running system.\n> >          */\n> > +       unsigned int agcConvergenceFrames = 0, awbConvergenceFrames = 0;\n> >         frameCount_ = 0;\n> >         if (firstStart_) {\n> >                 dropFrameCount_ = helper_->hideFramesStartup();\n> > @@ -336,7 +337,6 @@ void IpaBase::start(const ControlList &controls,\n> StartResult *result)\n> >                  * (mistrustCount_) that they won't see. But if zero\n> (i.e.\n> >                  * no convergence necessary), no frames need to be\n> dropped.\n> >                  */\n> > -               unsigned int agcConvergenceFrames = 0;\n> >                 RPiController::AgcAlgorithm *agc =\n> dynamic_cast<RPiController::AgcAlgorithm *>(\n> >                         controller_.getAlgorithm(\"agc\"));\n> >                 if (agc) {\n> > @@ -345,7 +345,6 @@ void IpaBase::start(const ControlList &controls,\n> StartResult *result)\n> >                                 agcConvergenceFrames += mistrustCount_;\n> >                 }\n> >\n> > -               unsigned int awbConvergenceFrames = 0;\n> >                 RPiController::AwbAlgorithm *awb =\n> dynamic_cast<RPiController::AwbAlgorithm *>(\n> >                         controller_.getAlgorithm(\"awb\"));\n> >                 if (awb) {\n> > @@ -353,15 +352,18 @@ void IpaBase::start(const ControlList &controls,\n> StartResult *result)\n> >                         if (awbConvergenceFrames)\n> >                                 awbConvergenceFrames += mistrustCount_;\n> >                 }\n> > -\n> > -               dropFrameCount_ = std::max({ dropFrameCount_,\n> agcConvergenceFrames, awbConvergenceFrames });\n> > -               LOG(IPARPI, Debug) << \"Drop \" << dropFrameCount_ << \"\n> frames on startup\";\n> >         } else {\n> >                 dropFrameCount_ = helper_->hideFramesModeSwitch();\n> >                 mistrustCount_ = helper_->mistrustFramesModeSwitch();\n> >         }\n> >\n> > -       result->dropFrameCount = dropFrameCount_;\n> > +       result->startupFrameCount = std::max({ agcConvergenceFrames,\n> awbConvergenceFrames });\n> > +       result->invalidFrameCount = dropFrameCount_;\n> > +\n> > +       dropFrameCount_ = std::max({ dropFrameCount_,\n> agcConvergenceFrames, awbConvergenceFrames });\n>\n> TBH, I'm not 100% clear why we do that max operation (I realise the\n> old version does it too), do you remember?\n>\n\nI think it's just accounting for the worst case where we run the prepare()\n/ process() cycle on every frame during startup.\n\n\n>\n> > +\n> > +       LOG(IPARPI, Debug) << \"Startup frames: \" <<\n> result->startupFrameCount\n> > +                          << \" Invalid frames: \" <<\n> result->invalidFrameCount;\n>\n> I just wondered very slightly whether it might be slightly easier to\n> follow if we don't use \"dropFrameCount\" or \"dropFrameCount_\" here,\n> because in the PH it means something slightly different (is that\n> right?).  So maybe replace it by \"invalidFrameCount\"? I know, very\n> minor!\n>\n> >\n> >         firstStart_ = false;\n> >         lastRunTimestamp_ = 0;\n> > diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > index 1f13e5230fae..5956485953a2 100644\n> > --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp\n> > @@ -660,8 +660,8 @@ int PipelineHandlerBase::start(Camera *camera, const\n> ControlList *controls)\n> >                 data->setSensorControls(result.controls);\n> >\n> >         /* Configure the number of dropped frames required on startup. */\n> > -       data->dropFrameCount_ = data->config_.disableStartupFrameDrops\n> > -                             ? 0 : result.dropFrameCount;\n>\n> Can you say why we return \"result.dropFrameCount\" here and not\n> \"result.invalidFrameCount\"? I've obviously forgotten what's going on\n> here!\n>\n\nThis \"models\" the existing behavior, but changes in subsequent patches to\naccount for result.invalidFrameCount correctly.\n\nRegards,\nNaush\n\n\n\n>\n> Assuming this is all just recollection failure on my part:\n>\n> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n>\n> Thanks\n> David\n>\n> > +       data->dropFrameCount_ = data->config_.disableStartupFrameDrops ?\n> > +                       0 : result.startupFrameCount +\n> result.invalidFrameCount;\n> >\n> >         for (auto const stream : data->streams_)\n> >                 stream->resetBuffers();\n> > --\n> > 2.43.0\n> >\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 35F97C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 20 May 2025 09:23:06 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 35EB168D86;\n\tTue, 20 May 2025 11:23:05 +0200 (CEST)","from mail-ua1-x92e.google.com (mail-ua1-x92e.google.com\n\t[IPv6:2607:f8b0:4864:20::92e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8E1F8614DD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 20 May 2025 11:23:02 +0200 (CEST)","by mail-ua1-x92e.google.com with SMTP id\n\ta1e0cc1a2514c-87be23ca40cso109941241.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 20 May 2025 02:23:02 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"HxTW2oim\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1747732981; x=1748337781;\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=cJ7aXFm1GT0w7QlD2GPVS8SDrNQNeo4+0oODHxK/1Cc=;\n\tb=HxTW2oim7E52UQQ4x9yhGosKy+Eoi5U+XuHGlbDH2lwT5luL7U7v8oVPW2WWbCru23\n\tshaKYyAE4LCuBigQEvyFmB1LhfywBbGAWCTM2vR2RHMUrNTq/rGt6Eb0ev+5cXPZ/jbt\n\tneKxTYO1Ci9xarP76dPkOR8J5VqjhZwcrCSCuS1XAwRCRX4J1HtGMWEvL63adZNzTAu6\n\tRfutSujJO1WERmjOZ8xF4/uYbDJdwhviOsFoKvauE0AI5t1oP0JP5elOqmHC4mRsCVfd\n\tMQroTw74NXq5WsPZ9vMtQi7ePXS5MhSD/T/qbZiDvQKyHV2SJaCHKooVuVfQsOXLEn/k\n\tG/hQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1747732981; x=1748337781;\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=cJ7aXFm1GT0w7QlD2GPVS8SDrNQNeo4+0oODHxK/1Cc=;\n\tb=LL8caM5yIfDic1XKi5sUY4SjkLVXMJR1RA3qEHu+NBNN4mMWCx7T3lD6Pm06ZUP09R\n\tjVL+Tw3HyeQqhaQDmkWAOdsv7D18K216Y74iNJCUYayy4df2vOYtmGMyYJjnETIeUwuC\n\t5h/ax+N9oW1ouQSScfUM8s4DpIkCDGV6zAEIbsZKLSyU5sZ7dFd7lsH1Qot2rUMg9pLW\n\tlzDVW430QvzMkbQG3wB9FVzr1A/DPzySX1XQfkL7LFbQNBHmGvhxz4KJJtL+GxyFXaS1\n\tL51EgdgaVvKMVtDUbc0YBwUNi3PSsYE2Mp6iYXlQ6gS8Nnfsbw5N3KmOJ+qXc9sGVbQ1\n\tI74w==","X-Gm-Message-State":"AOJu0YwpthTabfWDXMa3JTcFer35UxjRwBZiiz1TJHUYQhTvTyo/dwNX\n\ttdpQZ0pViNzUkoKHOdtYOGPuKBOzxzmYOopEXxxi6pCoxSJQZzeZw9I3EEIFPg/22SHEQwfItcL\n\tKQoCP/CoyxSVd9nrjn2DZsPvuW0uZClwlDH2iJIK4HeieJPOjCqKJeVk=","X-Gm-Gg":"ASbGncvFA6nh2WCPiloBnCxqa+l2ThvsC+ZGWRwBiwNv6IsvmQ/cElF6vannKFqsMQ8\n\tZskEt34/DT0eUjn9zb8rPgh9T3E3snbGDKxBcV/XaFZKhH99Uh0vujfOVwbR/uqoCqIhSkKz5Dl\n\trN7ulTsAUE9OiPDtFEDy8+dTuxkhBQoqoo","X-Google-Smtp-Source":"AGHT+IGzuotvoe/T704WGggrV10rJFyo1H9vKT3rmeMLEuhOp1wXpOW+xNUak2qk/YFVtBEtFB5HpN/jKjl9YJ/xG+U=","X-Received":"by 2002:a05:6102:3048:b0:4e2:8232:9c38 with SMTP id\n\tada2fe7eead31-4e282329d1dmr2210997137.9.1747732981409;\n\tTue, 20 May 2025 02:23:01 -0700 (PDT)","MIME-Version":"1.0","References":"<20250519092245.269048-1-naush@raspberrypi.com>\n\t<20250519092245.269048-3-naush@raspberrypi.com>\n\t<CAHW6GYKLw2dQWP8PG85HOqDvjCrk=4avCL6syp66igKQG7j5kA@mail.gmail.com>","In-Reply-To":"<CAHW6GYKLw2dQWP8PG85HOqDvjCrk=4avCL6syp66igKQG7j5kA@mail.gmail.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Tue, 20 May 2025 10:22:27 +0100","X-Gm-Features":"AX0GCFuk69UVuwEEZu0ShF07YpcfOyfu8iPabyZR4ZkS4GKZLVHAH2i_4VpToYY","Message-ID":"<CAEmqJPpwkj83LwFo8h+51NfOW2vXoQmD-UTk2Hgf3UrJxNOCFg@mail.gmail.com>","Subject":"Re: [PATCH v1 2/6] ipa: rpi: Replace dropFrameCount in the IPA -> PH\n\tinterface","To":"David Plowman <david.plowman@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"multipart/alternative; boundary=\"00000000000084fd3306358dcbc7\"","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]