[{"id":32436,"web_url":"https://patchwork.libcamera.org/comment/32436/","msgid":"<t2jbemgoqzquywy2qc5tzgb5jkg3aipbuhxjj2v35b6sfsi44b@y2myhdkobgo4>","date":"2024-11-28T14:56:20","subject":"Re: [PATCH v2 5/9] android: Add CameraDevice::sendCaptureResult()","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Harvey\n\nOn Wed, Nov 27, 2024 at 09:25:55AM +0000, Harvey Yang wrote:\n> The new function is separated from sendCaptureResults(), which allows\n> other functions to send a result out of order, like aborting. It'll be\n> updated in the upcoming patch, when the usage of error result is\n> separated.\n>\n> This function also allows the upcoming partial results to be sent back\n> to the application without waiting for the requests.\n>\n> Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n> Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>\n> Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> ---\n>  src/android/camera_device.cpp | 57 ++++++++++++++++++-----------------\n>  src/android/camera_device.h   |  1 +\n>  2 files changed, 31 insertions(+), 27 deletions(-)\n>\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 62f724041..0377cf215 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -1324,42 +1324,45 @@ void CameraDevice::sendCaptureResults()\n>  \t\tauto descriptor = std::move(descriptors_.front());\n>  \t\tdescriptors_.pop();\n>\n> -\t\tcamera3_capture_result_t captureResult = {};\n> +\t\tsendCaptureResult(descriptor.get());\n> +\t}\n> +}\n>\n> -\t\tcaptureResult.frame_number = descriptor->frameNumber_;\n> +void CameraDevice::sendCaptureResult(Camera3RequestDescriptor *request) const\n\nI would have named the paramter 'descriptor' but apart from that the\npatch doesn't seems to introduce functional changes.\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks\n  j\n\n> +{\n> +\tstd::vector<camera3_stream_buffer_t> resultBuffers;\n> +\tresultBuffers.reserve(request->buffers_.size());\n>\n> -\t\tif (descriptor->resultMetadata_)\n> -\t\t\tcaptureResult.result =\n> -\t\t\t\tdescriptor->resultMetadata_->getMetadata();\n> +\tfor (auto &buffer : request->buffers_) {\n> +\t\tcamera3_buffer_status status = CAMERA3_BUFFER_STATUS_ERROR;\n>\n> -\t\tstd::vector<camera3_stream_buffer_t> resultBuffers;\n> -\t\tresultBuffers.reserve(descriptor->buffers_.size());\n> +\t\tif (buffer.status == StreamBuffer::Status::Success)\n> +\t\t\tstatus = CAMERA3_BUFFER_STATUS_OK;\n>\n> -\t\tfor (auto &buffer : descriptor->buffers_) {\n> -\t\t\tcamera3_buffer_status status = CAMERA3_BUFFER_STATUS_ERROR;\n> +\t\t/*\n> +\t\t * Pass the buffer fence back to the camera framework as\n> +\t\t * a release fence. This instructs the framework to wait\n> +\t\t * on the acquire fence in case we haven't done so\n> +\t\t * ourselves for any reason.\n> +\t\t */\n> +\t\tresultBuffers.push_back({ buffer.stream->camera3Stream(),\n> +\t\t\t\t\t  buffer.camera3Buffer, status,\n> +\t\t\t\t\t  -1, buffer.fence.release() });\n> +\t}\n>\n> -\t\t\tif (buffer.status == StreamBuffer::Status::Success)\n> -\t\t\t\tstatus = CAMERA3_BUFFER_STATUS_OK;\n> +\tcamera3_capture_result_t captureResult = {};\n>\n> -\t\t\t/*\n> -\t\t\t * Pass the buffer fence back to the camera framework as\n> -\t\t\t * a release fence. This instructs the framework to wait\n> -\t\t\t * on the acquire fence in case we haven't done so\n> -\t\t\t * ourselves for any reason.\n> -\t\t\t */\n> -\t\t\tresultBuffers.push_back({ buffer.stream->camera3Stream(),\n> -\t\t\t\t\t\t  buffer.camera3Buffer, status,\n> -\t\t\t\t\t\t  -1, buffer.fence.release() });\n> -\t\t}\n> +\tcaptureResult.frame_number = request->frameNumber_;\n> +\tcaptureResult.num_output_buffers = resultBuffers.size();\n> +\tcaptureResult.output_buffers = resultBuffers.data();\n>\n> -\t\tcaptureResult.num_output_buffers = resultBuffers.size();\n> -\t\tcaptureResult.output_buffers = resultBuffers.data();\n> +\tif (request->status_ == Camera3RequestDescriptor::Status::Success)\n> +\t\tcaptureResult.partial_result = 1;\n>\n> -\t\tif (descriptor->status_ == Camera3RequestDescriptor::Status::Success)\n> -\t\t\tcaptureResult.partial_result = 1;\n> +\tif (request->resultMetadata_)\n> +\t\tcaptureResult.result = request->resultMetadata_->getMetadata();\n>\n> -\t\tcallbacks_->process_capture_result(callbacks_, &captureResult);\n> -\t}\n> +\tcallbacks_->process_capture_result(callbacks_, &captureResult);\n>  }\n>\n>  void CameraDevice::setBufferStatus(StreamBuffer &streamBuffer,\n> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> index c92ee1aa4..699aa8f17 100644\n> --- a/src/android/camera_device.h\n> +++ b/src/android/camera_device.h\n> @@ -97,6 +97,7 @@ private:\n>  \tvoid completeDescriptor(Camera3RequestDescriptor *descriptor)\n>  \t\tLIBCAMERA_TSA_EXCLUDES(descriptorsMutex_);\n>  \tvoid sendCaptureResults() LIBCAMERA_TSA_REQUIRES(descriptorsMutex_);\n> +\tvoid sendCaptureResult(Camera3RequestDescriptor *request) const;\n>  \tvoid setBufferStatus(StreamBuffer &buffer,\n>  \t\t\t     StreamBuffer::Status status);\n>  \tstd::unique_ptr<CameraMetadata> getResultMetadata(\n> --\n> 2.47.0.338.g60cca15819-goog\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 2DE2CBD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 28 Nov 2024 14:56:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4F80765FB2;\n\tThu, 28 Nov 2024 15:56:26 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C14BE65898\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 28 Nov 2024 15:56:23 +0100 (CET)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C587B59D;\n\tThu, 28 Nov 2024 15:55:59 +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=\"fejBn0qJ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1732805759;\n\tbh=2tC3GdkqxGrz90eP6ixtbODHxwA7mKsNAt4t/c5M9IY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=fejBn0qJphchMxmy24xukpu7/2P2CxcKA04WgpivLJ/h7vTGO3D4CexVBwExhBPVZ\n\tFyIh/7DUFwkOHge90rmbDInwAlNcMdGJ5k5beFwBXPx1lmZN5KYNs+B90BY+qxVtvt\n\tgWAnXcQvg8hw0MXHJ9qaIwTbsDECEWlC/3V1Tfgk=","Date":"Thu, 28 Nov 2024 15:56:20 +0100","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Harvey Yang <chenghaoyang@chromium.org>","Cc":"libcamera-devel@lists.libcamera.org, \n\tHan-Lin Chen <hanlinchen@chromium.org>","Subject":"Re: [PATCH v2 5/9] android: Add CameraDevice::sendCaptureResult()","Message-ID":"<t2jbemgoqzquywy2qc5tzgb5jkg3aipbuhxjj2v35b6sfsi44b@y2myhdkobgo4>","References":"<20241127092632.3145984-1-chenghaoyang@chromium.org>\n\t<20241127092632.3145984-6-chenghaoyang@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20241127092632.3145984-6-chenghaoyang@chromium.org>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":32455,"web_url":"https://patchwork.libcamera.org/comment/32455/","msgid":"<CAEB1aht7V74Ea_E=Z8bQcAko3zgU2LjDA4bfWBO93bO+S3dw1w@mail.gmail.com>","date":"2024-11-29T08:50:47","subject":"Re: [PATCH v2 5/9] android: Add CameraDevice::sendCaptureResult()","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Hi Jacopo,\n\nOn Thu, Nov 28, 2024 at 10:56 PM Jacopo Mondi\n<jacopo.mondi@ideasonboard.com> wrote:\n>\n> Hi Harvey\n>\n> On Wed, Nov 27, 2024 at 09:25:55AM +0000, Harvey Yang wrote:\n> > The new function is separated from sendCaptureResults(), which allows\n> > other functions to send a result out of order, like aborting. It'll be\n> > updated in the upcoming patch, when the usage of error result is\n> > separated.\n> >\n> > This function also allows the upcoming partial results to be sent back\n> > to the application without waiting for the requests.\n> >\n> > Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n> > Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>\n> > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> > ---\n> >  src/android/camera_device.cpp | 57 ++++++++++++++++++-----------------\n> >  src/android/camera_device.h   |  1 +\n> >  2 files changed, 31 insertions(+), 27 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index 62f724041..0377cf215 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -1324,42 +1324,45 @@ void CameraDevice::sendCaptureResults()\n> >               auto descriptor = std::move(descriptors_.front());\n> >               descriptors_.pop();\n> >\n> > -             camera3_capture_result_t captureResult = {};\n> > +             sendCaptureResult(descriptor.get());\n> > +     }\n> > +}\n> >\n> > -             captureResult.frame_number = descriptor->frameNumber_;\n> > +void CameraDevice::sendCaptureResult(Camera3RequestDescriptor *request) const\n>\n> I would have named the paramter 'descriptor' but apart from that the\n> patch doesn't seems to introduce functional changes.\n\nLet's keep it `request`, as there will be `Camera3ResultDescriptor`\nin the following patches :)\n\nBR,\nHarvey\n>\n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n>\n> Thanks\n>   j\n>\n> > +{\n> > +     std::vector<camera3_stream_buffer_t> resultBuffers;\n> > +     resultBuffers.reserve(request->buffers_.size());\n> >\n> > -             if (descriptor->resultMetadata_)\n> > -                     captureResult.result =\n> > -                             descriptor->resultMetadata_->getMetadata();\n> > +     for (auto &buffer : request->buffers_) {\n> > +             camera3_buffer_status status = CAMERA3_BUFFER_STATUS_ERROR;\n> >\n> > -             std::vector<camera3_stream_buffer_t> resultBuffers;\n> > -             resultBuffers.reserve(descriptor->buffers_.size());\n> > +             if (buffer.status == StreamBuffer::Status::Success)\n> > +                     status = CAMERA3_BUFFER_STATUS_OK;\n> >\n> > -             for (auto &buffer : descriptor->buffers_) {\n> > -                     camera3_buffer_status status = CAMERA3_BUFFER_STATUS_ERROR;\n> > +             /*\n> > +              * Pass the buffer fence back to the camera framework as\n> > +              * a release fence. This instructs the framework to wait\n> > +              * on the acquire fence in case we haven't done so\n> > +              * ourselves for any reason.\n> > +              */\n> > +             resultBuffers.push_back({ buffer.stream->camera3Stream(),\n> > +                                       buffer.camera3Buffer, status,\n> > +                                       -1, buffer.fence.release() });\n> > +     }\n> >\n> > -                     if (buffer.status == StreamBuffer::Status::Success)\n> > -                             status = CAMERA3_BUFFER_STATUS_OK;\n> > +     camera3_capture_result_t captureResult = {};\n> >\n> > -                     /*\n> > -                      * Pass the buffer fence back to the camera framework as\n> > -                      * a release fence. This instructs the framework to wait\n> > -                      * on the acquire fence in case we haven't done so\n> > -                      * ourselves for any reason.\n> > -                      */\n> > -                     resultBuffers.push_back({ buffer.stream->camera3Stream(),\n> > -                                               buffer.camera3Buffer, status,\n> > -                                               -1, buffer.fence.release() });\n> > -             }\n> > +     captureResult.frame_number = request->frameNumber_;\n> > +     captureResult.num_output_buffers = resultBuffers.size();\n> > +     captureResult.output_buffers = resultBuffers.data();\n> >\n> > -             captureResult.num_output_buffers = resultBuffers.size();\n> > -             captureResult.output_buffers = resultBuffers.data();\n> > +     if (request->status_ == Camera3RequestDescriptor::Status::Success)\n> > +             captureResult.partial_result = 1;\n> >\n> > -             if (descriptor->status_ == Camera3RequestDescriptor::Status::Success)\n> > -                     captureResult.partial_result = 1;\n> > +     if (request->resultMetadata_)\n> > +             captureResult.result = request->resultMetadata_->getMetadata();\n> >\n> > -             callbacks_->process_capture_result(callbacks_, &captureResult);\n> > -     }\n> > +     callbacks_->process_capture_result(callbacks_, &captureResult);\n> >  }\n> >\n> >  void CameraDevice::setBufferStatus(StreamBuffer &streamBuffer,\n> > diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> > index c92ee1aa4..699aa8f17 100644\n> > --- a/src/android/camera_device.h\n> > +++ b/src/android/camera_device.h\n> > @@ -97,6 +97,7 @@ private:\n> >       void completeDescriptor(Camera3RequestDescriptor *descriptor)\n> >               LIBCAMERA_TSA_EXCLUDES(descriptorsMutex_);\n> >       void sendCaptureResults() LIBCAMERA_TSA_REQUIRES(descriptorsMutex_);\n> > +     void sendCaptureResult(Camera3RequestDescriptor *request) const;\n> >       void setBufferStatus(StreamBuffer &buffer,\n> >                            StreamBuffer::Status status);\n> >       std::unique_ptr<CameraMetadata> getResultMetadata(\n> > --\n> > 2.47.0.338.g60cca15819-goog\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 C51A4C3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 29 Nov 2024 08:51:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B896F66006;\n\tFri, 29 Nov 2024 09:51:01 +0100 (CET)","from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com\n\t[IPv6:2a00:1450:4864:20::22c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A997060CE6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 29 Nov 2024 09:50:59 +0100 (CET)","by mail-lj1-x22c.google.com with SMTP id\n\t38308e7fff4ca-2ffc81cee68so17414041fa.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 29 Nov 2024 00:50:59 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"Eo7v6l6F\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=chromium.org; s=google; t=1732870259; x=1733475059;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=c7UPN1JWxTnuMfF0svGymbXsBj5ZhpVb4mEK6GReJ4w=;\n\tb=Eo7v6l6FEOgLn2Ge8ii4f3FLcyXrdfyYGOoye3ndP7WIvd10tbZphMbkAS0DZIAuAW\n\tY+jwWHF+Ts5XQreSLLzSsgPk06jU8pPhnvrOTlXUISHZF0otW/lvqeDg183RyArFtJpL\n\taSb06ZTuf2tiGi/p6Pd1KgLHHyXPRQxZONTBs=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1732870259; x=1733475059;\n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:x-gm-message-state:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=c7UPN1JWxTnuMfF0svGymbXsBj5ZhpVb4mEK6GReJ4w=;\n\tb=oxLH5uQ32B6zTWsElZktLppSp+SM6CIMaQPQNK19TTYONGj1UgUhyo7CAMrUKN+wls\n\tGAm9bLELlR/m0hYY9uudNslwOgkkIUXyR3PJ4Cxd+bzhQIGBK7ePfzGsRBDb+eGW8K9+\n\tv1ihxbNuVEosyLKe55iCeW9Bpq6fBbl5Cxg9rJLQlp1bzzrwdQu5A1Gct6wyTfauZpnD\n\t8jCI8B4BhE87erRJrm7OSRGgTbarbZs2gTA2Wz5pz/ZscvNjdpJaa1ZOrQ7LAG0hv734\n\teGtgOzodHSwweeqvksTOuggQH0Vo0TdMZ2WrqadxO6n62ui2DzJlyvW2l0CDdT0ALQY2\n\tzq3Q==","X-Gm-Message-State":"AOJu0YypvzB3oPir4YQEJesbbEepX+hczhefGwg4ABybPNYyu9/DKpYb\n\tesUdWmpWErLJOHySBbdN7rTgWIuqkA1wBG6bttNy/chzj1G24HBeruoeOZ9/hM+gU0z2cX07EBh\n\tO+PudOx09gJsjDv7BMaFytQBga9V1iHeuFNT3yMGC+cIa0Kw=","X-Gm-Gg":"ASbGncswqvzsonxdLi1wv3iynd6/q1ip+9lBVmzQk8Xa+oGtat8wzJ48GYmMMuYXukD\n\tfZhnP7eu34jZt6xDJ0QifRVrwbay6XBznxosPnp7sPdh2olpqlQK6NhWeiTY=","X-Google-Smtp-Source":"AGHT+IEh6feqN6XmbNE9H06xK5ozzVBLU/G55apJ7dc5L7BQra1Hb4+OMDVByjfPHm0Yw317vvg154BZQe9wblbqNRc=","X-Received":"by 2002:a05:651c:984:b0:2fb:4ca9:8f4 with SMTP id\n\t38308e7fff4ca-2ffd6049e81mr67848441fa.23.1732870258820;\n\tFri, 29 Nov 2024 00:50:58 -0800 (PST)","MIME-Version":"1.0","References":"<20241127092632.3145984-1-chenghaoyang@chromium.org>\n\t<20241127092632.3145984-6-chenghaoyang@chromium.org>\n\t<t2jbemgoqzquywy2qc5tzgb5jkg3aipbuhxjj2v35b6sfsi44b@y2myhdkobgo4>","In-Reply-To":"<t2jbemgoqzquywy2qc5tzgb5jkg3aipbuhxjj2v35b6sfsi44b@y2myhdkobgo4>","From":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Date":"Fri, 29 Nov 2024 16:50:47 +0800","Message-ID":"<CAEB1aht7V74Ea_E=Z8bQcAko3zgU2LjDA4bfWBO93bO+S3dw1w@mail.gmail.com>","Subject":"Re: [PATCH v2 5/9] android: Add CameraDevice::sendCaptureResult()","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tHan-Lin Chen <hanlinchen@chromium.org>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]