[{"id":26285,"web_url":"https://patchwork.libcamera.org/comment/26285/","msgid":"<167421374282.42371.181337166489500571@Monstersaurus>","date":"2023-01-20T11:22:22","subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Naushir Patuck via libcamera-devel (2023-01-18 08:59:52)\n> Add a pipeline config parameter \"return_newest_frames\" to always use the\n> most recently captured Unicam frame when processing a request. This effectively\n> stops the pipeline handler from queuing Unicam buffers and processing requests\n> using the buffer at the front of the queue.\n> \n> Note that setting this parameter might incur unnecessary frame drops during\n> times of high transient CPU loads where the application might not be able to\n> provide requests quick enough.\n\nI'd be tempted to add here, 'But it can lower perceived latency of the\noutput when recovering from a frame drop scenario' ? (if that's correct)\n\n> \n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  .../pipeline/raspberrypi/data/example.yaml    |  7 +++++-\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 23 +++++++++++++++++++\n>  2 files changed, 29 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/libcamera/pipeline/raspberrypi/data/example.yaml b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> index 421f30e62aa3..04a117f38ada 100644\n> --- a/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> +++ b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> @@ -19,6 +19,11 @@\n>  \n>                  # Override any request from the IPA to drop a number of startup\n>                  # frames.\n> -                \"disable_startup_frame_drops\": false\n> +                \"disable_startup_frame_drops\": false,\n\nCan the options always have a comma so they don't require modifiying\nthe previous one to add a new one?\n\nIs that because you're treating this file as json instead of yaml ?\n\n> +\n> +                # Always process a pending request with the last captured sensor\n> +                # frame.  Note that this might lead to avoidable frame drops\n> +                # during periods of transient heavy CPU loading.\n> +                \"return_newest_frames\": false\n>          }\n>  }\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 3529d331deb6..21edc8e05469 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -314,6 +314,11 @@ public:\n>                  * frames.\n>                  */\n>                 bool disableStartupFrameDrops;\n> +               /*\n> +                * Always process a pending request with the last captured sensor\n\nlast / 'most recently' ?\n\n> +                * frame.\n> +                */\n> +               bool returnNewestFrames;\n>         };\n>  \n>         Config config_;\n> @@ -1712,6 +1717,7 @@ int RPiCameraData::configurePipeline()\n>                 .minUnicamBuffers = 2,\n>                 .minTotalUnicamBuffers = 4,\n>                 .disableStartupFrameDrops = false,\n> +               .returnNewestFrames = false,\n>         };\n>  \n>         char const *configFromEnv = utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> @@ -1747,6 +1753,8 @@ int RPiCameraData::configurePipeline()\n>                 phConfig[\"min_total_unicam_buffers\"].get<unsigned int>(config_.minTotalUnicamBuffers);\n>         config_.disableStartupFrameDrops =\n>                 phConfig[\"disable_startup_frame_drops\"].get<bool>(config_.disableStartupFrameDrops);\n> +       config_.returnNewestFrames =\n> +               phConfig[\"return_newest_frames\"].get<bool>(config_.returnNewestFrames);\n>  \n>         if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {\n>                 LOG(RPI, Error) << \"Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers\";\n> @@ -2329,6 +2337,21 @@ bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em\n>         if (bayerQueue_.empty())\n>                 return false;\n>  \n> +       /*\n> +        * If the pipeline is configured to only ever return the most recently\n> +        * captured frame, empty the buffer queue until a single element is\n> +        * left, corresponding to the most recent buffer. Note that this will\n> +        * likely result in possibly avoidable dropped frames.\n> +        */\n> +       if (config_.returnNewestFrames && !unicam_[Unicam::Image].isExternal()) {\n> +               while (bayerQueue_.size() > 1) {\n\nIs this required?\n\nI'm a bit puzzled at the need to drop all the other frames. Don't we\njust need to choose the oldest buffer to drop so that we can capture a\nnew image?\n\nThere's still the potential for the pipeline to catch up\nisn't there?\n\n> +                       FrameBuffer *bayer = bayerQueue_.front().buffer;\n> +\n> +                       unicam_[Unicam::Image].returnBuffer(bayer);\n> +                       bayerQueue_.pop();\n> +               }\n> +       }\n> +\n>         /*\n>          * Find the embedded data buffer with a matching timestamp to pass to\n>          * the IPA. Any embedded buffers with a timestamp lower than the\n> -- \n> 2.25.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 E70F6BE175\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 20 Jan 2023 11:22:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 59378625D8;\n\tFri, 20 Jan 2023 12:22:27 +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 17B5E61EFD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 20 Jan 2023 12:22:26 +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 9B8DB514;\n\tFri, 20 Jan 2023 12:22:25 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1674213747;\n\tbh=V/kk8mwnKyL/DKKeZUg7bWFklKx3rLnlfDgNehipRE0=;\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:\n\tFrom;\n\tb=cHQE89A3C6J2GcKjAnSak7dB8QMeg09TP/Ywd/cGOVhdHNJUqcUopddfMb5ZZeR59\n\tiVtyTkiLG7jOkO765TzvN1OC6FUnIb6gMXVXl9DuBn4J9ixZJsND48UFvUdoyrukky\n\tibS9/aas+DCNKC6zNvZw+Iir2ZarjthHLknIXnqy6RN95uCmwYTmPsLqVzLJ2h8gBy\n\tSQmJZY1dYJRbhwivXdjnV7bxA+1ezgv0IlUuapDM8zlUH5S8+756tbRt3yR4NBpbyq\n\t1VzUdwW543FQhX9vZ1eEPetA8KY4afl4tm6kWxcZ87jdCdJO1Hd/HLKGq/YuJpyxuX\n\tpdMbYLttKglsA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1674213745;\n\tbh=V/kk8mwnKyL/DKKeZUg7bWFklKx3rLnlfDgNehipRE0=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=kBnkeiTp+kJZfD6z8vRbfGgOvY943XtlqZ6QOJtdMdg+1CKeQZEgGfdupi88GAFKx\n\t2iGwfWcN+Af1oWULG64px9/Jspuu6zXH9kS+1CmsunPSPilzeB00rnB5LiXHBa6pg8\n\tpoJ0RsHsXREX+rlAfUuBLCpzxqQMhuj+NY/a+oQw="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"kBnkeiTp\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20230118085953.7027-12-naush@raspberrypi.com>","References":"<20230118085953.7027-1-naush@raspberrypi.com>\n\t<20230118085953.7027-12-naush@raspberrypi.com>","To":"Naushir Patuck <naush@raspberrypi.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Fri, 20 Jan 2023 11:22:22 +0000","Message-ID":"<167421374282.42371.181337166489500571@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":26301,"web_url":"https://patchwork.libcamera.org/comment/26301/","msgid":"<CAEmqJPpQASsUGb5gfjb_rPKqa5SiZ61sBS0O93bB31iKJD_+ZA@mail.gmail.com>","date":"2023-01-20T15:19:31","subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Kieran,\n\nThank you for the feedback!\n\nOn Fri, 20 Jan 2023 at 11:22, Kieran Bingham <\nkieran.bingham@ideasonboard.com> wrote:\n\n> Quoting Naushir Patuck via libcamera-devel (2023-01-18 08:59:52)\n> > Add a pipeline config parameter \"return_newest_frames\" to always use the\n> > most recently captured Unicam frame when processing a request. This\n> effectively\n> > stops the pipeline handler from queuing Unicam buffers and processing\n> requests\n> > using the buffer at the front of the queue.\n> >\n> > Note that setting this parameter might incur unnecessary frame drops\n> during\n> > times of high transient CPU loads where the application might not be\n> able to\n> > provide requests quick enough.\n>\n> I'd be tempted to add here, 'But it can lower perceived latency of the\n> output when recovering from a frame drop scenario' ? (if that's correct)\n>\n\nYes, I think that's valid - I'll add it in.\n\n\n>\n> >\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> > ---\n> >  .../pipeline/raspberrypi/data/example.yaml    |  7 +++++-\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 23 +++++++++++++++++++\n> >  2 files changed, 29 insertions(+), 1 deletion(-)\n> >\n> > diff --git a/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > index 421f30e62aa3..04a117f38ada 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > +++ b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > @@ -19,6 +19,11 @@\n> >\n> >                  # Override any request from the IPA to drop a number of\n> startup\n> >                  # frames.\n> > -                \"disable_startup_frame_drops\": false\n> > +                \"disable_startup_frame_drops\": false,\n>\n> Can the options always have a comma so they don't require modifiying\n> the previous one to add a new one?\n>\n> Is that because you're treating this file as json instead of yaml ?\n>\n\nThis was certainly needed when the files were named *.json in\nearlier revisions.\nNot sure now that they are *.yaml with json format...\n\n\n>\n> > +\n> > +                # Always process a pending request with the last\n> captured sensor\n> > +                # frame.  Note that this might lead to avoidable frame\n> drops\n> > +                # during periods of transient heavy CPU loading.\n> > +                \"return_newest_frames\": false\n> >          }\n> >  }\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index 3529d331deb6..21edc8e05469 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -314,6 +314,11 @@ public:\n> >                  * frames.\n> >                  */\n> >                 bool disableStartupFrameDrops;\n> > +               /*\n> > +                * Always process a pending request with the last\n> captured sensor\n>\n> last / 'most recently' ?\n>\n\nAck.\n\n\n>\n> > +                * frame.\n> > +                */\n> > +               bool returnNewestFrames;\n> >         };\n> >\n> >         Config config_;\n> > @@ -1712,6 +1717,7 @@ int RPiCameraData::configurePipeline()\n> >                 .minUnicamBuffers = 2,\n> >                 .minTotalUnicamBuffers = 4,\n> >                 .disableStartupFrameDrops = false,\n> > +               .returnNewestFrames = false,\n> >         };\n> >\n> >         char const *configFromEnv =\n> utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> > @@ -1747,6 +1753,8 @@ int RPiCameraData::configurePipeline()\n> >                 phConfig[\"min_total_unicam_buffers\"].get<unsigned\n> int>(config_.minTotalUnicamBuffers);\n> >         config_.disableStartupFrameDrops =\n> >\n>  phConfig[\"disable_startup_frame_drops\"].get<bool>(config_.disableStartupFrameDrops);\n> > +       config_.returnNewestFrames =\n> > +\n>  phConfig[\"return_newest_frames\"].get<bool>(config_.returnNewestFrames);\n> >\n> >         if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {\n> >                 LOG(RPI, Error) << \"Invalid configuration:\n> min_total_unicam_buffers must be >= min_unicam_buffers\";\n> > @@ -2329,6 +2337,21 @@ bool\n> RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em\n> >         if (bayerQueue_.empty())\n> >                 return false;\n> >\n> > +       /*\n> > +        * If the pipeline is configured to only ever return the most\n> recently\n> > +        * captured frame, empty the buffer queue until a single element\n> is\n> > +        * left, corresponding to the most recent buffer. Note that this\n> will\n> > +        * likely result in possibly avoidable dropped frames.\n> > +        */\n> > +       if (config_.returnNewestFrames &&\n> !unicam_[Unicam::Image].isExternal()) {\n> > +               while (bayerQueue_.size() > 1) {\n>\n> Is this required?\n>\n> I'm a bit puzzled at the need to drop all the other frames. Don't we\n> just need to choose the oldest buffer to drop so that we can capture a\n> new image?\n>\n\nI think it is needed.  We are flushing our internal Unicam buffer queue\nup-to\nthe latest captured frame to process for the request.  Depending on the\nnumber\nof input buffers allocated, this may be > 1.\n\n\n>\n> There's still the potential for the pipeline to catch up\n> isn't there?\n>\n\nYes it might be possible to catch up, but there is no way of knowing this\ndeterministically.  Hence the comment in the config file saying that using\nthis\nflag might lead to possibly avoidable frame drops.\n\nRegards,\nNaush\n\n\n>\n> > +                       FrameBuffer *bayer = bayerQueue_.front().buffer;\n> > +\n> > +                       unicam_[Unicam::Image].returnBuffer(bayer);\n> > +                       bayerQueue_.pop();\n> > +               }\n> > +       }\n> > +\n> >         /*\n> >          * Find the embedded data buffer with a matching timestamp to\n> pass to\n> >          * the IPA. Any embedded buffers with a timestamp lower than the\n> > --\n> > 2.25.1\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 6C674BE175\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 20 Jan 2023 15:19:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CC176625E4;\n\tFri, 20 Jan 2023 16:19:49 +0100 (CET)","from mail-yb1-xb35.google.com (mail-yb1-xb35.google.com\n\t[IPv6:2607:f8b0:4864:20::b35])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 24CB961EFD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 20 Jan 2023 16:19:48 +0100 (CET)","by mail-yb1-xb35.google.com with SMTP id p188so7079313yba.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 20 Jan 2023 07:19:48 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1674227989;\n\tbh=AyTVCi8WyZCYEiapAXZPLdh876JEqcUM1tAdnfJ1GAc=;\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=vVphASYhM+HQXfsgSSlJgPAkemyUq+G+JAyrjs6Sy93iDOY93CZ6R1z40h1xShghE\n\tIg06vLhCr/QnBy+4P0J4xFiGVpmtjzB0DrKUvS6jnLXH0otr3m0GxDZ1tnIKG65JbG\n\tJ4ovHXLpohhKdgFYOTyEaj/UUstrXqXoKpAYXNauq1h8nUmXFQrII298I9mz1uEJIu\n\tDGq/23hWlfTw4QYdLK4Sxf6YGcNAduytwFFZ6Ds4bXnR7HJaeMllgkaJHCjDsZd+O4\n\tfc7/V/4xQrX6I2b3mkZ0EA6mcSCKRgWQal4MdVvp/w0dc7xUFhsMSpb/h5QaWjMma0\n\tCeaiUKl8mpIvg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\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=sdH4nJsS54MhBnWun5Brpy38iwBJHllc+1cHStDB6s4=;\n\tb=Su39wTJtbdgI0uydq6yB0LVizzmzf/jdgsQbsuLU8oI5/r6jQ15iU337sZlXWNySYB\n\tE+Kthg43484Eg8mN3ifepH1k15eTiLrbOAJQKcr3WveMVkpIoIlu/4cFMQtaz/Q7tEpX\n\tiWeUKm1VK9YQbDIa+uQzVFE+io/vSdro+t0AYlkAyoQc/j2501dB2xAM7efz4yK9iEM9\n\tqMW1p/g7KqW0VqpXDPjQx5FZKivPP8NLY7wYB5+w+Y/6x7KQl30+M35YF2s4IDI6odkI\n\t6jS4IIkhcG184cht0yiZtvDjDaI/ZqDtMZQOcLsZXQkpwrCp1FQbhiMeN9KQswIWH9Kp\n\tbwfA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"Su39wTJt\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\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=sdH4nJsS54MhBnWun5Brpy38iwBJHllc+1cHStDB6s4=;\n\tb=qq4oFTvAGwAbYYmlSQ+Oh9zeeYq8V1/elw8ryeQeZL2q81eeQMBn1zZeBpqMHqxhnM\n\t1nv6RePis0tsGwm8NgtGdwdvDUSIE9IcKCd5eRnE5iL1WInskAwX04P4+R1SdAtl75t0\n\tV/vkPKO01bVNM5f5GyPch/3dHWC4/WB+GXq949Ali0gHmWbTXmdn7ixvTJ8RoS5vIE/L\n\t5gcXp2QUJkOXMup4le/zsZzngr3hcswU7qpo5FLuiBnYoikCIcMpp1+B0mdN+UZM8r//\n\t607aToUPlzqVzvo76o8Wi0dhN5ECITU6c8enPX2gfxwJhiDfifUP5mO8t7bB3450d7e1\n\tVJFQ==","X-Gm-Message-State":"AFqh2krnr1ozGn6QnzINMnIZ36aPCp98HPPhGwh0d3pmN4ezgKjnx0RV\n\tHzDK3w5WtShhJ49p4piO4yCxUvog02/BQGFqleRGcoTpav67+aZnU/M=","X-Google-Smtp-Source":"AMrXdXuEfJHczwyLiV9PxbjE8FUDQnR4WOEKAI/hAXo2ZsomAXdYthdyWEdYQrRfbE4Zi67SJLlXa33qH525vhYK2PE=","X-Received":"by 2002:a25:7583:0:b0:783:bc5e:3d67 with SMTP id\n\tq125-20020a257583000000b00783bc5e3d67mr1278856ybc.524.1674227986981;\n\tFri, 20 Jan 2023 07:19:46 -0800 (PST)","MIME-Version":"1.0","References":"<20230118085953.7027-1-naush@raspberrypi.com>\n\t<20230118085953.7027-12-naush@raspberrypi.com>\n\t<167421374282.42371.181337166489500571@Monstersaurus>","In-Reply-To":"<167421374282.42371.181337166489500571@Monstersaurus>","Date":"Fri, 20 Jan 2023 15:19:31 +0000","Message-ID":"<CAEmqJPpQASsUGb5gfjb_rPKqa5SiZ61sBS0O93bB31iKJD_+ZA@mail.gmail.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"0000000000006fff7605f2b39492\"","Subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","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":26317,"web_url":"https://patchwork.libcamera.org/comment/26317/","msgid":"<Y83BdPW61veV6ctx@pendragon.ideasonboard.com>","date":"2023-01-22T23:06:28","subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hello,\n\nOn Fri, Jan 20, 2023 at 03:19:31PM +0000, Naushir Patuck via libcamera-devel wrote:\n> On Fri, 20 Jan 2023 at 11:22, Kieran Bingham wrote:\n> > Quoting Naushir Patuck via libcamera-devel (2023-01-18 08:59:52)\n> > > Add a pipeline config parameter \"return_newest_frames\" to always use the\n> > > most recently captured Unicam frame when processing a request. This effectively\n> > > stops the pipeline handler from queuing Unicam buffers and processing requests\n> > > using the buffer at the front of the queue.\n> > >\n> > > Note that setting this parameter might incur unnecessary frame drops during\n> > > times of high transient CPU loads where the application might not be able to\n> > > provide requests quick enough.\n> >\n> > I'd be tempted to add here, 'But it can lower perceived latency of the\n> > output when recovering from a frame drop scenario' ? (if that's correct)\n> \n> Yes, I think that's valid - I'll add it in.\n> \n> > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> > > ---\n> > >  .../pipeline/raspberrypi/data/example.yaml    |  7 +++++-\n> > >  .../pipeline/raspberrypi/raspberrypi.cpp      | 23 +++++++++++++++++++\n> > >  2 files changed, 29 insertions(+), 1 deletion(-)\n> > >\n> > > diff --git a/src/libcamera/pipeline/raspberrypi/data/example.yaml b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > > index 421f30e62aa3..04a117f38ada 100644\n> > > --- a/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > > +++ b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > > @@ -19,6 +19,11 @@\n> > >\n> > >                  # Override any request from the IPA to drop a number of startup\n> > >                  # frames.\n> > > -                \"disable_startup_frame_drops\": false\n> > > +                \"disable_startup_frame_drops\": false,\n> >\n> > Can the options always have a comma so they don't require modifiying\n> > the previous one to add a new one?\n> >\n> > Is that because you're treating this file as json instead of yaml ?\n> \n> This was certainly needed when the files were named *.json in\n> earlier revisions.\n> Not sure now that they are *.yaml with json format...\n\nNot that you have to do so, but there's also the option of formatting\nthe files with the \"normal\" YAML syntax.\n\n> > > +\n> > > +                # Always process a pending request with the last captured sensor\n> > > +                # frame.  Note that this might lead to avoidable frame drops\n\ns/  / /\n\n> > > +                # during periods of transient heavy CPU loading.\n> > > +                \"return_newest_frames\": false\n> > >          }\n> > >  }\n> > > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > index 3529d331deb6..21edc8e05469 100644\n> > > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > @@ -314,6 +314,11 @@ public:\n> > >                  * frames.\n> > >                  */\n> > >                 bool disableStartupFrameDrops;\n> > > +               /*\n> > > +                * Always process a pending request with the last captured sensor\n> >\n> > last / 'most recently' ?\n> \n> Ack.\n> \n> > > +                * frame.\n> > > +                */\n> > > +               bool returnNewestFrames;\n> > >         };\n> > >\n> > >         Config config_;\n> > > @@ -1712,6 +1717,7 @@ int RPiCameraData::configurePipeline()\n> > >                 .minUnicamBuffers = 2,\n> > >                 .minTotalUnicamBuffers = 4,\n> > >                 .disableStartupFrameDrops = false,\n> > > +               .returnNewestFrames = false,\n> > >         };\n> > >\n> > >         char const *configFromEnv = utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> > > @@ -1747,6 +1753,8 @@ int RPiCameraData::configurePipeline()\n> > >                 phConfig[\"min_total_unicam_buffers\"].get<unsigned int>(config_.minTotalUnicamBuffers);\n> > >         config_.disableStartupFrameDrops =\n> > >                 phConfig[\"disable_startup_frame_drops\"].get<bool>(config_.disableStartupFrameDrops);\n> > > +       config_.returnNewestFrames =\n> > > +               phConfig[\"return_newest_frames\"].get<bool>(config_.returnNewestFrames);\n> > >\n> > >         if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {\n> > >                 LOG(RPI, Error) << \"Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers\";\n> > > @@ -2329,6 +2337,21 @@ bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em\n> > >         if (bayerQueue_.empty())\n> > >                 return false;\n> > >\n> > > +       /*\n> > > +        * If the pipeline is configured to only ever return the most recently\n> > > +        * captured frame, empty the buffer queue until a single element is\n> > > +        * left, corresponding to the most recent buffer. Note that this will\n> > > +        * likely result in possibly avoidable dropped frames.\n> > > +        */\n> > > +       if (config_.returnNewestFrames && !unicam_[Unicam::Image].isExternal()) {\n> > > +               while (bayerQueue_.size() > 1) {\n> >\n> > Is this required?\n> >\n> > I'm a bit puzzled at the need to drop all the other frames. Don't we\n> > just need to choose the oldest buffer to drop so that we can capture a\n> > new image?\n> \n> I think it is needed.  We are flushing our internal Unicam buffer queue up-to\n> the latest captured frame to process for the request.  Depending on the number\n> of input buffers allocated, this may be > 1.\n> \n> > There's still the potential for the pipeline to catch up\n> > isn't there?\n> \n> Yes it might be possible to catch up, but there is no way of knowing this\n> deterministically.  Hence the comment in the config file saying that using this\n> flag might lead to possibly avoidable frame drops.\n\nMight may be a bit of an understatement :-) I wonder if it would be\npossible to flush the queue only when we detect a frame drop.\n\nWhat's the expected use case for this configuration parameter ?\n\n> > > +                       FrameBuffer *bayer = bayerQueue_.front().buffer;\n> > > +\n> > > +                       unicam_[Unicam::Image].returnBuffer(bayer);\n> > > +                       bayerQueue_.pop();\n> > > +               }\n> > > +       }\n> > > +\n> > >         /*\n> > >          * Find the embedded data buffer with a matching timestamp to pass to\n> > >          * the IPA. Any embedded buffers with a timestamp lower than the","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 CBDD0BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 22 Jan 2023 23:06:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1894D625E4;\n\tMon, 23 Jan 2023 00:06:34 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EDBB961EFC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 23 Jan 2023 00:06:31 +0100 (CET)","from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi\n\t[213.243.189.158])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6AA0074C;\n\tMon, 23 Jan 2023 00:06:31 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1674428794;\n\tbh=S2LmRassxUIdrnCsxwL6YAuenl/3gyRR58tYMJYgg0g=;\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=pt5NqBQQV4+RKARB6Y79J/rpUYn9dPwpNTavUHifKq0BDN4NwOGWWc3Rh36bnRWWg\n\tC/4w+YramN2rqZ1Ybz8mLd6H2AvQkVN2r4gGsJzLOROJ9ggs/y1mdx1Y5adYiFwRHS\n\t3UCDgZSWo1kk+WgVv++stcnbdnKatAKZoF6sRSwxv2Fmzfu8nGIj3a7cwSEAB2XreM\n\tD9ibwvv1HoooHqqavmI4+cbh4ARL8E8rS2wTqNG7MsTEmnvKhLwGrA/tWd4UsZz2sF\n\tCuXeHRkD8eTgKambl1IizQOvu3+jFjVmTg7QPn8HvSU09VCEXMs5onZnDZqWTwBm9u\n\tp6tb4+POsCV3g==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1674428791;\n\tbh=S2LmRassxUIdrnCsxwL6YAuenl/3gyRR58tYMJYgg0g=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=OwN6YO38nvgucVkhZZnsQ0T8spzxs9MwcOznw2tH7C/wBe87E7pp5bJyz7AnteV31\n\t8W/DgjkZOfTTI+8XssGZo3AHl3LVZw+F35rE3yeRNPpVbyqbLRQoNVyikpF36a8Bu0\n\tA0PEeVrPRMEufx4243K9Yv80iGjIieMi6GjvRObw="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"OwN6YO38\"; dkim-atps=neutral","Date":"Mon, 23 Jan 2023 01:06:28 +0200","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<Y83BdPW61veV6ctx@pendragon.ideasonboard.com>","References":"<20230118085953.7027-1-naush@raspberrypi.com>\n\t<20230118085953.7027-12-naush@raspberrypi.com>\n\t<167421374282.42371.181337166489500571@Monstersaurus>\n\t<CAEmqJPpQASsUGb5gfjb_rPKqa5SiZ61sBS0O93bB31iKJD_+ZA@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAEmqJPpQASsUGb5gfjb_rPKqa5SiZ61sBS0O93bB31iKJD_+ZA@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","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":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":26354,"web_url":"https://patchwork.libcamera.org/comment/26354/","msgid":"<CAEmqJPrT9pZSRY0-D7gN9oYRYiL2Np+X5yXB59isxcX3uQmiqg@mail.gmail.com>","date":"2023-01-25T14:21:03","subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Laurent,\n\nThank you for your feedback.\n\nOn Sun, 22 Jan 2023 at 23:06, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hello,\n>\n> On Fri, Jan 20, 2023 at 03:19:31PM +0000, Naushir Patuck via libcamera-devel wrote:\n> > On Fri, 20 Jan 2023 at 11:22, Kieran Bingham wrote:\n> > > Quoting Naushir Patuck via libcamera-devel (2023-01-18 08:59:52)\n> > > > Add a pipeline config parameter \"return_newest_frames\" to always use the\n> > > > most recently captured Unicam frame when processing a request. This effectively\n> > > > stops the pipeline handler from queuing Unicam buffers and processing requests\n> > > > using the buffer at the front of the queue.\n> > > >\n> > > > Note that setting this parameter might incur unnecessary frame drops during\n> > > > times of high transient CPU loads where the application might not be able to\n> > > > provide requests quick enough.\n> > >\n> > > I'd be tempted to add here, 'But it can lower perceived latency of the\n> > > output when recovering from a frame drop scenario' ? (if that's correct)\n> >\n> > Yes, I think that's valid - I'll add it in.\n> >\n> > > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > > > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> > > > ---\n> > > >  .../pipeline/raspberrypi/data/example.yaml    |  7 +++++-\n> > > >  .../pipeline/raspberrypi/raspberrypi.cpp      | 23 +++++++++++++++++++\n> > > >  2 files changed, 29 insertions(+), 1 deletion(-)\n> > > >\n> > > > diff --git a/src/libcamera/pipeline/raspberrypi/data/example.yaml b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > > > index 421f30e62aa3..04a117f38ada 100644\n> > > > --- a/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > > > +++ b/src/libcamera/pipeline/raspberrypi/data/example.yaml\n> > > > @@ -19,6 +19,11 @@\n> > > >\n> > > >                  # Override any request from the IPA to drop a number of startup\n> > > >                  # frames.\n> > > > -                \"disable_startup_frame_drops\": false\n> > > > +                \"disable_startup_frame_drops\": false,\n> > >\n> > > Can the options always have a comma so they don't require modifiying\n> > > the previous one to add a new one?\n> > >\n> > > Is that because you're treating this file as json instead of yaml ?\n> >\n> > This was certainly needed when the files were named *.json in\n> > earlier revisions.\n> > Not sure now that they are *.yaml with json format...\n>\n> Not that you have to do so, but there's also the option of formatting\n> the files with the \"normal\" YAML syntax.\n>\n> > > > +\n> > > > +                # Always process a pending request with the last captured sensor\n> > > > +                # frame.  Note that this might lead to avoidable frame drops\n>\n> s/  / /\n>\n> > > > +                # during periods of transient heavy CPU loading.\n> > > > +                \"return_newest_frames\": false\n> > > >          }\n> > > >  }\n> > > > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > index 3529d331deb6..21edc8e05469 100644\n> > > > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > @@ -314,6 +314,11 @@ public:\n> > > >                  * frames.\n> > > >                  */\n> > > >                 bool disableStartupFrameDrops;\n> > > > +               /*\n> > > > +                * Always process a pending request with the last captured sensor\n> > >\n> > > last / 'most recently' ?\n> >\n> > Ack.\n> >\n> > > > +                * frame.\n> > > > +                */\n> > > > +               bool returnNewestFrames;\n> > > >         };\n> > > >\n> > > >         Config config_;\n> > > > @@ -1712,6 +1717,7 @@ int RPiCameraData::configurePipeline()\n> > > >                 .minUnicamBuffers = 2,\n> > > >                 .minTotalUnicamBuffers = 4,\n> > > >                 .disableStartupFrameDrops = false,\n> > > > +               .returnNewestFrames = false,\n> > > >         };\n> > > >\n> > > >         char const *configFromEnv = utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> > > > @@ -1747,6 +1753,8 @@ int RPiCameraData::configurePipeline()\n> > > >                 phConfig[\"min_total_unicam_buffers\"].get<unsigned int>(config_.minTotalUnicamBuffers);\n> > > >         config_.disableStartupFrameDrops =\n> > > >                 phConfig[\"disable_startup_frame_drops\"].get<bool>(config_.disableStartupFrameDrops);\n> > > > +       config_.returnNewestFrames =\n> > > > +               phConfig[\"return_newest_frames\"].get<bool>(config_.returnNewestFrames);\n> > > >\n> > > >         if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {\n> > > >                 LOG(RPI, Error) << \"Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers\";\n> > > > @@ -2329,6 +2337,21 @@ bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em\n> > > >         if (bayerQueue_.empty())\n> > > >                 return false;\n> > > >\n> > > > +       /*\n> > > > +        * If the pipeline is configured to only ever return the most recently\n> > > > +        * captured frame, empty the buffer queue until a single element is\n> > > > +        * left, corresponding to the most recent buffer. Note that this will\n> > > > +        * likely result in possibly avoidable dropped frames.\n> > > > +        */\n> > > > +       if (config_.returnNewestFrames && !unicam_[Unicam::Image].isExternal()) {\n> > > > +               while (bayerQueue_.size() > 1) {\n> > >\n> > > Is this required?\n> > >\n> > > I'm a bit puzzled at the need to drop all the other frames. Don't we\n> > > just need to choose the oldest buffer to drop so that we can capture a\n> > > new image?\n> >\n> > I think it is needed.  We are flushing our internal Unicam buffer queue up-to\n> > the latest captured frame to process for the request.  Depending on the number\n> > of input buffers allocated, this may be > 1.\n> >\n> > > There's still the potential for the pipeline to catch up\n> > > isn't there?\n> >\n> > Yes it might be possible to catch up, but there is no way of knowing this\n> > deterministically.  Hence the comment in the config file saying that using this\n> > flag might lead to possibly avoidable frame drops.\n>\n> Might may be a bit of an understatement :-) I wonder if it would be\n> possible to flush the queue only when we detect a frame drop.\n>\n> What's the expected use case for this configuration parameter ?\n\nThis is meant to reduce capture-to-display latency by always flushing the\ninternal buffer queue.  This is to accommodate those few users who insist on\ndoing timelapse by rate limiting the Request queueing.  However now that I think\nabout it, this is easily achievable by simply having a RAW stream configured,\nand setting min_unicam_buffers to 0.  Or alternatively, set min_unicam_buffers\nto 1, and not have a RAW stream - this is not the same, but does reduce latency.\nI am tempted to just remove this patch now.\n\nNaush\n\n>\n> > > > +                       FrameBuffer *bayer = bayerQueue_.front().buffer;\n> > > > +\n> > > > +                       unicam_[Unicam::Image].returnBuffer(bayer);\n> > > > +                       bayerQueue_.pop();\n> > > > +               }\n> > > > +       }\n> > > > +\n> > > >         /*\n> > > >          * Find the embedded data buffer with a matching timestamp to pass to\n> > > >          * the IPA. Any embedded buffers with a timestamp lower than the\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","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 50E16BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 25 Jan 2023 14:21:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B11CD625D8;\n\tWed, 25 Jan 2023 15:21:21 +0100 (CET)","from mail-yb1-xb35.google.com (mail-yb1-xb35.google.com\n\t[IPv6:2607:f8b0:4864:20::b35])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 80DB7603C0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Jan 2023 15:21:20 +0100 (CET)","by mail-yb1-xb35.google.com with SMTP id e15so992400ybn.10\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Jan 2023 06:21:20 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1674656481;\n\tbh=aokGq6u43aU4IIVmy2dY36Rhjtv8E7WBkac86ZsNmew=;\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=Q+sys3hgEUoYToIh4ricBhUhFsq2m6Mxr5jTSZ+gTkLwMlDF7N2MCzhxQGl+HCMzK\n\t9Z1Q8FGIv43S+AJ4yAyZYJhF+pTYmoI4RT2Ck0tj8MGxR8fjzpqIHAZR/xEWBxeC0B\n\tvxbQcjXb8LK2qXvjL8suFKMP16y6kzHL3zhkId/8HMWZ3aA6SWp9DsOfRwHVdzxp9F\n\tysW59HVW/I/eHmRO5aiOLs3EqFQpH2chulwddfEUd+sJrDhffk5U2DetHnoryx5U40\n\trNtjNVlY3Yc5wqv7SW/hu7REOkkIS/QYJBVEI6ssQmbd/Pu0AwhlU9Q5f2ntxoUxhx\n\taLmDR8Ju5u92A==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\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=vSy5oN5thQm1tqpfp/tiQam4t4cV1oOM8eNNmMmMeJo=;\n\tb=kGyoPBvaiqljSUuF7SCTknM3AL97b46iYoZjVkx1W3Ljx13xsHrhBcjwCu3WdsEYZt\n\tOF0Nd2kOvLc2yM8+qoqtwYSfvHRWoHFPgBYDC5PdEmBdGcoX8a4IRVEcDuX+WRmJBg45\n\tcNsZqkrBMDH5bNoACTidFhsHew7G9PToGcxigV76SKpW2NoKgTs9m5IGRuWvW1oYaKfz\n\tLLyuyPehp0cl7uq/rvH6WxWVAvjE9Hh2iwweUdSQfgNJ/sEvJhJ7VkR8nOuTu7JDKKrt\n\tPKuqLdJEo1OpMQ1w1jPjCdwGQ6c+sm8EeKk2RfDuJHLf+Vb4US3PSR+XUx+DQ/r5bDUv\n\tnHFg=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"kGyoPBva\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\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=vSy5oN5thQm1tqpfp/tiQam4t4cV1oOM8eNNmMmMeJo=;\n\tb=uFP0lpVo72URejNf8VhjO00VV+XJqnw/pS4d2d4tgWn/Z0VRLhxNXOEE/QsXADBpPG\n\tsbQlo6oZpb2fsj+QxwWbfAS7sOkAwCyrwdoX5LpT+H5EDpXVlVpiMOqRLQthOaaqhQMF\n\t6UTyuJEE4akXQLz8F+jmu7GqM0/KHpUahu7Kqi1R7WGh+LO9T9a44jPXzMrV3uhwGDpg\n\tOgX71OrLx5DMimSh+xFPDDsgyJ3UEqrwQDjS8vBQtF2GddQx21FkyvhsK2gYU8zAeFt3\n\taPrWF4l3IXu3CIoNmejC6ALZSnPo5JdbGAdugo9MPE66ZWi7KkPLYfHztb+0rhPOtvFX\n\tfL1w==","X-Gm-Message-State":"AFqh2kpelmwGpRll7wf+SigbSifeTKGT3HIojrycsuzEztW7fJhDHH9X\n\tehrSSLbG50dDQY9AIGTtJM+I+rJru3gun/yLpqdb3w==","X-Google-Smtp-Source":"AMrXdXtvvqnmHucBUAWRUWY6vkLW3nUR0hcVG92N/vyQRzmxzGE57+oiX5wOtGdzwO9VNuHeDFkhEq19/IS92YsKeYU=","X-Received":"by 2002:a25:7583:0:b0:783:bc5e:3d67 with SMTP id\n\tq125-20020a257583000000b00783bc5e3d67mr2504769ybc.524.1674656479278;\n\tWed, 25 Jan 2023 06:21:19 -0800 (PST)","MIME-Version":"1.0","References":"<20230118085953.7027-1-naush@raspberrypi.com>\n\t<20230118085953.7027-12-naush@raspberrypi.com>\n\t<167421374282.42371.181337166489500571@Monstersaurus>\n\t<CAEmqJPpQASsUGb5gfjb_rPKqa5SiZ61sBS0O93bB31iKJD_+ZA@mail.gmail.com>\n\t<Y83BdPW61veV6ctx@pendragon.ideasonboard.com>","In-Reply-To":"<Y83BdPW61veV6ctx@pendragon.ideasonboard.com>","Date":"Wed, 25 Jan 2023 14:21:03 +0000","Message-ID":"<CAEmqJPrT9pZSRY0-D7gN9oYRYiL2Np+X5yXB59isxcX3uQmiqg@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH v5 11/12] pipeline: raspberrypi: Allow\n\tpipeline handler to always use the newest frame","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>"}}]