[{"id":3142,"web_url":"https://patchwork.libcamera.org/comment/3142/","msgid":"<20191127094738.o3tfjontibe2qpl3@uno.localdomain>","date":"2019-11-27T09:47:38","subject":"Re: [libcamera-devel] [PATCH 02/30] libcamera: Remove buffer index\n\tfrom logging","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Niklas,\n\nOn Wed, Nov 27, 2019 at 12:35:52AM +0100, Niklas Söderlund wrote:\n> The buffer index is a V4L2 concept that will be hidden from users when\n> the switch to FrameBuffer is complete, in preparation remove it from\n\nWhat's a FrameBuffer ? I guess I'll find it out, but it's mentioned in\na few commit messages before it's actually introdduced...\n\n> logging.\n>\n> Keep and move one debug log message where the index is available as the\n> V4L2 buffer is being dequeued for the video device and it's useful when\n> debugging.\n>\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  src/cam/capture.cpp                      | 3 +--\n>  src/libcamera/v4l2_videodevice.cpp       | 3 +--\n>  src/qcam/main_window.cpp                 | 3 +--\n>  test/v4l2_videodevice/buffer_sharing.cpp | 8 ++++----\n>  test/v4l2_videodevice/capture_async.cpp  | 2 +-\n>  test/v4l2_videodevice/v4l2_m2mdevice.cpp | 4 ++--\n>  6 files changed, 10 insertions(+), 13 deletions(-)\n>\n> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> index e665d819fb777a90..4b65b1d0a2dbed35 100644\n> --- a/src/cam/capture.cpp\n> +++ b/src/cam/capture.cpp\n> @@ -155,7 +155,6 @@ void Capture::requestComplete(Request *request)\n>  \t\tconst std::string &name = streamName_[stream];\n>\n>  \t\tinfo << \" \" << name\n> -\t\t     << \" (\" << buffer->index() << \")\"\n>  \t\t     << \" seq: \" << std::setw(6) << std::setfill('0') << buffer->sequence()\n>  \t\t     << \" bytesused: \" << buffer->bytesused();\n>\n> @@ -182,7 +181,7 @@ void Capture::requestComplete(Request *request)\n>\n>  \t\tstd::unique_ptr<Buffer> newBuffer = stream->createBuffer(index);\n>  \t\tif (!newBuffer) {\n> -\t\t\tstd::cerr << \"Can't create buffer \" << index << std::endl;\n> +\t\t\tstd::cerr << \"Can't create buffer\" << std::endl;\n>  \t\t\treturn;\n>  \t\t}\n>\n> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> index 992130751286994c..dbb5c3982334e243 100644\n> --- a/src/libcamera/v4l2_videodevice.cpp\n> +++ b/src/libcamera/v4l2_videodevice.cpp\n> @@ -1103,6 +1103,7 @@ Buffer *V4L2VideoDevice::dequeueBuffer()\n>  \t}\n>\n>  \tASSERT(buf.index < bufferPool_->count());\n> +\tLOG(V4L2, Debug) << \"Buffer \" << buf.index << \" is available\";\n>\n>  \tauto it = queuedBuffers_.find(buf.index);\n>  \tBuffer *buffer = it->second;\n> @@ -1138,8 +1139,6 @@ void V4L2VideoDevice::bufferAvailable(EventNotifier *notifier)\n>  \tif (!buffer)\n>  \t\treturn;\n>\n> -\tLOG(V4L2, Debug) << \"Buffer \" << buffer->index() << \" is available\";\n> -\n>  \t/* Notify anyone listening to the device. */\n>  \tbufferReady.emit(buffer);\n>  }\n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index cca7365ae75687f9..0c7ca61ac12ec41c 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -264,7 +264,6 @@ void MainWindow::requestComplete(Request *request)\n>  \tlastBufferTime_ = buffer->timestamp();\n>\n>  \tstd::cout << \"seq: \" << std::setw(6) << std::setfill('0') << buffer->sequence()\n> -\t\t  << \" buf: \" << buffer->index()\n>  \t\t  << \" bytesused: \" << buffer->bytesused()\n>  \t\t  << \" timestamp: \" << buffer->timestamp()\n>  \t\t  << \" fps: \" << std::fixed << std::setprecision(2) << fps\n> @@ -285,7 +284,7 @@ void MainWindow::requestComplete(Request *request)\n>\n>  \t\tstd::unique_ptr<Buffer> newBuffer = stream->createBuffer(index);\n>  \t\tif (!newBuffer) {\n> -\t\t\tstd::cerr << \"Can't create buffer \" << index << std::endl;\n> +\t\t\tstd::cerr << \"Can't create buffer\" << std::endl;\n>  \t\t\treturn;\n>  \t\t}\n>\n> diff --git a/test/v4l2_videodevice/buffer_sharing.cpp b/test/v4l2_videodevice/buffer_sharing.cpp\n> index 1629f34cfa6c79fe..d02c391b95933922 100644\n> --- a/test/v4l2_videodevice/buffer_sharing.cpp\n> +++ b/test/v4l2_videodevice/buffer_sharing.cpp\n> @@ -92,8 +92,8 @@ protected:\n>\n>  \tvoid captureBufferReady(Buffer *buffer)\n>  \t{\n> -\t\tstd::cout << \"Received capture buffer: \" << buffer->index()\n> -\t\t\t  << \" sequence \" << buffer->sequence() << std::endl;\n> +\t\tstd::cout << \"Received capture buffer  sequence \"\n                                                      ^- Double space\nI would drop 'sequence' completely\n\n> +\t\t\t  << buffer->sequence() << std::endl;\n>\n>  \t\tif (buffer->status() != Buffer::BufferSuccess)\n>  \t\t\treturn;\n> @@ -104,8 +104,8 @@ protected:\n>\n>  \tvoid outputBufferReady(Buffer *buffer)\n>  \t{\n> -\t\tstd::cout << \"Received output buffer: \" << buffer->index()\n> -\t\t\t  << \" sequence \" << buffer->sequence() << std::endl;\n> +\t\tstd::cout << \"Received output buffer sequence \"\n> +\t\t\t  << buffer->sequence() << std::endl;\n>\n>  \t\tif (buffer->status() != Buffer::BufferSuccess)\n>  \t\t\treturn;\n> diff --git a/test/v4l2_videodevice/capture_async.cpp b/test/v4l2_videodevice/capture_async.cpp\n> index 442a4fe56eace57e..0bc0067c50909c9d 100644\n> --- a/test/v4l2_videodevice/capture_async.cpp\n> +++ b/test/v4l2_videodevice/capture_async.cpp\n> @@ -22,7 +22,7 @@ public:\n>\n>  \tvoid receiveBuffer(Buffer *buffer)\n>  \t{\n> -\t\tstd::cout << \"Received buffer \" << buffer->index() << std::endl;\n> +\t\tstd::cout << \"Received buffer\" << std::endl;\n\nWithout the index this should be \"Buffer received\"\nHere and below\n\n>  \t\tframes++;\n>\n>  \t\t/* Requeue the buffer for further use. */\n> diff --git a/test/v4l2_videodevice/v4l2_m2mdevice.cpp b/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> index 4d3644c2d28792f1..442bcac5dc49cc59 100644\n> --- a/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> +++ b/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> @@ -31,7 +31,7 @@ public:\n>\n>  \tvoid outputBufferComplete(Buffer *buffer)\n>  \t{\n> -\t\tcout << \"Received output buffer \" << buffer->index() << endl;\n> +\t\tcout << \"Received output buffer\" << endl;\n>\n>  \t\toutputFrames_++;\n>\n> @@ -41,7 +41,7 @@ public:\n>\n>  \tvoid receiveCaptureBuffer(Buffer *buffer)\n>  \t{\n> -\t\tcout << \"Received capture buffer \" << buffer->index() << endl;\n> +\t\tcout << \"Received capture buffer\" << endl;\n>\n\nAll minors, please add\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n>  \t\tcaptureFrames_++;\n>\n> --\n> 2.24.0\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4074460BB8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Nov 2019 10:45:33 +0100 (CET)","from uno.localdomain (93-34-114-233.ip49.fastwebnet.it\n\t[93.34.114.233]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay12.mail.gandi.net (Postfix) with ESMTPSA id 618CC200018;\n\tWed, 27 Nov 2019 09:45:31 +0000 (UTC)"],"Date":"Wed, 27 Nov 2019 10:47:38 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191127094738.o3tfjontibe2qpl3@uno.localdomain>","References":"<20191126233620.1695316-1-niklas.soderlund@ragnatech.se>\n\t<20191126233620.1695316-3-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"34y3cm7bz73pa6v3\"","Content-Disposition":"inline","In-Reply-To":"<20191126233620.1695316-3-niklas.soderlund@ragnatech.se>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH 02/30] libcamera: Remove buffer index\n\tfrom logging","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>","X-List-Received-Date":"Wed, 27 Nov 2019 09:45:33 -0000"}},{"id":3221,"web_url":"https://patchwork.libcamera.org/comment/3221/","msgid":"<20191209132204.GE4853@pendragon.ideasonboard.com>","date":"2019-12-09T13:22:04","subject":"Re: [libcamera-devel] [PATCH 02/30] libcamera: Remove buffer index\n\tfrom logging","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hello,\n\nOn Wed, Nov 27, 2019 at 10:47:38AM +0100, Jacopo Mondi wrote:\n> On Wed, Nov 27, 2019 at 12:35:52AM +0100, Niklas Söderlund wrote:\n> > The buffer index is a V4L2 concept that will be hidden from users when\n> > the switch to FrameBuffer is complete, in preparation remove it from\n> \n> What's a FrameBuffer ? I guess I'll find it out, but it's mentioned in\n> a few commit messages before it's actually introdduced...\n\nOne way to fix this is to write the commit message as\n\nThe buffer index is a V4L2 concept that will be hidden from users with\nthe introduction of a new FrameBuffer class. In preparation for this,\nremove the index from log messages.\n\n> > logging.\n> >\n> > Keep and move one debug log message where the index is available as the\n> > V4L2 buffer is being dequeued for the video device and it's useful when\n> > debugging.\n> >\n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >  src/cam/capture.cpp                      | 3 +--\n> >  src/libcamera/v4l2_videodevice.cpp       | 3 +--\n> >  src/qcam/main_window.cpp                 | 3 +--\n> >  test/v4l2_videodevice/buffer_sharing.cpp | 8 ++++----\n> >  test/v4l2_videodevice/capture_async.cpp  | 2 +-\n> >  test/v4l2_videodevice/v4l2_m2mdevice.cpp | 4 ++--\n> >  6 files changed, 10 insertions(+), 13 deletions(-)\n> >\n> > diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> > index e665d819fb777a90..4b65b1d0a2dbed35 100644\n> > --- a/src/cam/capture.cpp\n> > +++ b/src/cam/capture.cpp\n> > @@ -155,7 +155,6 @@ void Capture::requestComplete(Request *request)\n> >  \t\tconst std::string &name = streamName_[stream];\n> >\n> >  \t\tinfo << \" \" << name\n> > -\t\t     << \" (\" << buffer->index() << \")\"\n> >  \t\t     << \" seq: \" << std::setw(6) << std::setfill('0') << buffer->sequence()\n> >  \t\t     << \" bytesused: \" << buffer->bytesused();\n> >\n> > @@ -182,7 +181,7 @@ void Capture::requestComplete(Request *request)\n> >\n> >  \t\tstd::unique_ptr<Buffer> newBuffer = stream->createBuffer(index);\n> >  \t\tif (!newBuffer) {\n> > -\t\t\tstd::cerr << \"Can't create buffer \" << index << std::endl;\n> > +\t\t\tstd::cerr << \"Can't create buffer\" << std::endl;\n> >  \t\t\treturn;\n> >  \t\t}\n> >\n> > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> > index 992130751286994c..dbb5c3982334e243 100644\n> > --- a/src/libcamera/v4l2_videodevice.cpp\n> > +++ b/src/libcamera/v4l2_videodevice.cpp\n> > @@ -1103,6 +1103,7 @@ Buffer *V4L2VideoDevice::dequeueBuffer()\n> >  \t}\n> >\n> >  \tASSERT(buf.index < bufferPool_->count());\n> > +\tLOG(V4L2, Debug) << \"Buffer \" << buf.index << \" is available\";\n\nI would write this\n\n\tLOG(V4L2, Debug) << \"Dequeuing buffer \" << buf.index;\n\nand move this above the ASSERT (the index could be useful when debugging\nassertion failures).\n\n> >\n> >  \tauto it = queuedBuffers_.find(buf.index);\n> >  \tBuffer *buffer = it->second;\n> > @@ -1138,8 +1139,6 @@ void V4L2VideoDevice::bufferAvailable(EventNotifier *notifier)\n> >  \tif (!buffer)\n> >  \t\treturn;\n> >\n> > -\tLOG(V4L2, Debug) << \"Buffer \" << buffer->index() << \" is available\";\n> > -\n> >  \t/* Notify anyone listening to the device. */\n> >  \tbufferReady.emit(buffer);\n> >  }\n> > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> > index cca7365ae75687f9..0c7ca61ac12ec41c 100644\n> > --- a/src/qcam/main_window.cpp\n> > +++ b/src/qcam/main_window.cpp\n> > @@ -264,7 +264,6 @@ void MainWindow::requestComplete(Request *request)\n> >  \tlastBufferTime_ = buffer->timestamp();\n> >\n> >  \tstd::cout << \"seq: \" << std::setw(6) << std::setfill('0') << buffer->sequence()\n> > -\t\t  << \" buf: \" << buffer->index()\n> >  \t\t  << \" bytesused: \" << buffer->bytesused()\n> >  \t\t  << \" timestamp: \" << buffer->timestamp()\n> >  \t\t  << \" fps: \" << std::fixed << std::setprecision(2) << fps\n> > @@ -285,7 +284,7 @@ void MainWindow::requestComplete(Request *request)\n> >\n> >  \t\tstd::unique_ptr<Buffer> newBuffer = stream->createBuffer(index);\n> >  \t\tif (!newBuffer) {\n> > -\t\t\tstd::cerr << \"Can't create buffer \" << index << std::endl;\n> > +\t\t\tstd::cerr << \"Can't create buffer\" << std::endl;\n> >  \t\t\treturn;\n> >  \t\t}\n> >\n> > diff --git a/test/v4l2_videodevice/buffer_sharing.cpp b/test/v4l2_videodevice/buffer_sharing.cpp\n> > index 1629f34cfa6c79fe..d02c391b95933922 100644\n> > --- a/test/v4l2_videodevice/buffer_sharing.cpp\n> > +++ b/test/v4l2_videodevice/buffer_sharing.cpp\n> > @@ -92,8 +92,8 @@ protected:\n> >\n> >  \tvoid captureBufferReady(Buffer *buffer)\n> >  \t{\n> > -\t\tstd::cout << \"Received capture buffer: \" << buffer->index()\n> > -\t\t\t  << \" sequence \" << buffer->sequence() << std::endl;\n> > +\t\tstd::cout << \"Received capture buffer  sequence \"\n>                                                       ^- Double space\n> I would drop 'sequence' completely\n\nAck.\n\n> > +\t\t\t  << buffer->sequence() << std::endl;\n> >\n> >  \t\tif (buffer->status() != Buffer::BufferSuccess)\n> >  \t\t\treturn;\n> > @@ -104,8 +104,8 @@ protected:\n> >\n> >  \tvoid outputBufferReady(Buffer *buffer)\n> >  \t{\n> > -\t\tstd::cout << \"Received output buffer: \" << buffer->index()\n> > -\t\t\t  << \" sequence \" << buffer->sequence() << std::endl;\n> > +\t\tstd::cout << \"Received output buffer sequence \"\n> > +\t\t\t  << buffer->sequence() << std::endl;\n\nSame here.\n\n> >  \t\tif (buffer->status() != Buffer::BufferSuccess)\n> >  \t\t\treturn;\n> > diff --git a/test/v4l2_videodevice/capture_async.cpp b/test/v4l2_videodevice/capture_async.cpp\n> > index 442a4fe56eace57e..0bc0067c50909c9d 100644\n> > --- a/test/v4l2_videodevice/capture_async.cpp\n> > +++ b/test/v4l2_videodevice/capture_async.cpp\n> > @@ -22,7 +22,7 @@ public:\n> >\n> >  \tvoid receiveBuffer(Buffer *buffer)\n> >  \t{\n> > -\t\tstd::cout << \"Received buffer \" << buffer->index() << std::endl;\n> > +\t\tstd::cout << \"Received buffer\" << std::endl;\n> \n> Without the index this should be \"Buffer received\"\n> Here and below\n\nI think both work, but I'm fine with switching to \"Buffer received\".\n\n> >  \t\tframes++;\n> >\n> >  \t\t/* Requeue the buffer for further use. */\n> > diff --git a/test/v4l2_videodevice/v4l2_m2mdevice.cpp b/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> > index 4d3644c2d28792f1..442bcac5dc49cc59 100644\n> > --- a/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> > +++ b/test/v4l2_videodevice/v4l2_m2mdevice.cpp\n> > @@ -31,7 +31,7 @@ public:\n> >\n> >  \tvoid outputBufferComplete(Buffer *buffer)\n> >  \t{\n> > -\t\tcout << \"Received output buffer \" << buffer->index() << endl;\n> > +\t\tcout << \"Received output buffer\" << endl;\n> >\n> >  \t\toutputFrames_++;\n> >\n> > @@ -41,7 +41,7 @@ public:\n> >\n> >  \tvoid receiveCaptureBuffer(Buffer *buffer)\n> >  \t{\n> > -\t\tcout << \"Received capture buffer \" << buffer->index() << endl;\n> > +\t\tcout << \"Received capture buffer\" << endl;\n> >\n> \n> All minors, please add\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> >  \t\tcaptureFrames_++;\n> >","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 0BF1E60BC4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  9 Dec 2019 14:22:12 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 685E499A;\n\tMon,  9 Dec 2019 14:22:11 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1575897731;\n\tbh=38g1qY7hrMll5zc1Hz4BUBh/7EpMijFH8V70qGuw1vY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=oLPS9DxmeoVB3Ptbo+152ZOTiYFCoxXSkwTURZpA4QIjLUbJmtuIfsH4Yt+IndxBr\n\tLVNYRaRiXm+9JxpdoIdov6e4jeyo/2zx5GRY2bC93pLS3Xzo/S1oUZLKIRqDYa0Xkn\n\tSDBcwzuL2zK/b93P5e0adNYNvdujQmE+UI/XjuEA=","Date":"Mon, 9 Dec 2019 15:22:04 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>,\n\tlibcamera-devel@lists.libcamera.org","Message-ID":"<20191209132204.GE4853@pendragon.ideasonboard.com>","References":"<20191126233620.1695316-1-niklas.soderlund@ragnatech.se>\n\t<20191126233620.1695316-3-niklas.soderlund@ragnatech.se>\n\t<20191127094738.o3tfjontibe2qpl3@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20191127094738.o3tfjontibe2qpl3@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 02/30] libcamera: Remove buffer index\n\tfrom logging","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>","X-List-Received-Date":"Mon, 09 Dec 2019 13:22:12 -0000"}}]