[{"id":25986,"web_url":"https://patchwork.libcamera.org/comment/25986/","msgid":"<Y4odoH1Tq8Ao6w6r@pendragon.ideasonboard.com>","date":"2022-12-02T15:45:36","subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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":"Hi Naush,\n\nThank you for the patch.\n\nOn Tue, Nov 29, 2022 at 01:45:32PM +0000, Naushir Patuck via libcamera-devel wrote:\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\nYou're explaining the downside, but not why an application may want to\ndo this. What are the expected use cases ?\n\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  .../pipeline/raspberrypi/data/default.json    |  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/default.json b/src/libcamera/pipeline/raspberrypi/data/default.json\n> index 707414bcc5c5..eda053258c67 100644\n> --- a/src/libcamera/pipeline/raspberrypi/data/default.json\n> +++ b/src/libcamera/pipeline/raspberrypi/data/default.json\n> @@ -18,6 +18,11 @@\n>                  \"num_output0_buffers\": 1,\n>  \n>                  # Override any request from the IPA to drop a number of startup frames.\n> -                \"disable_startup_frame_drops\": false\n> +                \"disable_startup_frame_drops\": false,\n> +\n> +                # Always process a pending request with the last captured sensor frame.\n> +                # Note that this might lead to avoidable frame drops during periods\n> +                # 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 ef49d32037af..a369fbd2a528 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -317,6 +317,11 @@ public:\n>  \t\t * frames.\n>  \t\t */\n>  \t\tbool disableStartupFrameDrops;\n> +\t\t/*\n> +\t\t * Always process a pending request with the last captured sensor\n> +\t\t * frame.\n> +\t\t */\n> +\t\tbool returnNewestFrames;\n>  \t};\n>  \n>  \tConfig config_;\n> @@ -1457,6 +1462,7 @@ int PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n>  \t\t.minTotalUnicamBuffers = 4,\n>  \t\t.numOutput0Buffers = 1,\n>  \t\t.disableStartupFrameDrops = false,\n> +\t\t.returnNewestFrames = false,\n>  \t};\n>  \n>  \tchar const *configFromEnv = utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> @@ -1493,6 +1499,8 @@ int PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n>  \t\tphConfig[\"num_output0_buffers\"].get<unsigned int>(config.numOutput0Buffers);\n>  \tconfig.disableStartupFrameDrops =\n>  \t\tphConfig[\"disable_startup_frame_drops\"].get<bool>(config.disableStartupFrameDrops);\n> +\tconfig.returnNewestFrames =\n> +\t\tphConfig[\"return_newest_frames\"].get<bool>(config.returnNewestFrames);\n>  \n>  \tif (config.minTotalUnicamBuffers < config.minUnicamBuffers) {\n>  \t\tLOG(RPI, Error) << \"Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers!\";\n> @@ -2349,6 +2357,21 @@ bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em\n>  \tif (bayerQueue_.empty())\n>  \t\treturn false;\n>  \n> +\t/*\n> +\t * If the pipeline is configured to only ever return the most recently\n> +\t * captured frame, empty the buffer queue until a single element is\n> +\t * left, corresponding to the most recent buffer. Note that this will\n> +\t * likely result in possibly avoidable dropped frames.\n> +\t */\n> +\tif (config_.returnNewestFrames && !unicam_[Unicam::Image].isExternal()) {\n> +\t\twhile (bayerQueue_.size() > 1) {\n> +\t\t\tFrameBuffer *bayer = bayerQueue_.front().buffer;\n> +\n> +\t\t\tunicam_[Unicam::Image].returnBuffer(bayer);\n> +\t\t\tbayerQueue_.pop();\n> +\t\t}\n> +\t}\n> +\n>  \t/*\n>  \t * Find the embedded data buffer with a matching timestamp to pass to\n>  \t * 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 DAA38BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  2 Dec 2022 15:45:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3D11163336;\n\tFri,  2 Dec 2022 16:45:41 +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 059F860483\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  2 Dec 2022 16:45:39 +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 675CB6E0;\n\tFri,  2 Dec 2022 16:45:38 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669995941;\n\tbh=XyAt+OeHnzEX2e210YHt6d0zolgK+w+i4u+w2fsUUW8=;\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=Zqu7swQjL3pzA5UdvRAT80TjseHpJAXamdI9vqg80G1/4SYvo7pNmGSJ7UdlGNbqy\n\t4ba83af106MUunE9BQT16BKv+rTSwPPiqvQW35KdKn6VOQpGRH7sPZVojjdLZdKmp6\n\tN1vnD6Fg3fIHNGLXlQHZ0r2giKTuai6hy602objsp6jmuBY4YRYI/1m/mCdL+dHb2N\n\tAl3gJ+Pzqh7F7HYqPrg3UWQT7XhwUVkn3Fc0Y3MKn7U1xgb/jDkTQS4f1NB1h3M4Bx\n\tLx8XRl/2HgG/Qnxwe/in/im83sNlWR3wREUtzzEu0fSIoUcd6J7TkMtsfn+1D9bd6W\n\t4UQ3iTrfxgPhQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1669995938;\n\tbh=XyAt+OeHnzEX2e210YHt6d0zolgK+w+i4u+w2fsUUW8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=nkUDQ5vvMPqESivN1mq7gkaKTIG9e1KEvSvFEA3NaVKtejLFyE2XHnYo6vV4FSdkl\n\tcxYDSNx7nvKyHec/VOL6VHjTC8bixyWrS0jhGKQ7sWH8rNfrEcGVWt7UoxJvOLBIVL\n\taDynjSUKoCeuop/9esODfyqmmmvkGlO31Dixp4QA="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"nkUDQ5vv\"; dkim-atps=neutral","Date":"Fri, 2 Dec 2022 17:45:36 +0200","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<Y4odoH1Tq8Ao6w6r@pendragon.ideasonboard.com>","References":"<20221129134534.2933-1-naush@raspberrypi.com>\n\t<20221129134534.2933-9-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221129134534.2933-9-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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":26002,"web_url":"https://patchwork.libcamera.org/comment/26002/","msgid":"<CAEmqJPoi6dznFfyL4UWOvAezz6DopumExdL=GZw=ZPBy3hPGng@mail.gmail.com>","date":"2022-12-05T10:58:40","subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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\nOn Fri, 2 Dec 2022 at 15:45, Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Hi Naush,\n>\n> Thank you for the patch.\n>\n> On Tue, Nov 29, 2022 at 01:45:32PM +0000, Naushir Patuck via\n> libcamera-devel wrote:\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> You're explaining the downside, but not why an application may want to\n> do this. What are the expected use cases ?\n>\n\nThis is one of those user requests that I don't necessarily agree with, but\neasy\nenough to work around :-)\n\nSome users have expressed problems with their custom application where they\ntry to emulate timelapse captures by triggering Requests to the period of\nthe timelapse value.  The complaint is that the Request gets completed with\none\nof the Unicam buffers completed well before the Request was issued, which I\nsuppose\nis reasonable.\n\nOf course, there are other work-arounds (recycle requests as soon as\npossible\nand only use the output at the timelapse interval), but the grumbling still\ncontinues,\nso this gives an easy way to \"fix\" this.\n\nRegards,\nNaush\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/default.json    |  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/default.json\n> b/src/libcamera/pipeline/raspberrypi/data/default.json\n> > index 707414bcc5c5..eda053258c67 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/data/default.json\n> > +++ b/src/libcamera/pipeline/raspberrypi/data/default.json\n> > @@ -18,6 +18,11 @@\n> >                  \"num_output0_buffers\": 1,\n> >\n> >                  # Override any request from the IPA to drop a number of\n> startup frames.\n> > -                \"disable_startup_frame_drops\": false\n> > +                \"disable_startup_frame_drops\": false,\n> > +\n> > +                # Always process a pending request with the last\n> captured sensor frame.\n> > +                # Note that this might lead to avoidable frame drops\n> during periods\n> > +                # 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 ef49d32037af..a369fbd2a528 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -317,6 +317,11 @@ public:\n> >                * frames.\n> >                */\n> >               bool disableStartupFrameDrops;\n> > +             /*\n> > +              * Always process a pending request with the last captured\n> sensor\n> > +              * frame.\n> > +              */\n> > +             bool returnNewestFrames;\n> >       };\n> >\n> >       Config config_;\n> > @@ -1457,6 +1462,7 @@ int\n> PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n> >               .minTotalUnicamBuffers = 4,\n> >               .numOutput0Buffers = 1,\n> >               .disableStartupFrameDrops = false,\n> > +             .returnNewestFrames = false,\n> >       };\n> >\n> >       char const *configFromEnv =\n> utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> > @@ -1493,6 +1499,8 @@ int\n> PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n> >               phConfig[\"num_output0_buffers\"].get<unsigned\n> int>(config.numOutput0Buffers);\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> > @@ -2349,6 +2357,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 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> > +                     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\n> to\n> >        * the IPA. Any embedded buffers with a timestamp lower than the\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\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 C3758BE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  5 Dec 2022 10:58:57 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 112466333F;\n\tMon,  5 Dec 2022 11:58:57 +0100 (CET)","from mail-io1-xd31.google.com (mail-io1-xd31.google.com\n\t[IPv6:2607:f8b0:4864:20::d31])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BB08163335\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  5 Dec 2022 11:58:54 +0100 (CET)","by mail-io1-xd31.google.com with SMTP id h6so1498938iof.9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 05 Dec 2022 02:58:54 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1670237937;\n\tbh=Ua8iNmG8cttXIXjSvooMQ9CHJIHcwlwNcNSwQ/I1sjU=;\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=BX8GmInoVx2WXQxbb5abDOesRguFxRupJ1M37NHiWt15qpZir/aiM+9imm+GYW8EE\n\tRJvHV0AaWhoV8Eg5BnuQzFhhrOrUblWBRR5WGlM7zgTz61ZqJxo+i8j+2eOGvegpu9\n\te6+D4XVMsBXluee6iSsN5M48DneDwSCu/nhU7LzEwwMOoAubSnZvTYUkor3Iu/NyLM\n\thsatA2sA0my7b6TKFyI4R+ltNPJyAIMH6la/Sfr/3bpKV+N0QeHe5e2O6KI2kxoEKy\n\t/yHSat468gW1S/bIziZyoWAssaCaPjkRlqqsg2Qml55QhOaA88gpRAdp6BUrtqiqLq\n\tq6djSAZgtNZtQ==","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=PwAZoH6bTpMR93ajbM9mKTKrCA/Jrw1Wto6d2SyARRI=;\n\tb=d9AR2ZByt1YGeZSqz7++PyTavhRsxhKtbGkrYgyNb1mNFZUYQMcU5v1hPiafIlXJEC\n\t4uM3trujWpHvUet5N8oLeV+pSK8VY2iT+vtkaYMT/5XXIZj+V2gXi7YoJ+JB1I0vbeih\n\twWn/zIlGiy6hXutXHZtZT+fzLM/iPgGZ15zyTrWo2u9eEBYdP1c78ecwPfMyDD3pbS3t\n\tWnM8fTc7oc4rUI982vdRkz3m1/iBBK4PSWkrVzapI+DFES1R20Y57XblRR9Q2sdYn4uX\n\txES2E52Eb0mleeeSuJcokWvVAUYWa8kzj6sQCL+B6ZAKduIF18shaKaAPM1IO/VWSp1f\n\t3M4Q=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"d9AR2ZBy\"; 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=PwAZoH6bTpMR93ajbM9mKTKrCA/Jrw1Wto6d2SyARRI=;\n\tb=ZJ9SdNsbMFD3UXN61z38G6Am15WdD9CzvFHERX+Wng49D5pZLHi/M7g/2Abg+8lX2T\n\t6HfSUSrym4BkvWdvgCFr/lIXc3SU5t6kUDaHCdE3BQBH7oYN0VNmB0DpTQf0/zIAutz/\n\t+kuSsGWFQu/oaHhc52SY/AWwrBXQmL0XNSoQOzGhEurbLtbYp/gvLXxYqbgmx3fvyz3B\n\tYyGSYtpvUm9Jyy4a3LZEZ4Feocyp1NThV2sb9oLoG64pBaahdcHGIvgWN9+xswD+LHqR\n\t8fdAJwcA3K5shGMbnmo9WjnZqAy0SAIaI81XJkIIHDtNL6S0c7qckeyyLbxiASo2Sc2d\n\thfSA==","X-Gm-Message-State":"ANoB5pkCjAhsmxJxR940VcBQQFVqsjCWOkcl5AsJJ2TEZghSWafsyqAp\n\tFsPPYCzKODFlg+Fd7G65JrVH7QzIwUjti4ahXclcoMaOOqc1LsmE","X-Google-Smtp-Source":"AA0mqf6O6krqArVk15B+y0AI4U/FxDRLfFnrM6B0bhKVwrhFtFpHo51+8BxT9sUVn553QhShu61stjw3cZb6qUTLZzY=","X-Received":"by 2002:a5d:88c3:0:b0:6d6:5fe4:8212 with SMTP id\n\ti3-20020a5d88c3000000b006d65fe48212mr38138867iol.180.1670237933451;\n\tMon, 05 Dec 2022 02:58:53 -0800 (PST)","MIME-Version":"1.0","References":"<20221129134534.2933-1-naush@raspberrypi.com>\n\t<20221129134534.2933-9-naush@raspberrypi.com>\n\t<Y4odoH1Tq8Ao6w6r@pendragon.ideasonboard.com>","In-Reply-To":"<Y4odoH1Tq8Ao6w6r@pendragon.ideasonboard.com>","Date":"Mon, 5 Dec 2022 10:58:40 +0000","Message-ID":"<CAEmqJPoi6dznFfyL4UWOvAezz6DopumExdL=GZw=ZPBy3hPGng@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"000000000000b6d75105ef12929c\"","Subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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":26005,"web_url":"https://patchwork.libcamera.org/comment/26005/","msgid":"<Y430vK8QPgm6HqT2@pendragon.ideasonboard.com>","date":"2022-12-05T13:40:12","subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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":"Hi Naush,\n\nOn Mon, Dec 05, 2022 at 10:58:40AM +0000, Naushir Patuck wrote:\n> On Fri, 2 Dec 2022 at 15:45, Laurent Pinchart wrote:\n> > On Tue, Nov 29, 2022 at 01:45:32PM +0000, Naushir Patuck via libcamera-devel wrote:\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> > You're explaining the downside, but not why an application may want to\n> > do this. What are the expected use cases ?\n> \n> This is one of those user requests that I don't necessarily agree with, but easy\n> enough to work around :-)\n> \n> Some users have expressed problems with their custom application where they\n> try to emulate timelapse captures by triggering Requests to the period of\n> the timelapse value.  The complaint is that the Request gets completed with one\n> of the Unicam buffers completed well before the Request was issued, which I suppose\n> is reasonable.\n> \n> Of course, there are other work-arounds (recycle requests as soon as possible\n> and only use the output at the timelapse interval), but the grumbling still continues,\n> so this gives an easy way to \"fix\" this.\n\nFixing this in the pipeline handler seems reasonable. I don't think we\nhave a written rule about this anywhere, but would it make sense to\nrequire pipeline handlers to never return frames with an earlier\ntimestamp than the request queue time ?\n\n> > > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> > > ---\n> > >  .../pipeline/raspberrypi/data/default.json    |  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/default.json b/src/libcamera/pipeline/raspberrypi/data/default.json\n> > > index 707414bcc5c5..eda053258c67 100644\n> > > --- a/src/libcamera/pipeline/raspberrypi/data/default.json\n> > > +++ b/src/libcamera/pipeline/raspberrypi/data/default.json\n> > > @@ -18,6 +18,11 @@\n> > >                  \"num_output0_buffers\": 1,\n> > >\n> > >                  # Override any request from the IPA to drop a number of startup frames.\n> > > -                \"disable_startup_frame_drops\": false\n> > > +                \"disable_startup_frame_drops\": false,\n> > > +\n> > > +                # Always process a pending request with the last captured sensor frame.\n> > > +                # Note that this might lead to avoidable frame drops during periods\n> > > +                # 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 ef49d32037af..a369fbd2a528 100644\n> > > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > @@ -317,6 +317,11 @@ public:\n> > >                * frames.\n> > >                */\n> > >               bool disableStartupFrameDrops;\n> > > +             /*\n> > > +              * Always process a pending request with the last captured sensor\n> > > +              * frame.\n> > > +              */\n> > > +             bool returnNewestFrames;\n> > >       };\n> > >\n> > >       Config config_;\n> > > @@ -1457,6 +1462,7 @@ int PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n> > >               .minTotalUnicamBuffers = 4,\n> > >               .numOutput0Buffers = 1,\n> > >               .disableStartupFrameDrops = false,\n> > > +             .returnNewestFrames = false,\n> > >       };\n> > >\n> > >       char const *configFromEnv = utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> > > @@ -1493,6 +1499,8 @@ int PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n> > >               phConfig[\"num_output0_buffers\"].get<unsigned int>(config.numOutput0Buffers);\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> > > @@ -2349,6 +2357,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> > > +                     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 8E29DBDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  5 Dec 2022 13:40:18 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EB3EA63336;\n\tMon,  5 Dec 2022 14:40:17 +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 9811461F22\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  5 Dec 2022 14:40:15 +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 CAB163D7;\n\tMon,  5 Dec 2022 14:40:14 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1670247618;\n\tbh=TjLNzjkB6k6rIamndV8CiNDdNS7zRMwMmie+3sOIul4=;\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=sxf5TWXZn/t+35GGGvGuOEKrrDX/LxSFki2mhgX4lbA16+3NOXRz35LJyesLGQhBr\n\tlECJvssP+YMHZZ5rAhW7vLUDAkFDD65OrEEJN8YuRGiCX8QZFDggv0qQSycjj+3DWM\n\tWe+JuRHAb07lzV7g4gPdNaGIUhPHNBAVnrrtG7je0DDmY80x4Q2O0brvyIv+qeeK1z\n\t3/0Ao/HdKfS49ubwVOi8Su1r2JarVYrql+gLa8kd2BAuyQ4xfWlj+rQmv4Wk49pkvF\n\t6TSJgKpcro+DPYdRRcwmZMq1Uh2ApCSWYCcruqKQcdWl7BACDBjU4CEULuwvpIroAp\n\teqOJDEk3A6l1g==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1670247615;\n\tbh=TjLNzjkB6k6rIamndV8CiNDdNS7zRMwMmie+3sOIul4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=FGZGmPQYCFQfBhYRvuOd24d8Td6aM8+5EGQe5qymvAixD1f8FcnF2Pry+sGdhsGdY\n\tb+PTIwOnXOgM9D8aMVixgTHcGYa3wWbY4mLORaEi5K8y9XqP3+SojX1dgSwaqSv6D7\n\tnPMgu/pQOfu4UBZOFAAAekDT1gtMqA1g9zkL2Nyk="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"FGZGmPQY\"; dkim-atps=neutral","Date":"Mon, 5 Dec 2022 15:40:12 +0200","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<Y430vK8QPgm6HqT2@pendragon.ideasonboard.com>","References":"<20221129134534.2933-1-naush@raspberrypi.com>\n\t<20221129134534.2933-9-naush@raspberrypi.com>\n\t<Y4odoH1Tq8Ao6w6r@pendragon.ideasonboard.com>\n\t<CAEmqJPoi6dznFfyL4UWOvAezz6DopumExdL=GZw=ZPBy3hPGng@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAEmqJPoi6dznFfyL4UWOvAezz6DopumExdL=GZw=ZPBy3hPGng@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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":26006,"web_url":"https://patchwork.libcamera.org/comment/26006/","msgid":"<CAEmqJPphoAYVp6XamrL5DKs2ExkLVReupZ3N9BxEXkb=eA1KFQ@mail.gmail.com>","date":"2022-12-05T15:08:27","subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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\n\nOn Mon, 5 Dec 2022 at 13:40, Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Hi Naush,\n>\n> On Mon, Dec 05, 2022 at 10:58:40AM +0000, Naushir Patuck wrote:\n> > On Fri, 2 Dec 2022 at 15:45, Laurent Pinchart wrote:\n> > > On Tue, Nov 29, 2022 at 01:45:32PM +0000, Naushir Patuck via\n> libcamera-devel wrote:\n> > > > Add a pipeline config parameter \"return_newest_frames\" to always use\n> the\n> > > > most recently captured Unicam frame when processing a request. This\n> effectively\n> > > > stops the pipeline handler from queuing Unicam buffers and\n> processing 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> > > You're explaining the downside, but not why an application may want to\n> > > do this. What are the expected use cases ?\n> >\n> > This is one of those user requests that I don't necessarily agree with,\n> but easy\n> > enough to work around :-)\n> >\n> > Some users have expressed problems with their custom application where\n> they\n> > try to emulate timelapse captures by triggering Requests to the period of\n> > the timelapse value.  The complaint is that the Request gets completed\n> with one\n> > of the Unicam buffers completed well before the Request was issued,\n> which I suppose\n> > is reasonable.\n> >\n> > Of course, there are other work-arounds (recycle requests as soon as\n> possible\n> > and only use the output at the timelapse interval), but the grumbling\n> still continues,\n> > so this gives an easy way to \"fix\" this.\n>\n> Fixing this in the pipeline handler seems reasonable. I don't think we\n> have a written rule about this anywhere, but would it make sense to\n> require pipeline handlers to never return frames with an earlier\n> timestamp than the request queue time ?\n>\n\nAdding the logic for this is easy enough, but I am not sure it should be\nenforced.\nIt might cause unnecessary frame drops because unexpected jitters in the\napplication/userland might delay the Request call ever so slightly.  The\nunicam\n(output) buffer queue smoothes such jitter away.  Maybe this is another\nhint or\nconfig parameter ;-)\n\nRegards,\nNaush\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/default.json    |  7 +++++-\n> > > >  .../pipeline/raspberrypi/raspberrypi.cpp      | 23\n> +++++++++++++++++++\n> > > >  2 files changed, 29 insertions(+), 1 deletion(-)\n> > > >\n> > > > diff --git a/src/libcamera/pipeline/raspberrypi/data/default.json\n> b/src/libcamera/pipeline/raspberrypi/data/default.json\n> > > > index 707414bcc5c5..eda053258c67 100644\n> > > > --- a/src/libcamera/pipeline/raspberrypi/data/default.json\n> > > > +++ b/src/libcamera/pipeline/raspberrypi/data/default.json\n> > > > @@ -18,6 +18,11 @@\n> > > >                  \"num_output0_buffers\": 1,\n> > > >\n> > > >                  # Override any request from the IPA to drop a\n> number of startup frames.\n> > > > -                \"disable_startup_frame_drops\": false\n> > > > +                \"disable_startup_frame_drops\": false,\n> > > > +\n> > > > +                # Always process a pending request with the last\n> captured sensor frame.\n> > > > +                # Note that this might lead to avoidable frame\n> drops during periods\n> > > > +                # 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 ef49d32037af..a369fbd2a528 100644\n> > > > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > > > @@ -317,6 +317,11 @@ public:\n> > > >                * frames.\n> > > >                */\n> > > >               bool disableStartupFrameDrops;\n> > > > +             /*\n> > > > +              * Always process a pending request with the last\n> captured sensor\n> > > > +              * frame.\n> > > > +              */\n> > > > +             bool returnNewestFrames;\n> > > >       };\n> > > >\n> > > >       Config config_;\n> > > > @@ -1457,6 +1462,7 @@ int\n> PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n> > > >               .minTotalUnicamBuffers = 4,\n> > > >               .numOutput0Buffers = 1,\n> > > >               .disableStartupFrameDrops = false,\n> > > > +             .returnNewestFrames = false,\n> > > >       };\n> > > >\n> > > >       char const *configFromEnv =\n> utils::secure_getenv(\"LIBCAMERA_RPI_CONFIG_FILE\");\n> > > > @@ -1493,6 +1499,8 @@ int\n> PipelineHandlerRPi::configurePipelineHandler(RPiCameraData *data)\n> > > >               phConfig[\"num_output0_buffers\"].get<unsigned\n> int>(config.numOutput0Buffers);\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> > > > @@ -2349,6 +2357,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\n> element is\n> > > > +      * left, corresponding to the most recent buffer. Note that\n> this 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> > > > +                     FrameBuffer *bayer =\n> 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\n> the\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\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 8A3F8BE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  5 Dec 2022 15:08:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CAE2061F22;\n\tMon,  5 Dec 2022 16:08:44 +0100 (CET)","from mail-il1-x12f.google.com (mail-il1-x12f.google.com\n\t[IPv6:2607:f8b0:4864:20::12f])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6184661F22\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  5 Dec 2022 16:08:43 +0100 (CET)","by mail-il1-x12f.google.com with SMTP id d14so5192316ilq.11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 05 Dec 2022 07:08:43 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1670252924;\n\tbh=zjzynUZhyOi06LGCPREZx5F4bsvenE1j5TcoEXBz1PM=;\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=ROXqiXq3l7MiHUC8V0PwAMjepR0uGL3dupXQE8Z4m2h+1ZiOOIukp8K2X7kx3Mob+\n\tRfhKQ8ZQsCRZWGEsusnTLDuBOsip6z7qN6V1bt8ksZjD+9vYhioWbuW32bi2yfngey\n\tzxqiqCXzuYLu/Ptz7paJSJ0e1/AL1lyZtsm/ld6uNPnjrHXEBhpH3ectb0iaVNCBvn\n\tnT/aYHfLoJ8zAHZNUoX+cR6tJzO3XuR5+5yFtSmT7YDoF5e29tpZl1sXiCnFEHKvai\n\t0oj0CnDO2H2gN85KR2JhZ22Xj9At3BmMrG8SVn7slhYb6DtglfuWrq26Z0CoLF7rZC\n\tHhrFQTHj0dWfw==","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=4n+14eo6qr0p3edstTQ7cXNKfZfNoTsj4uaUa1F1ew0=;\n\tb=P0PypA8PkNNy44zM3hFljvsGweBig8pc4FGbETGaHztAGguYlhF9vVJnqdnTwO+KuJ\n\tiay5DolTgaZVFbtYNzvwCd2sXlHVUvIwNFHdhLi/ux+GYrpYHl0cKBc0HWbM3G1i9jxZ\n\ts85I99N1HMxB6gRl/WFyahhJhEpf1Gu5tSklpS/Y5QEv+qksj8/0vsdR9AJZMmF2J61o\n\ts4x0GAXYOQrFwL2pbXGk3GIVgPY/Cojcf+gW47hG7qaIvl78ZNp+EfqGajyI5UOdNo96\n\tgRXPBlllbpTpglR3lkdVgBy/mNcqeAk68rSI7HLC2crqLKKk5/stAZeIWAspTEttuLc9\n\tAVaQ=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"P0PypA8P\"; 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=4n+14eo6qr0p3edstTQ7cXNKfZfNoTsj4uaUa1F1ew0=;\n\tb=5Bif6AdfsjOp7ecR73gV8A+LC5lf1S5BoDiMBwXzdLNRsxzOdXaF+ENULi+VTD/7OC\n\tuo6BrSkxeGsbuHaFaS4TiAESgTaVjJuWPjmRGc5KVclLZUNqoHf9YlgFwmIiLvyc3Ymy\n\t+oaKngFQlUKEjLrGQ7lpjVW2/NClH00T1Y3D/YwnSRR6Kiwz6ormjs8++zWLZIsyQdpO\n\tWH13Iyw1fc5NFQf/JsXWs9i4AKKt2dqAddS9xQt0Aou8cnMyonKd3ruYmiGapL12CIR+\n\tm0TpSnlsRY9ZGKDD3Mf5Rgc45bfeCjdJoU4nC/6OZNpz34bRh0ehd//kcvr3CbFIDFj2\n\tzi5g==","X-Gm-Message-State":"ANoB5plm24HjCtoAPu5I5ITOHWZPPfYYSfJLt1QiOPZAAVdiLb2jci4l\n\tMkYX/dY57akWxIxMATJbkrx2j+ItcGqFRSp8ajMm6w==","X-Google-Smtp-Source":"AA0mqf6V/mHG1dxYo0fVU2ccAtR1rzGFahe1d9z/zCcVrVoAV0Um7fAbjAW7Y/A2KwIA3ZmdXzXUx61i2Yn6Dk+xDUo=","X-Received":"by 2002:a92:1912:0:b0:302:5c57:c19d with SMTP id\n\t18-20020a921912000000b003025c57c19dmr29805515ilz.226.1670252921954;\n\tMon, 05 Dec 2022 07:08:41 -0800 (PST)","MIME-Version":"1.0","References":"<20221129134534.2933-1-naush@raspberrypi.com>\n\t<20221129134534.2933-9-naush@raspberrypi.com>\n\t<Y4odoH1Tq8Ao6w6r@pendragon.ideasonboard.com>\n\t<CAEmqJPoi6dznFfyL4UWOvAezz6DopumExdL=GZw=ZPBy3hPGng@mail.gmail.com>\n\t<Y430vK8QPgm6HqT2@pendragon.ideasonboard.com>","In-Reply-To":"<Y430vK8QPgm6HqT2@pendragon.ideasonboard.com>","Date":"Mon, 5 Dec 2022 15:08:27 +0000","Message-ID":"<CAEmqJPphoAYVp6XamrL5DKs2ExkLVReupZ3N9BxEXkb=eA1KFQ@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"000000000000193bd605ef1610a9\"","Subject":"Re: [libcamera-devel] [PATCH v2 08/10] 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>"}}]