[{"id":15650,"web_url":"https://patchwork.libcamera.org/comment/15650/","msgid":"<20210313094027.7snjae2533yzjwiq@uno.localdomain>","date":"2021-03-13T09:40:27","subject":"Re: [libcamera-devel] [PATCH v2 7/8] libcamera: pipeline: ipu3:\n\tEnsure no requests are pending at stop()","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Kieran\n\nOn Fri, Mar 12, 2021 at 05:47:26AM +0000, Kieran Bingham wrote:\n> The Pipeline handlers are responsible for making sure that all work\n> is completed during the stop call, and all requests and resources\n> should be released back to the application.\n>\n> Add an assertion to guarantee that there are no pending requests\n> before returning from ::stop()\n>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>\n> ---\n> RFC? Ideally this should be handled by the base pipeline handler so that\n> the same guarantee applies to all pipeline handlers. But we don't\n> currently call into the base class during stop.\n\nI wonder if this plays a role with my comment on making requests\ncompleted when the Camera is moved to Configured triggering a Fatal.\n\nMore generally, how can we guarantee the queue of requests have been\nemptied when stop() is called ? I don't think it's that unlikely that\nthe requests queue is !empty when applications call stop(), isn't it ?\n>\n>  src/libcamera/pipeline/ipu3/ipu3.cpp | 8 ++++++++\n>  1 file changed, 8 insertions(+)\n>\n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 7ab3a5bfdccb..c5facaea16dd 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -771,6 +771,14 @@ void PipelineHandlerIPU3::stop(Camera *camera)\n>  \tif (ret)\n>  \t\tLOG(IPU3, Warning) << \"Failed to stop camera \" << camera->id();\n>\n> +\t/*\n> +\t * All requests must have completed before releaseing buffers.\n> +\t * \\todo: Ensure all pipeline handlers guarantee queuedRequests is emtpy\n> +\t * at the end of stop().\n> +\t */\n> +\tif (!data->queuedRequests_.empty())\n> +\t\tLOG(IPU3, Fatal) << \"There are still requests to complete.\";\n> +\n>  \tfreeBuffers(camera);\n>  }\n>\n> --\n> 2.25.1\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 BD1F8BD80C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 13 Mar 2021 09:40:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3740568C67;\n\tSat, 13 Mar 2021 10:40:00 +0100 (CET)","from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net\n\t[217.70.183.193])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9265A602E3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 13 Mar 2021 10:39:59 +0100 (CET)","from uno.localdomain (host-79-22-58-175.retail.telecomitalia.it\n\t[79.22.58.175]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay1-d.mail.gandi.net (Postfix) with ESMTPSA id C49CB240003;\n\tSat, 13 Mar 2021 09:39:58 +0000 (UTC)"],"X-Originating-IP":"79.22.58.175","Date":"Sat, 13 Mar 2021 10:40:27 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20210313094027.7snjae2533yzjwiq@uno.localdomain>","References":"<20210312054727.852622-1-kieran.bingham@ideasonboard.com>\n\t<20210312054727.852622-8-kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20210312054727.852622-8-kieran.bingham@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 7/8] libcamera: pipeline: ipu3:\n\tEnsure no requests are pending at stop()","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>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":15662,"web_url":"https://patchwork.libcamera.org/comment/15662/","msgid":"<YE1GNBg024UvevA/@pendragon.ideasonboard.com>","date":"2021-03-13T23:09:40","subject":"Re: [libcamera-devel] [PATCH v2 7/8] libcamera: pipeline: ipu3:\n\tEnsure no requests are pending at stop()","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran and Jacopo,\n\nThank you for the patch, and for the review :-)\n\nOn Sat, Mar 13, 2021 at 10:40:27AM +0100, Jacopo Mondi wrote:\n> On Fri, Mar 12, 2021 at 05:47:26AM +0000, Kieran Bingham wrote:\n> > The Pipeline handlers are responsible for making sure that all work\n\ns/Pipeline/pipeline/ ?\n\n> > is completed during the stop call, and all requests and resources\n> > should be released back to the application.\n> >\n> > Add an assertion to guarantee that there are no pending requests\n> > before returning from ::stop()\n> >\n> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> >\n> > ---\n> > RFC? Ideally this should be handled by the base pipeline handler so that\n> > the same guarantee applies to all pipeline handlers. But we don't\n> > currently call into the base class during stop.\n> \n> I wonder if this plays a role with my comment on making requests\n> completed when the Camera is moved to Configured triggering a Fatal.\n> \n> More generally, how can we guarantee the queue of requests have been\n> emptied when stop() is called ? I don't think it's that unlikely that\n> the requests queue is !empty when applications call stop(), isn't it ?\n\nThe pipeline handler is responsible for cancelling all pending requests\nin its stop() implementation:\n\n/**\n * \\fn PipelineHandler::stop()\n * \\brief Stop capturing from all running streams\n * \\param[in] camera The camera to stop\n *\n * This method stops capturing and processing requests immediately. All pending\n * requests are cancelled and complete immediately in an error state.\n *\n * \\context This function is called from the CameraManager thread.\n */\n\n> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 8 ++++++++\n> >  1 file changed, 8 insertions(+)\n> >\n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 7ab3a5bfdccb..c5facaea16dd 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -771,6 +771,14 @@ void PipelineHandlerIPU3::stop(Camera *camera)\n> >  \tif (ret)\n> >  \t\tLOG(IPU3, Warning) << \"Failed to stop camera \" << camera->id();\n> >\n> > +\t/*\n> > +\t * All requests must have completed before releaseing buffers.\n> > +\t * \\todo: Ensure all pipeline handlers guarantee queuedRequests is emtpy\n> > +\t * at the end of stop().\n> > +\t */\n> > +\tif (!data->queuedRequests_.empty())\n> > +\t\tLOG(IPU3, Fatal) << \"There are still requests to complete.\";\n> > +\n\nIs this something we could check in the PipelineHandler or Camera class\ninstead ? The former would be a bit more difficult, as the\nPipelineHandler base class isn't involved in processing the stop()\nfunction, and I'm not very keen on splitting stop() between stop() and\nstopDevice() like we did for queueRequest(). The latter would involve\neither keeping track of queued requests in the Camera class, or, perhaps\nbetter to avoid the duplication, adding a function to the\nPipelineHandler base class to check if the queue is empty and calling it\nat the end of Camera::stop(). Regardless of which option you pick,\nplease make sure to consider race conditions between the application\nthread in which Camera::stop() runs and the pipeline handler thread.\n\n> >  \tfreeBuffers(camera);\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 4EF94BD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 13 Mar 2021 23:10:18 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C5B2660850;\n\tSun, 14 Mar 2021 00:10:17 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B106B6084D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Mar 2021 00:10:16 +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 0D2B555C;\n\tSun, 14 Mar 2021 00:10:15 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"NG/z+0uZ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1615677016;\n\tbh=yziZm7UaL2XYHsfWA1GxIvbk5F9UXcX9RQVKa/63hss=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=NG/z+0uZfQzS2wScSRoYHWDTyq+DyxIcolS7RlyEG+NeaKh+4tcs7D8FlKKytVKv4\n\tNym8nzN72igabhY2db122RSK0j15dNg3iTMY6NHjPxXfNlKmqgJwTWpv843R3Qy2+c\n\tTWAcaKnr2nz8itEgAGz0cL9BVNwbA0tltJ7fP0nw=","Date":"Sun, 14 Mar 2021 01:09:40 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<YE1GNBg024UvevA/@pendragon.ideasonboard.com>","References":"<20210312054727.852622-1-kieran.bingham@ideasonboard.com>\n\t<20210312054727.852622-8-kieran.bingham@ideasonboard.com>\n\t<20210313094027.7snjae2533yzjwiq@uno.localdomain>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20210313094027.7snjae2533yzjwiq@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v2 7/8] libcamera: pipeline: ipu3:\n\tEnsure no requests are pending at stop()","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>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":15861,"web_url":"https://patchwork.libcamera.org/comment/15861/","msgid":"<55891c59-e389-2bd1-60fb-08d638d8cb80@ideasonboard.com>","date":"2021-03-24T11:16:50","subject":"Re: [libcamera-devel] [PATCH v2 7/8] libcamera: pipeline: ipu3:\n\tEnsure no requests are pending at stop()","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 13/03/2021 23:09, Laurent Pinchart wrote:\n> Hi Kieran and Jacopo,\n> \n> Thank you for the patch, and for the review :-)\n> \n> On Sat, Mar 13, 2021 at 10:40:27AM +0100, Jacopo Mondi wrote:\n>> On Fri, Mar 12, 2021 at 05:47:26AM +0000, Kieran Bingham wrote:\n>>> The Pipeline handlers are responsible for making sure that all work\n> \n> s/Pipeline/pipeline/ ?\n> \n\nChanged.\n\n>>> is completed during the stop call, and all requests and resources\n>>> should be released back to the application.\n>>>\n>>> Add an assertion to guarantee that there are no pending requests\n>>> before returning from ::stop()\n>>>\n>>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>>>\n>>> ---\n>>> RFC? Ideally this should be handled by the base pipeline handler so that\n>>> the same guarantee applies to all pipeline handlers. But we don't\n>>> currently call into the base class during stop.\n>>\n>> I wonder if this plays a role with my comment on making requests\n>> completed when the Camera is moved to Configured triggering a Fatal.\n>>\n>> More generally, how can we guarantee the queue of requests have been\n>> emptied when stop() is called ? I don't think it's that unlikely that\n>> the requests queue is !empty when applications call stop(), isn't it ?\n> \n> The pipeline handler is responsible for cancelling all pending requests\n> in its stop() implementation:\n> \n> /**\n>  * \\fn PipelineHandler::stop()\n>  * \\brief Stop capturing from all running streams\n>  * \\param[in] camera The camera to stop\n>  *\n>  * This method stops capturing and processing requests immediately. All pending\n>  * requests are cancelled and complete immediately in an error state.\n>  *\n>  * \\context This function is called from the CameraManager thread.\n>  */\n> \n>>>  src/libcamera/pipeline/ipu3/ipu3.cpp | 8 ++++++++\n>>>  1 file changed, 8 insertions(+)\n>>>\n>>> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>>> index 7ab3a5bfdccb..c5facaea16dd 100644\n>>> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n>>> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n>>> @@ -771,6 +771,14 @@ void PipelineHandlerIPU3::stop(Camera *camera)\n>>>  \tif (ret)\n>>>  \t\tLOG(IPU3, Warning) << \"Failed to stop camera \" << camera->id();\n>>>\n>>> +\t/*\n>>> +\t * All requests must have completed before releaseing buffers.\n>>> +\t * \\todo: Ensure all pipeline handlers guarantee queuedRequests is emtpy\n>>> +\t * at the end of stop().\n>>> +\t */\n>>> +\tif (!data->queuedRequests_.empty())\n>>> +\t\tLOG(IPU3, Fatal) << \"There are still requests to complete.\";\n>>> +\n> \n> Is this something we could check in the PipelineHandler or Camera class\n> instead ? The former would be a bit more difficult, as the\n> PipelineHandler base class isn't involved in processing the stop()\n> function, and I'm not very keen on splitting stop() between stop() and\n> stopDevice() like we did for queueRequest(). The latter would involve\n\nYes, that's why I've left it as a todo for now. I really don't like the\nidea of splitting to the base class just yet.\n\n> either keeping track of queued requests in the Camera class, or, perhaps\n> better to avoid the duplication, adding a function to the\n> PipelineHandler base class to check if the queue is empty and calling it\n> at the end of Camera::stop(). Regardless of which option you pick,\n> please make sure to consider race conditions between the application\n> thread in which Camera::stop() runs and the pipeline handler thread.\n\nIt may be that we need to extend the Camera state to incorporate a\nstopping state as well to ensure any requests that come in while we're\ncalling stop get rejected, (while still allowing active ones to\ncomplete, or be cancelled) during the Camera::requestComplete() call.\n\nI've now created a patch to add this state, which will be included as\npart of the improvements series on top of this.\n\nWith that it may be safer to allow an accessor to validate that the\ndata->queuedRequests_ is empty from the Camera class.\n\nWhich is also now done, and will be included in the improvements series.\n\nAnd that would then make this patch redundant, and possible to drop.\n\n<dropped>\n\n\n>>>  \tfreeBuffers(camera);\n>>>  }\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 2E054C32E5\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 24 Mar 2021 11:16:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7D4B568D61;\n\tWed, 24 Mar 2021 12:16:55 +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 F3612602E3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 24 Mar 2021 12:16:53 +0100 (CET)","from [192.168.0.20]\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 34FB08F3;\n\tWed, 24 Mar 2021 12:16:53 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"EWwHM1Rx\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1616584613;\n\tbh=ntmtDhN7RKqCL7oj5KK12bemUOOK6PDtIgZtqfKKXL0=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=EWwHM1Rxs6suOkgq02bTz/dY0cYMBDSWYXxAt9U/4cNn/eIRX/jlOonJdqr3xT0oQ\n\tnXcfmHjCEHHV0+DzkaI/yY15etwnprwl7tgB8QHq10pIiYwhaueSoBlvRIZUNyzGTY\n\tEUioNNnNLR5JDsXZIa1uPMs6GKv0ms0NhaxvNlbo=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tJacopo Mondi <jacopo@jmondi.org>","References":"<20210312054727.852622-1-kieran.bingham@ideasonboard.com>\n\t<20210312054727.852622-8-kieran.bingham@ideasonboard.com>\n\t<20210313094027.7snjae2533yzjwiq@uno.localdomain>\n\t<YE1GNBg024UvevA/@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<55891c59-e389-2bd1-60fb-08d638d8cb80@ideasonboard.com>","Date":"Wed, 24 Mar 2021 11:16:50 +0000","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<YE1GNBg024UvevA/@pendragon.ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH v2 7/8] libcamera: pipeline: ipu3:\n\tEnsure no requests are pending at stop()","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>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]