[{"id":22134,"web_url":"https://patchwork.libcamera.org/comment/22134/","msgid":"<YgGxK3Hz5pLZ5ahA@pendragon.ideasonboard.com>","date":"2022-02-07T23:54:19","subject":"Re: [libcamera-devel] [PATCH 2/3] pipeline: raspberrypi: Simplify\n\timage/embedded buffer matching logic","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 Mon, Feb 07, 2022 at 03:12:13PM +0000, Naushir Patuck wrote:\n> Simplify the image and embedded buffer matching logic by removing the assumption\n> that we require a buffer match between the two streams. Instead, if an image\n> buffer does not match with an embedded data buffer, simply use the ControlList\n> provided by DelayedControls for the sensor parameters.\n> \n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 141 ++++--------------\n>  1 file changed, 31 insertions(+), 110 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 0755de84c70c..af234bd18c5b 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -2081,122 +2081,43 @@ void RPiCameraData::tryRunPipeline()\n>  \n>  bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&embeddedBuffer)\n>  {\n> -\tunsigned int embeddedRequeueCount = 0, bayerRequeueCount = 0;\n> -\n> -\t/* Loop until we find a matching bayer and embedded data buffer. */\n> -\twhile (!bayerQueue_.empty()) {\n> -\t\t/* Start with the front of the bayer queue. */\n> -\t\tFrameBuffer *bayerBuffer = bayerQueue_.front().buffer;\n> -\n> -\t\t/*\n> -\t\t * Find the embedded data buffer with a matching timestamp to pass to\n> -\t\t * the IPA. Any embedded buffers with a timestamp lower than the\n> -\t\t * current bayer buffer will be removed and re-queued to the driver.\n> -\t\t */\n> -\t\tuint64_t ts = bayerBuffer->metadata().timestamp;\n> -\t\tembeddedBuffer = nullptr;\n> -\t\twhile (!embeddedQueue_.empty()) {\n> -\t\t\tFrameBuffer *b = embeddedQueue_.front();\n> -\t\t\tif (!unicam_[Unicam::Embedded].isExternal() && b->metadata().timestamp < ts) {\n> -\t\t\t\tembeddedQueue_.pop();\n> -\t\t\t\tunicam_[Unicam::Embedded].returnBuffer(b);\n> -\t\t\t\tembeddedRequeueCount++;\n> -\t\t\t\tLOG(RPI, Warning) << \"Dropping unmatched input frame in stream \"\n> -\t\t\t\t\t\t  << unicam_[Unicam::Embedded].name();\n> -\t\t\t} else if (unicam_[Unicam::Embedded].isExternal() || b->metadata().timestamp == ts) {\n> -\t\t\t\t/* We pop the item from the queue lower down. */\n> -\t\t\t\tembeddedBuffer = b;\n> -\t\t\t\tbreak;\n> -\t\t\t} else {\n> -\t\t\t\tbreak; /* Only higher timestamps from here. */\n> -\t\t\t}\n> -\t\t}\n> -\n> -\t\tif (!embeddedBuffer) {\n> -\t\t\tbool flushedBuffers = false;\n> -\n> -\t\t\tLOG(RPI, Debug) << \"Could not find matching embedded buffer\";\n> -\n> -\t\t\tif (!sensorMetadata_) {\n> -\t\t\t\t/*\n> -\t\t\t\t * If there is no sensor metadata, simply return the\n> -\t\t\t\t * first bayer frame in the queue.\n> -\t\t\t\t */\n> -\t\t\t\tLOG(RPI, Debug) << \"Returning bayer frame without a match\";\n> -\t\t\t\tbayerFrame = std::move(bayerQueue_.front());\n> -\t\t\t\tbayerQueue_.pop();\n> -\t\t\t\tembeddedBuffer = nullptr;\n> -\t\t\t\treturn true;\n> -\t\t\t}\n> -\n> -\t\t\tif (!embeddedQueue_.empty()) {\n> -\t\t\t\t/*\n> -\t\t\t\t * Not found a matching embedded buffer for the bayer buffer in\n> -\t\t\t\t * the front of the queue. This buffer is now orphaned, so requeue\n> -\t\t\t\t * it back to the device.\n> -\t\t\t\t */\n> -\t\t\t\tunicam_[Unicam::Image].returnBuffer(bayerQueue_.front().buffer);\n> -\t\t\t\tbayerQueue_.pop();\n> -\t\t\t\tbayerRequeueCount++;\n> -\t\t\t\tLOG(RPI, Warning) << \"Dropping unmatched input frame in stream \"\n> -\t\t\t\t\t\t  << unicam_[Unicam::Image].name();\n> -\t\t\t}\n> -\n> -\t\t\t/*\n> -\t\t\t * If we have requeued all available embedded data buffers in this loop,\n> -\t\t\t * then we are fully out of sync, so might as well requeue all the pending\n> -\t\t\t * bayer buffers.\n> -\t\t\t */\n> -\t\t\tif (embeddedRequeueCount == unicam_[Unicam::Embedded].getBuffers().size()) {\n> -\t\t\t\t/* The embedded queue must be empty at this point! */\n> -\t\t\t\tASSERT(embeddedQueue_.empty());\n> -\n> -\t\t\t\tLOG(RPI, Warning) << \"Flushing bayer stream!\";\n> -\t\t\t\twhile (!bayerQueue_.empty()) {\n> -\t\t\t\t\tunicam_[Unicam::Image].returnBuffer(bayerQueue_.front().buffer);\n> -\t\t\t\t\tbayerQueue_.pop();\n> -\t\t\t\t}\n> -\t\t\t\tflushedBuffers = true;\n> -\t\t\t}\n> +\tif (bayerQueue_.empty())\n> +\t\treturn false;\n>  \n> -\t\t\t/*\n> -\t\t\t * Similar to the above, if we have requeued all available bayer buffers in\n> -\t\t\t * the loop, then we are fully out of sync, so might as well requeue all the\n> -\t\t\t * pending embedded data buffers.\n> -\t\t\t */\n> -\t\t\tif (bayerRequeueCount == unicam_[Unicam::Image].getBuffers().size()) {\n> -\t\t\t\t/* The bayer queue must be empty at this point! */\n> -\t\t\t\tASSERT(bayerQueue_.empty());\n> -\n> -\t\t\t\tLOG(RPI, Warning) << \"Flushing embedded data stream!\";\n> -\t\t\t\twhile (!embeddedQueue_.empty()) {\n> -\t\t\t\t\tunicam_[Unicam::Embedded].returnBuffer(embeddedQueue_.front());\n> -\t\t\t\t\tembeddedQueue_.pop();\n> -\t\t\t\t}\n> -\t\t\t\tflushedBuffers = true;\n> -\t\t\t}\n> +\t/* Start with the front of the bayer queue. */\n> +\tbayerFrame = std::move(bayerQueue_.front());\n> +\tbayerQueue_.pop();\n>  \n> -\t\t\t/*\n> -\t\t\t * If the embedded queue has become empty, we cannot do any more.\n> -\t\t\t * Similarly, if we have flushed any one of our queues, we cannot do\n> -\t\t\t * any more. Return from here without a buffer pair.\n> -\t\t\t */\n> -\t\t\tif (embeddedQueue_.empty() || flushedBuffers)\n> -\t\t\t\treturn false;\n> -\t\t} else {\n> -\t\t\t/*\n> -\t\t\t * We have found a matching bayer and embedded data buffer, so\n> -\t\t\t * nothing more to do apart from assigning the bayer frame and\n> -\t\t\t * popping the buffers from the queue.\n> -\t\t\t */\n> -\t\t\tbayerFrame = std::move(bayerQueue_.front());\n> -\t\t\tbayerQueue_.pop();\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\n> +\t * current bayer buffer will be removed and re-queued to the driver.\n> +\t */\n> +\tuint64_t ts = bayerFrame.buffer->metadata().timestamp;\n> +\tembeddedBuffer = nullptr;\n> +\twhile (!embeddedQueue_.empty()) {\n> +\t\tFrameBuffer *b = embeddedQueue_.front();\n> +\t\tif (b->metadata().timestamp < ts) {\n> +\t\t\tembeddedQueue_.pop();\n> +\t\t\tunicam_[Unicam::Embedded].returnBuffer(b);\n> +\t\t\tLOG(RPI, Debug) << \"Dropping unmatched input frame in stream \"\n> +\t\t\t\t\t<< unicam_[Unicam::Embedded].name();\n> +\t\t} else if (b->metadata().timestamp == ts) {\n\nIt would be very nice if we could switch to using sequence numbers\ninstead of timestamps, comparing timestamps for equality always looks\ndangerous to me (even if I know Unicam handles this fine).\n\nThis looks like a nice simplification,\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\t\t\t/* Found a match! */\n> +\t\t\tembeddedBuffer = b;\n>  \t\t\tembeddedQueue_.pop();\n> -\t\t\treturn true;\n> +\t\t\tbreak;\n> +\t\t} else {\n> +\t\t\tbreak; /* Only higher timestamps from here. */\n>  \t\t}\n>  \t}\n>  \n> -\treturn false;\n> +\tif (!embeddedBuffer && sensorMetadata_) {\n> +\t\t/* Log if there is no matching embedded data buffer found. */\n> +\t\tLOG(RPI, Debug) << \"Returning bayer frame without a matching embedded buffer.\";\n> +\t}\n> +\n> +\treturn true;\n>  }\n>  \n>  REGISTER_PIPELINE_HANDLER(PipelineHandlerRPi)","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 7D4D0BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  7 Feb 2022 23:54:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D89E1609B9;\n\tTue,  8 Feb 2022 00:54:23 +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 63113609B9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  8 Feb 2022 00:54:22 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CC88997;\n\tTue,  8 Feb 2022 00:54:21 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"nRizrasA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1644278062;\n\tbh=ENqEfOsI7Qac9nFrTEjDF/6+FUb55XiSto1fPsiT4aY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=nRizrasAr0OXWyQQoHq7jYLswSf9AW0aWTQsxXK0H+nLvVQpVdaXwejyeIbmEt9hu\n\ta1jJFypvnvV4m+wt6j2IQzsQMzYSt7tpoBYE8911/d6i2wpN9lUUesb9TIJHgTMg9M\n\t+/jqGJlNSwQ/7gqAEBgAom+3HgSOK1x2INei/S4E=","Date":"Tue, 8 Feb 2022 01:54:19 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<YgGxK3Hz5pLZ5ahA@pendragon.ideasonboard.com>","References":"<20220207151214.887140-1-naush@raspberrypi.com>\n\t<20220207151214.887140-2-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220207151214.887140-2-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH 2/3] pipeline: raspberrypi: Simplify\n\timage/embedded buffer matching logic","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>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":22139,"web_url":"https://patchwork.libcamera.org/comment/22139/","msgid":"<CAEmqJPqzkQU_Bt7UOm2iQ9kD2E6USvB0eTwUJnhY7RrMvM8pvQ@mail.gmail.com>","date":"2022-02-08T08:26:17","subject":"Re: [libcamera-devel] [PATCH 2/3] pipeline: raspberrypi: Simplify\n\timage/embedded buffer matching logic","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Laurent,\n\nOn Mon, 7 Feb 2022 at 23:54, Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Hi Naush,\n>\n> Thank you for the patch.\n>\n> On Mon, Feb 07, 2022 at 03:12:13PM +0000, Naushir Patuck wrote:\n> > Simplify the image and embedded buffer matching logic by removing the\n> assumption\n> > that we require a buffer match between the two streams. Instead, if an\n> image\n> > buffer does not match with an embedded data buffer, simply use the\n> ControlList\n> > provided by DelayedControls for the sensor parameters.\n> >\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > ---\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 141 ++++--------------\n> >  1 file changed, 31 insertions(+), 110 deletions(-)\n> >\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index 0755de84c70c..af234bd18c5b 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -2081,122 +2081,43 @@ void RPiCameraData::tryRunPipeline()\n> >\n> >  bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame,\n> FrameBuffer *&embeddedBuffer)\n> >  {\n> > -     unsigned int embeddedRequeueCount = 0, bayerRequeueCount = 0;\n> > -\n> > -     /* Loop until we find a matching bayer and embedded data buffer. */\n> > -     while (!bayerQueue_.empty()) {\n> > -             /* Start with the front of the bayer queue. */\n> > -             FrameBuffer *bayerBuffer = bayerQueue_.front().buffer;\n> > -\n> > -             /*\n> > -              * Find the embedded data buffer with a matching timestamp\n> to pass to\n> > -              * the IPA. Any embedded buffers with a timestamp lower\n> than the\n> > -              * current bayer buffer will be removed and re-queued to\n> the driver.\n> > -              */\n> > -             uint64_t ts = bayerBuffer->metadata().timestamp;\n> > -             embeddedBuffer = nullptr;\n> > -             while (!embeddedQueue_.empty()) {\n> > -                     FrameBuffer *b = embeddedQueue_.front();\n> > -                     if (!unicam_[Unicam::Embedded].isExternal() &&\n> b->metadata().timestamp < ts) {\n> > -                             embeddedQueue_.pop();\n> > -                             unicam_[Unicam::Embedded].returnBuffer(b);\n> > -                             embeddedRequeueCount++;\n> > -                             LOG(RPI, Warning) << \"Dropping unmatched\n> input frame in stream \"\n> > -                                               <<\n> unicam_[Unicam::Embedded].name();\n> > -                     } else if (unicam_[Unicam::Embedded].isExternal()\n> || b->metadata().timestamp == ts) {\n> > -                             /* We pop the item from the queue lower\n> down. */\n> > -                             embeddedBuffer = b;\n> > -                             break;\n> > -                     } else {\n> > -                             break; /* Only higher timestamps from\n> here. */\n> > -                     }\n> > -             }\n> > -\n> > -             if (!embeddedBuffer) {\n> > -                     bool flushedBuffers = false;\n> > -\n> > -                     LOG(RPI, Debug) << \"Could not find matching\n> embedded buffer\";\n> > -\n> > -                     if (!sensorMetadata_) {\n> > -                             /*\n> > -                              * If there is no sensor metadata, simply\n> return the\n> > -                              * first bayer frame in the queue.\n> > -                              */\n> > -                             LOG(RPI, Debug) << \"Returning bayer frame\n> without a match\";\n> > -                             bayerFrame =\n> std::move(bayerQueue_.front());\n> > -                             bayerQueue_.pop();\n> > -                             embeddedBuffer = nullptr;\n> > -                             return true;\n> > -                     }\n> > -\n> > -                     if (!embeddedQueue_.empty()) {\n> > -                             /*\n> > -                              * Not found a matching embedded buffer\n> for the bayer buffer in\n> > -                              * the front of the queue. This buffer is\n> now orphaned, so requeue\n> > -                              * it back to the device.\n> > -                              */\n> > -\n>  unicam_[Unicam::Image].returnBuffer(bayerQueue_.front().buffer);\n> > -                             bayerQueue_.pop();\n> > -                             bayerRequeueCount++;\n> > -                             LOG(RPI, Warning) << \"Dropping unmatched\n> input frame in stream \"\n> > -                                               <<\n> unicam_[Unicam::Image].name();\n> > -                     }\n> > -\n> > -                     /*\n> > -                      * If we have requeued all available embedded data\n> buffers in this loop,\n> > -                      * then we are fully out of sync, so might as well\n> requeue all the pending\n> > -                      * bayer buffers.\n> > -                      */\n> > -                     if (embeddedRequeueCount ==\n> unicam_[Unicam::Embedded].getBuffers().size()) {\n> > -                             /* The embedded queue must be empty at\n> this point! */\n> > -                             ASSERT(embeddedQueue_.empty());\n> > -\n> > -                             LOG(RPI, Warning) << \"Flushing bayer\n> stream!\";\n> > -                             while (!bayerQueue_.empty()) {\n> > -\n>  unicam_[Unicam::Image].returnBuffer(bayerQueue_.front().buffer);\n> > -                                     bayerQueue_.pop();\n> > -                             }\n> > -                             flushedBuffers = true;\n> > -                     }\n> > +     if (bayerQueue_.empty())\n> > +             return false;\n> >\n> > -                     /*\n> > -                      * Similar to the above, if we have requeued all\n> available bayer buffers in\n> > -                      * the loop, then we are fully out of sync, so\n> might as well requeue all the\n> > -                      * pending embedded data buffers.\n> > -                      */\n> > -                     if (bayerRequeueCount ==\n> unicam_[Unicam::Image].getBuffers().size()) {\n> > -                             /* The bayer queue must be empty at this\n> point! */\n> > -                             ASSERT(bayerQueue_.empty());\n> > -\n> > -                             LOG(RPI, Warning) << \"Flushing embedded\n> data stream!\";\n> > -                             while (!embeddedQueue_.empty()) {\n> > -\n>  unicam_[Unicam::Embedded].returnBuffer(embeddedQueue_.front());\n> > -                                     embeddedQueue_.pop();\n> > -                             }\n> > -                             flushedBuffers = true;\n> > -                     }\n> > +     /* Start with the front of the bayer queue. */\n> > +     bayerFrame = std::move(bayerQueue_.front());\n> > +     bayerQueue_.pop();\n> >\n> > -                     /*\n> > -                      * If the embedded queue has become empty, we\n> cannot do any more.\n> > -                      * Similarly, if we have flushed any one of our\n> queues, we cannot do\n> > -                      * any more. Return from here without a buffer\n> pair.\n> > -                      */\n> > -                     if (embeddedQueue_.empty() || flushedBuffers)\n> > -                             return false;\n> > -             } else {\n> > -                     /*\n> > -                      * We have found a matching bayer and embedded\n> data buffer, so\n> > -                      * nothing more to do apart from assigning the\n> bayer frame and\n> > -                      * popping the buffers from the queue.\n> > -                      */\n> > -                     bayerFrame = std::move(bayerQueue_.front());\n> > -                     bayerQueue_.pop();\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> > +      * current bayer buffer will be removed and re-queued to the\n> driver.\n> > +      */\n> > +     uint64_t ts = bayerFrame.buffer->metadata().timestamp;\n> > +     embeddedBuffer = nullptr;\n> > +     while (!embeddedQueue_.empty()) {\n> > +             FrameBuffer *b = embeddedQueue_.front();\n> > +             if (b->metadata().timestamp < ts) {\n> > +                     embeddedQueue_.pop();\n> > +                     unicam_[Unicam::Embedded].returnBuffer(b);\n> > +                     LOG(RPI, Debug) << \"Dropping unmatched input frame\n> in stream \"\n> > +                                     <<\n> unicam_[Unicam::Embedded].name();\n> > +             } else if (b->metadata().timestamp == ts) {\n>\n> It would be very nice if we could switch to using sequence numbers\n> instead of timestamps, comparing timestamps for equality always looks\n> dangerous to me (even if I know Unicam handles this fine).\n>\n\nI see no reason why we cannot switch to sequence numbers here.  I'll\ntest it out when I get a chance, and provide a patch on top of this one\nto make the change when I can.\n\nRegards,\nNaush\n\n\n>\n> This looks like a nice simplification,\n>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>\n> > +                     /* Found a match! */\n> > +                     embeddedBuffer = b;\n> >                       embeddedQueue_.pop();\n> > -                     return true;\n> > +                     break;\n> > +             } else {\n> > +                     break; /* Only higher timestamps from here. */\n> >               }\n> >       }\n> >\n> > -     return false;\n> > +     if (!embeddedBuffer && sensorMetadata_) {\n> > +             /* Log if there is no matching embedded data buffer found.\n> */\n> > +             LOG(RPI, Debug) << \"Returning bayer frame without a\n> matching embedded buffer.\";\n> > +     }\n> > +\n> > +     return true;\n> >  }\n> >\n> >  REGISTER_PIPELINE_HANDLER(PipelineHandlerRPi)\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 14EB0BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  8 Feb 2022 08:26:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C9877610C3;\n\tTue,  8 Feb 2022 09:26:35 +0100 (CET)","from mail-lf1-x12c.google.com (mail-lf1-x12c.google.com\n\t[IPv6:2a00:1450:4864:20::12c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 47174610AE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  8 Feb 2022 09:26:34 +0100 (CET)","by mail-lf1-x12c.google.com with SMTP id f18so2683958lfj.12\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 08 Feb 2022 00:26:34 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"oK9IR9r4\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=aR3k3LxouZLlKAF2eaiu0vFaUxpYQic/ONtnDuJQNAg=;\n\tb=oK9IR9r47zyAf1PH1e1Ru97gsINMcZVifIAVOhImJ3oEefKmB+t7qUlTB80bti55+T\n\t1Ggt8EFNctFdPph7WD0WCzuO2uZbylDgZmJsjhYzFwKoTfpiqYd0Hk3IdvrTjLcGOiuT\n\tcADmStKn4mPW+2v4B5Gxia2QFA/H0cpeGnUDuEPSZ+m4IuByUXkgZRg1wRzUTEjdJfXU\n\tOAHVRGurLZC9xlOT22LCXbb70cBdg6uSqz3yj1HuZFx5G0eykMcxWcPqDjFYK2L8MjeF\n\teW9W6n7ziQ7W3E431M0Jp09HwFPJwzsdqGh3jv0FySscd/ZTFTcrStu/CQ/+Q7oWDwFg\n\tLNIw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=aR3k3LxouZLlKAF2eaiu0vFaUxpYQic/ONtnDuJQNAg=;\n\tb=g0poDTU12YPFUKVbXT+SsRhVgalaCgKKkojVmQ1+j2rc+mhJUyt5megr7T8z7XmN7i\n\t0raZ1FXE5LFckfeU9cgPYYIFiMAud9OWQkhAthf17JmYpwwC/3yBQesVe5QPNRRvZP2X\n\t4PZm6nMp9bRR+UvPTNFD+3jMl21uiQsLfyGlJA2fw3cLz6SGy5GjvLP+tT9RU88cL0kK\n\tqf4dFWFwEJgshoudsB9QFjGkmV/OV2N3Zq3RKaIfXvlENPtMQQNOh4kGlQtXwqlC2J5e\n\tfL8rT0JZXgXSCd/tqr/SpUWbUaZG1+HJGtW+IXCvTTTRFKQBRcCSRAzLisXb6UPRLEti\n\t+0wA==","X-Gm-Message-State":"AOAM532+6kAKNhGJ3o/eIoB0YIr1NlOOQeRHZ2UNpZ7EcJg1QNVTCtQd\n\ti6MoRxokGgGDovNI5FIsJdRIPha3xc9ioBHnL98v0VNWRbE=","X-Google-Smtp-Source":"ABdhPJz6JRQJdWyKN4C34bTWWT0U2CY+ub19lBlWneayZIYQPa2OQl38Jyqp3/ofUMrHhQJ2eSB9I5W8rBMkvF7OWj8=","X-Received":"by 2002:a05:6512:15a7:: with SMTP id\n\tbp39mr2280304lfb.687.1644308793663; \n\tTue, 08 Feb 2022 00:26:33 -0800 (PST)","MIME-Version":"1.0","References":"<20220207151214.887140-1-naush@raspberrypi.com>\n\t<20220207151214.887140-2-naush@raspberrypi.com>\n\t<YgGxK3Hz5pLZ5ahA@pendragon.ideasonboard.com>","In-Reply-To":"<YgGxK3Hz5pLZ5ahA@pendragon.ideasonboard.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Tue, 8 Feb 2022 08:26:17 +0000","Message-ID":"<CAEmqJPqzkQU_Bt7UOm2iQ9kD2E6USvB0eTwUJnhY7RrMvM8pvQ@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"0000000000008c36d005d77d7985\"","Subject":"Re: [libcamera-devel] [PATCH 2/3] pipeline: raspberrypi: Simplify\n\timage/embedded buffer matching logic","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]