[{"id":23329,"web_url":"https://patchwork.libcamera.org/comment/23329/","msgid":"<20220606053619.z43ya75ukgeh2wl2@uno.localdomain>","date":"2022-06-06T05:36:19","subject":"Re: [libcamera-devel] [PATCH v3 3/5] android: camera_device:\n\tPostpone mapped streams handling","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Umang,\n\nOn Sun, Jun 05, 2022 at 09:25:36PM +0200, Umang Jain wrote:\n> Hi Jacopo\n>\n> The cover letter mentions you added an assertion for\n> mappedStream->sourceStream != nullptr\n> but I cannot see here (or in any other patch), did you miss it by any\n> chance?\n\nYou're right. With the rework of the requestedStreams handling, the\nfollowing loop where I had the assertion has gone\n\n+       /*\n+        * Collect the CameraStream associated to each requested capture stream.\n+        * Since requestedStreams is an std:set<>, no duplications can happen.\n+        */\n+       std::set<CameraStream *> requestedStreams;\n+       for (const auto &[i, buffer] : utils::enumerate(descriptor->buffers_)) {\n+               CameraStream *cameraStream = buffer.stream;\n+\n+               switch (cameraStream->type()) {\n+               case CameraStream::Type::Mapped:\n+                       ASSERT(cameraStream->sourceStream() != nullptr);\n+                       requestedStreams.insert(cameraStream->sourceStream());\n+                       break;\n+\n+               case CameraStream::Type::Direct:\n+               case CameraStream::Type::Internal:\n+                       requestedStreams.insert(cameraStream);\n+                       break;\n+               }\n+       }\n\nAs right now requestedStreams is not pre-populated.\n\n>\n> On 6/4/22 11:30, Jacopo Mondi wrote:\n> > Mapped streams are generated by post-processing and always require a\n> > source buffer to process image data from.\n> >\n> > In case a Mapped stream is requested but its source stream is not, it\n> > is required to allocate a buffer on the fly and add it to the\n> > libcamera::Request.\n> >\n> > Make sure a source stream is available for all mapped streams, and if\n> > that's not the case, add a dedicated buffer to the request for that\n> > purpose.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> > Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >   src/android/camera_device.cpp | 63 ++++++++++++++++++++++++++++++-----\n> >   1 file changed, 55 insertions(+), 8 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index 773cb3b66d48..bfe61cf715c8 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -9,6 +9,7 @@\n> >\n> >   #include <algorithm>\n> >   #include <fstream>\n> > +#include <set>\n> >   #include <sys/mman.h>\n> >   #include <unistd.h>\n> >   #include <vector>\n> > @@ -930,6 +931,14 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n> >   \tLOG(HAL, Debug) << \"Queueing request \" << descriptor->request_->cookie()\n> >   \t\t\t<< \" with \" << descriptor->buffers_.size() << \" streams\";\n> >\n> > +\t/*\n> > +\t * Process all the Direct and Internal streams first, they map directly\n> > +\t * to a libcamera stream. Streams of type Mapped will be handled later.\n> > +\t *\n> > +\t * Collect the CameraStream associated to each requested capture stream.\n> > +\t * Since requestedStreams is an std:set<>, no duplications can happen.\n> > +\t */\n> > +\tstd::set<CameraStream *> requestedStreams;\n> >   \tfor (const auto &[i, buffer] : utils::enumerate(descriptor->buffers_)) {\n> >   \t\tCameraStream *cameraStream = buffer.stream;\n> >   \t\tcamera3_stream_t *camera3Stream = cameraStream->camera3Stream();\n> > @@ -952,14 +961,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n> >\n> >   \t\tswitch (cameraStream->type()) {\n> >   \t\tcase CameraStream::Type::Mapped:\n> > -\t\t\t/*\n> > -\t\t\t * Mapped streams don't need buffers added to the\n> > -\t\t\t * Request.\n> > -\t\t\t */\n> > -\t\t\tLOG(HAL, Debug) << ss.str() << \" (mapped)\";\n> > -\n> > -\t\t\tdescriptor->pendingStreamsToProcess_.insert(\n> > -\t\t\t\t{ cameraStream, &buffer });\n> > +\t\t\t/* Mapped streams will be handled in the next loop. */\n> >   \t\t\tcontinue;\n> >\n> >   \t\tcase CameraStream::Type::Direct:\n> > @@ -1003,6 +1005,51 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n> >   \t\tauto fence = std::make_unique<Fence>(std::move(acquireFence));\n> >   \t\tdescriptor->request_->addBuffer(cameraStream->stream(),\n> >   \t\t\t\t\t\tframeBuffer, std::move(fence));\n> > +\n> > +\t\trequestedStreams.insert(cameraStream);\n> > +\t}\n> > +\n> > +\t/*\n> > +\t * Now handle the Mapped streams. If no buffer has been added for them\n> > +\t * because their corresponding direct source stream is not part of this\n> > +\t * particular request, add one here.\n> > +\t */\n> > +\tfor (const auto &[i, buffer] : utils::enumerate(descriptor->buffers_)) {\n> > +\t\tCameraStream *cameraStream = buffer.stream;\n> > +\t\tcamera3_stream_t *camera3Stream = cameraStream->camera3Stream();\n> > +\n> > +\t\tif (cameraStream->type() != CameraStream::Type::Mapped)\n> > +\t\t\tcontinue;\n> > +\n> > +\t\tLOG(HAL, Debug) << i << \" - (\" << camera3Stream->width << \"x\"\n> > +\t\t\t\t<< camera3Stream->height << \")\"\n> > +\t\t\t\t<< \"[\" << utils::hex(camera3Stream->format) << \"] -> \"\n> > +\t\t\t\t<< \"(\" << cameraStream->configuration().size << \")[\"\n> > +\t\t\t\t<< cameraStream->configuration().pixelFormat << \"]\"\n> > +\t\t\t\t<< \" (mapped)\";\n> > +\n> > +\t\tMutexLocker lock(descriptor->streamsProcessMutex_);\n> > +\t\tdescriptor->pendingStreamsToProcess_.insert({ cameraStream, &buffer });\n> > +\n> > +\t\t/*\n> > +\t\t * Make sure the CameraStream this stream is mapped on has been\n> > +\t\t * added to the request.\n> > +\t\t */\n> > +\t\tCameraStream *sourceStream = cameraStream->sourceStream();\n\nBut maybe we now want an assertion here ?\n\n\n> > +\t\tif (requestedStreams.find(sourceStream) != requestedStreams.end())\n> > +\t\t\tcontinue;\n>\n> Now this is looking quite straight forwards, thanks!\n>\n> > +\n> > +\t\t/*\n> > +\t\t * If that's not the case, we need to add a buffer to the request\n> > +\t\t * for this stream.\n> > +\t\t */\n> > +\t\tFrameBuffer *frameBuffer = cameraStream->getBuffer();\n> > +\t\tbuffer.internalBuffer = frameBuffer;\n> > +\n> > +\t\tdescriptor->request_->addBuffer(sourceStream->stream(),\n> > +\t\t\t\t\t\tframeBuffer, nullptr);\n> > +\n> > +\t\trequestedStreams.erase(sourceStream);\n> >   \t}\n> >\n> >   \t/*\n> > --\n> > 2.35.1\n> >","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id B733BBD160\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  6 Jun 2022 05:36:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BE5C365634;\n\tMon,  6 Jun 2022 07:36:24 +0200 (CEST)","from relay11.mail.gandi.net (relay11.mail.gandi.net\n\t[IPv6:2001:4b98:dc4:8::231])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8376C600F4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  6 Jun 2022 07:36:22 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 5FAD1100008;\n\tMon,  6 Jun 2022 05:36:20 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1654493784;\n\tbh=zLMvhmVaL6RyfC9bTvHfszG8fRfb1BRtmrBiSwpAY2w=;\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=h/BVhATK7KdLTSkNWdqweKNdOot8W4FNHQB/0tpR6d/E/i05gZvaApoPZBBdMZ0p+\n\tSvBbaFRjdHNdA6Yv0noh9YmjLelB8pdsQc+xB2BN+ZFcv4CFRWo0krV/fEeouxQqKT\n\tHjjBCunMpZkPolohqcUCZs9iyBJvcUEvHJhdRmoiw88Fe58yy3tEMnjesEkkcsqLsM\n\tfErdobV25jHXD22O34YKE0oXJN0x6I73s2xgFs9TX4JaZevapvXCu2re9JzrP7XR8U\n\tT1KZIXvVW50bJ2513u4J6TUnIRLCpb9AH4yDPtABts2GX6BgNsgfW1QP4LBwqarIf2\n\t0mNpvO6VD25Ag==","Date":"Mon, 6 Jun 2022 07:36:19 +0200","To":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<20220606053619.z43ya75ukgeh2wl2@uno.localdomain>","References":"<20220604093025.77737-1-jacopo@jmondi.org>\n\t<20220604093025.77737-4-jacopo@jmondi.org>\n\t<ff1523b4-6a8e-f8f3-e9d0-ed1b94b37d8a@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<ff1523b4-6a8e-f8f3-e9d0-ed1b94b37d8a@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v3 3/5] android: camera_device:\n\tPostpone mapped streams handling","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":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23345,"web_url":"https://patchwork.libcamera.org/comment/23345/","msgid":"<7e9427a9-25ef-bbfa-3f6e-c2457777cf4f@ideasonboard.com>","date":"2022-06-06T17:26:39","subject":"Re: [libcamera-devel] [PATCH v3 3/5] android: camera_device:\n\tPostpone mapped streams handling","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 6/6/22 07:36, Jacopo Mondi wrote:\n> Hi Umang,\n>\n> On Sun, Jun 05, 2022 at 09:25:36PM +0200, Umang Jain wrote:\n>> Hi Jacopo\n>>\n>> The cover letter mentions you added an assertion for\n>> mappedStream->sourceStream != nullptr\n>> but I cannot see here (or in any other patch), did you miss it by any\n>> chance?\n> You're right. With the rework of the requestedStreams handling, the\n> following loop where I had the assertion has gone\n>\n> +       /*\n> +        * Collect the CameraStream associated to each requested capture stream.\n> +        * Since requestedStreams is an std:set<>, no duplications can happen.\n> +        */\n> +       std::set<CameraStream *> requestedStreams;\n> +       for (const auto &[i, buffer] : utils::enumerate(descriptor->buffers_)) {\n> +               CameraStream *cameraStream = buffer.stream;\n> +\n> +               switch (cameraStream->type()) {\n> +               case CameraStream::Type::Mapped:\n> +                       ASSERT(cameraStream->sourceStream() != nullptr);\n> +                       requestedStreams.insert(cameraStream->sourceStream());\n> +                       break;\n> +\n> +               case CameraStream::Type::Direct:\n> +               case CameraStream::Type::Internal:\n> +                       requestedStreams.insert(cameraStream);\n> +                       break;\n> +               }\n> +       }\n>\n> As right now requestedStreams is not pre-populated.\n>\n>> On 6/4/22 11:30, Jacopo Mondi wrote:\n>>> Mapped streams are generated by post-processing and always require a\n>>> source buffer to process image data from.\n>>>\n>>> In case a Mapped stream is requested but its source stream is not, it\n>>> is required to allocate a buffer on the fly and add it to the\n>>> libcamera::Request.\n>>>\n>>> Make sure a source stream is available for all mapped streams, and if\n>>> that's not the case, add a dedicated buffer to the request for that\n>>> purpose.\n>>>\n>>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n>>> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n>>> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n>>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>>> ---\n>>>    src/android/camera_device.cpp | 63 ++++++++++++++++++++++++++++++-----\n>>>    1 file changed, 55 insertions(+), 8 deletions(-)\n>>>\n>>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n>>> index 773cb3b66d48..bfe61cf715c8 100644\n>>> --- a/src/android/camera_device.cpp\n>>> +++ b/src/android/camera_device.cpp\n>>> @@ -9,6 +9,7 @@\n>>>\n>>>    #include <algorithm>\n>>>    #include <fstream>\n>>> +#include <set>\n>>>    #include <sys/mman.h>\n>>>    #include <unistd.h>\n>>>    #include <vector>\n>>> @@ -930,6 +931,14 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>>>    \tLOG(HAL, Debug) << \"Queueing request \" << descriptor->request_->cookie()\n>>>    \t\t\t<< \" with \" << descriptor->buffers_.size() << \" streams\";\n>>>\n>>> +\t/*\n>>> +\t * Process all the Direct and Internal streams first, they map directly\n>>> +\t * to a libcamera stream. Streams of type Mapped will be handled later.\n>>> +\t *\n>>> +\t * Collect the CameraStream associated to each requested capture stream.\n>>> +\t * Since requestedStreams is an std:set<>, no duplications can happen.\n>>> +\t */\n>>> +\tstd::set<CameraStream *> requestedStreams;\n>>>    \tfor (const auto &[i, buffer] : utils::enumerate(descriptor->buffers_)) {\n>>>    \t\tCameraStream *cameraStream = buffer.stream;\n>>>    \t\tcamera3_stream_t *camera3Stream = cameraStream->camera3Stream();\n>>> @@ -952,14 +961,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>>>\n>>>    \t\tswitch (cameraStream->type()) {\n>>>    \t\tcase CameraStream::Type::Mapped:\n>>> -\t\t\t/*\n>>> -\t\t\t * Mapped streams don't need buffers added to the\n>>> -\t\t\t * Request.\n>>> -\t\t\t */\n>>> -\t\t\tLOG(HAL, Debug) << ss.str() << \" (mapped)\";\n>>> -\n>>> -\t\t\tdescriptor->pendingStreamsToProcess_.insert(\n>>> -\t\t\t\t{ cameraStream, &buffer });\n>>> +\t\t\t/* Mapped streams will be handled in the next loop. */\n>>>    \t\t\tcontinue;\n>>>\n>>>    \t\tcase CameraStream::Type::Direct:\n>>> @@ -1003,6 +1005,51 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>>>    \t\tauto fence = std::make_unique<Fence>(std::move(acquireFence));\n>>>    \t\tdescriptor->request_->addBuffer(cameraStream->stream(),\n>>>    \t\t\t\t\t\tframeBuffer, std::move(fence));\n>>> +\n>>> +\t\trequestedStreams.insert(cameraStream);\n>>> +\t}\n>>> +\n>>> +\t/*\n>>> +\t * Now handle the Mapped streams. If no buffer has been added for them\n>>> +\t * because their corresponding direct source stream is not part of this\n>>> +\t * particular request, add one here.\n>>> +\t */\n>>> +\tfor (const auto &[i, buffer] : utils::enumerate(descriptor->buffers_)) {\n>>> +\t\tCameraStream *cameraStream = buffer.stream;\n>>> +\t\tcamera3_stream_t *camera3Stream = cameraStream->camera3Stream();\n>>> +\n>>> +\t\tif (cameraStream->type() != CameraStream::Type::Mapped)\n>>> +\t\t\tcontinue;\n>>> +\n>>> +\t\tLOG(HAL, Debug) << i << \" - (\" << camera3Stream->width << \"x\"\n>>> +\t\t\t\t<< camera3Stream->height << \")\"\n>>> +\t\t\t\t<< \"[\" << utils::hex(camera3Stream->format) << \"] -> \"\n>>> +\t\t\t\t<< \"(\" << cameraStream->configuration().size << \")[\"\n>>> +\t\t\t\t<< cameraStream->configuration().pixelFormat << \"]\"\n>>> +\t\t\t\t<< \" (mapped)\";\n>>> +\n>>> +\t\tMutexLocker lock(descriptor->streamsProcessMutex_);\n>>> +\t\tdescriptor->pendingStreamsToProcess_.insert({ cameraStream, &buffer });\n>>> +\n>>> +\t\t/*\n>>> +\t\t * Make sure the CameraStream this stream is mapped on has been\n>>> +\t\t * added to the request.\n>>> +\t\t */\n>>> +\t\tCameraStream *sourceStream = cameraStream->sourceStream();\n> But maybe we now want an assertion here ?\n\n\nYes indeed. Looks alright to me to do it here.\n\n>\n>\n>>> +\t\tif (requestedStreams.find(sourceStream) != requestedStreams.end())\n>>> +\t\t\tcontinue;\n>> Now this is looking quite straight forwards, thanks!\n>>\n>>> +\n>>> +\t\t/*\n>>> +\t\t * If that's not the case, we need to add a buffer to the request\n>>> +\t\t * for this stream.\n>>> +\t\t */\n>>> +\t\tFrameBuffer *frameBuffer = cameraStream->getBuffer();\n>>> +\t\tbuffer.internalBuffer = frameBuffer;\n>>> +\n>>> +\t\tdescriptor->request_->addBuffer(sourceStream->stream(),\n>>> +\t\t\t\t\t\tframeBuffer, nullptr);\n>>> +\n>>> +\t\trequestedStreams.erase(sourceStream);\n>>>    \t}\n>>>\n>>>    \t/*\n>>> --\n>>> 2.35.1\n>>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 6C003BD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  6 Jun 2022 17:26:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8531265635;\n\tMon,  6 Jun 2022 19:26:44 +0200 (CEST)","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 9A553633A7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  6 Jun 2022 19:26:43 +0200 (CEST)","from [192.168.219.240] (40.red-176-83-201.dynamicip.rima-tde.net\n\t[176.83.201.40])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B3C71ABC;\n\tMon,  6 Jun 2022 19:26:42 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1654536404;\n\tbh=dD6zGKPxSBWoT8VrhvUn9SGk5fjXtUWVh2ix5SSxjBc=;\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=1GMkSgl/NzoR2B/JjGDjp6Mpas8ons2WxPmn9QxxQ4RSTcHua5b+a2LLaFysWQ5rr\n\tAIZvOHis6nWZ3ek9k1lS0zdzg6rx1O+GUqiC0KEaBs1dDG07ObIbfvzkn35QRUcT6y\n\tS9vW/tKV33f0CVRvxuAfo2Dtkrg2Z5e6vn1q+AxlWRcM6VYJQ/vJbHpmEcM8II/Xe6\n\tp85l5vDih5fmZxeImGM5a+M9quDSfwU2AdxklWR3bw2MeKKKj15aMmBKk88PG8Q+Gn\n\tVMF0KCdxudKYMLkr+GzDk2pYoYsiKLZYnopWgzB1Uc2LQiwGnITf5a5RMikqIxp2pV\n\tkxLb58L12FkXA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1654536403;\n\tbh=dD6zGKPxSBWoT8VrhvUn9SGk5fjXtUWVh2ix5SSxjBc=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=qNO0nojBSazG9B1TmD5EekZct2WxSS6EKe0xbtwO/1OGgzpi2bgLzVPyW7tTm1mge\n\tYXEUiIcVgZSmX1Ece1xokjT3s7pBwsGg4EQ5VxJEVziND/1bs0j1IQUUobTK5A7EsW\n\t/7Wv+lkNACg3wLMDWzUXOOKxzFMZ6HZ2Gg1Bbw00="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"qNO0nojB\"; dkim-atps=neutral","Message-ID":"<7e9427a9-25ef-bbfa-3f6e-c2457777cf4f@ideasonboard.com>","Date":"Mon, 6 Jun 2022 19:26:39 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.4.1","Content-Language":"en-US","To":"Jacopo Mondi <jacopo@jmondi.org>","References":"<20220604093025.77737-1-jacopo@jmondi.org>\n\t<20220604093025.77737-4-jacopo@jmondi.org>\n\t<ff1523b4-6a8e-f8f3-e9d0-ed1b94b37d8a@ideasonboard.com>\n\t<20220606053619.z43ya75ukgeh2wl2@uno.localdomain>","In-Reply-To":"<20220606053619.z43ya75ukgeh2wl2@uno.localdomain>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v3 3/5] android: camera_device:\n\tPostpone mapped streams handling","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":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@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>"}}]