[{"id":11673,"web_url":"https://patchwork.libcamera.org/comment/11673/","msgid":"<d56da70f-71ac-42af-f232-8a005e32f356@uajain.com>","date":"2020-07-28T16:07:56","subject":"Re: [libcamera-devel] [PATCH v3 3/3] cam: Add optional argument to\n\t--capture to specify how many frames to capture","submitter":{"id":1,"url":"https://patchwork.libcamera.org/api/people/1/","name":"Umang Jain","email":"email@uajain.com"},"content":"Hi Niklas,\n\nThanks for extending --capture to capture a certain no. of frames.\nIt super handy to use.\n\nJust want to let you know, it does not work if I use short-hand \"-C=10\".\nHowever, cam -c 1 --capture=10 seems to work just fine.\n\nOn $cam -c 1 -C=10 O get the following:\n\n[uajain@localhost libcamera]$ sudo ./build/src/cam/cam  -c 1 -C=10\nCan't parse integer argument for option --capture\nOptions:\n...\n\nOn 7/25/20 12:48 AM, Niklas Söderlund wrote:\n> Extend the '--capture' option with and optional numerical argument to be\n> able to specify how many frames to capture before exiting. If the\n> optional argument is not provided the old behavior of running until the\n> user interrupts with a SIGINT is retained.\n>\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> * Changes since v2\n> - Move check in Capture::requestComplete() as to not leak the created\n>    but never used Request.\n> * Changes since v1\n> - Extend --capture option instead of adding a new --count option.\n> ---\n>   src/cam/capture.cpp | 18 ++++++++++++++++--\n>   src/cam/capture.h   |  2 ++\n>   src/cam/main.cpp    |  5 +++--\n>   3 files changed, 21 insertions(+), 4 deletions(-)\n>\n> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> index f811a18c579508a1..3d8e89d52c7ab68d 100644\n> --- a/src/cam/capture.cpp\n> +++ b/src/cam/capture.cpp\n> @@ -18,7 +18,8 @@ using namespace libcamera;\n>   \n>   Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config,\n>   \t\t EventLoop *loop)\n> -\t: camera_(camera), config_(config), writer_(nullptr), loop_(loop)\n> +\t: camera_(camera), config_(config), writer_(nullptr), loop_(loop),\n> +\t  captureCount_(0), captureLimit_(0)\n>   {\n>   }\n>   \n> @@ -26,6 +27,9 @@ int Capture::run(const OptionsParser::Options &options)\n>   {\n>   \tint ret;\n>   \n> +\tcaptureCount_ = 0;\n> +\tcaptureLimit_ = options[OptCapture].toInteger();\n> +\n>   \tif (!camera_) {\n>   \t\tstd::cout << \"Can't capture without a camera\" << std::endl;\n>   \t\treturn -ENODEV;\n> @@ -132,7 +136,11 @@ int Capture::capture(FrameBufferAllocator *allocator)\n>   \t\t}\n>   \t}\n>   \n> -\tstd::cout << \"Capture until user interrupts by SIGINT\" << std::endl;\n> +\tif (captureLimit_)\n> +\t\tstd::cout << \"Capture \" << captureLimit_ << \" frames\" << std::endl;\n> +\telse\n> +\t\tstd::cout << \"Capture until user interrupts by SIGINT\" << std::endl;\n> +\n>   \tret = loop_->exec();\n>   \tif (ret)\n>   \t\tstd::cout << \"Failed to run capture loop\" << std::endl;\n> @@ -184,6 +192,12 @@ void Capture::requestComplete(Request *request)\n>   \n>   \tstd::cout << info.str() << std::endl;\n>   \n> +\tcaptureCount_++;\n> +\tif (captureLimit_ && captureCount_ >= captureLimit_) {\n> +\t\tloop_->exit(0);\n> +\t\treturn;\n> +\t}\n> +\n>   \t/*\n>   \t * Create a new request and populate it with one buffer for each\n>   \t * stream.\n> diff --git a/src/cam/capture.h b/src/cam/capture.h\n> index acdefc47b24314d2..32940a2a12138887 100644\n> --- a/src/cam/capture.h\n> +++ b/src/cam/capture.h\n> @@ -41,6 +41,8 @@ private:\n>   \tstd::chrono::steady_clock::time_point last_;\n>   \n>   \tEventLoop *loop_;\n> +\tunsigned int captureCount_;\n> +\tunsigned int captureLimit_;\n>   };\n>   \n>   #endif /* __CAM_CAPTURE_H__ */\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index 3e83feabe64e036c..f5aba041d7c4c181 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -167,8 +167,9 @@ int CamApp::parseOptions(int argc, char *argv[])\n>   \tparser.addOption(OptCamera, OptionString,\n>   \t\t\t \"Specify which camera to operate on, by name or by index\", \"camera\",\n>   \t\t\t ArgumentRequired, \"camera\");\n> -\tparser.addOption(OptCapture, OptionNone,\n> -\t\t\t \"Capture until interrupted by user\", \"capture\");\n> +\tparser.addOption(OptCapture, OptionInteger,\n> +\t\t\t \"Capture until interrupted by user or until <count> frames captured\",\n> +\t\t\t \"capture\", ArgumentOptional, \"count\");\n>   \tparser.addOption(OptFile, OptionString,\n>   \t\t\t \"Write captured frames to disk\\n\"\n>   \t\t\t \"The first '#' character in the file name is expanded to the stream name and frame sequence number.\\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 8DC93BD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 28 Jul 2020 16:08:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0AF1F613C6;\n\tTue, 28 Jul 2020 18:08:00 +0200 (CEST)","from o1.f.az.sendgrid.net (o1.f.az.sendgrid.net [208.117.55.132])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 87C1260923\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Jul 2020 18:07:58 +0200 (CEST)","by filterdrecv-p3las1-7754f7d4cc-fqqgm with SMTP id\n\tfilterdrecv-p3las1-7754f7d4cc-fqqgm-19-5F204D5C-5F\n\t2020-07-28 16:07:56.329707012 +0000 UTC m=+2843657.509392195","from mail.uajain.com (unknown)\n\tby ismtpd0006p1hnd1.sendgrid.net (SG) with ESMTP\n\tid oYXEMAOWSJ683u2Cd8vVnw Tue, 28 Jul 2020 16:07:55.891 +0000 (UTC)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=uajain.com header.i=@uajain.com\n\theader.b=\"CQcggfa7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=uajain.com;\n\th=subject:references:from:mime-version:in-reply-to:to:content-type:\n\tcontent-transfer-encoding;\n\ts=s1; bh=91IbMZvrJH9urN++R3BCClCC2ZJm2zxapduLLy3zSmw=;\n\tb=CQcggfa7hKQK/RJ0kDAjLHGM+gIagYwYsnGcVse/unif+WIWyajS0e5VvpLvQEWrwl9L\n\t686ipmioHGMsLe/v83DVkMgxotkYsv4/3DMZkeaPaiVNAb+6NLPUS8t7ZzexfVMLeDgvrF\n\tNvBGb+T19LwQMFicpkEyH14a2IXRoXgwE=","References":"<20200724191851.803350-1-niklas.soderlund@ragnatech.se>\n\t<20200724191851.803350-4-niklas.soderlund@ragnatech.se>","From":"Umang Jain <email@uajain.com>","Message-ID":"<d56da70f-71ac-42af-f232-8a005e32f356@uajain.com>","Date":"Tue, 28 Jul 2020 16:07:56 +0000 (UTC)","Mime-Version":"1.0","In-Reply-To":"<20200724191851.803350-4-niklas.soderlund@ragnatech.se>","X-SG-EID":"1Q40EQ7YGir8a9gjSIAdTjhngY657NMk9ckeo4dbHZDiOpywc/L3L9rFqlwE4KPcHcG1g99dnq0SJ9KzJgHEPtTWbDIYjvMbp79AGqbMXFWrg2lVgCyvnUU7ThDdGbLTm02ZeWnI3qMFUpGxVs4ngi+L+FpAC5OUVL8RKMIB1CVubSJ938TOkSWVLILTo2JFFq6B5ssokL56v4mN6GE+VRIrTtyikofLNHj/XZttN3tOnQ2JC9mYsw008+1OvmtF/svAGxZGNjI0Z3+zuJuF2g==","To":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>,\n\tlibcamera-devel@lists.libcamera.org","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH v3 3/3] cam: Add optional argument to\n\t--capture to specify how many frames to capture","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>","Content-Transfer-Encoding":"quoted-printable","Content-Type":"text/plain; charset=\"iso-8859-1\"; Format=\"flowed\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":11677,"web_url":"https://patchwork.libcamera.org/comment/11677/","msgid":"<20200728171058.GA4100298@oden.dyn.berto.se>","date":"2020-07-28T17:10:58","subject":"Re: [libcamera-devel] [PATCH v3 3/3] cam: Add optional argument to\n\t--capture to specify how many frames to capture","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Umang,\n\nThanks for your comment.\n\nOn 2020-07-28 16:07:56 +0000, Umang Jain wrote:\n> Hi Niklas,\n> \n> Thanks for extending --capture to capture a certain no. of frames.\n> It super handy to use.\n> \n> Just want to let you know, it does not work if I use short-hand \"-C=10\".\n> However, cam -c 1 --capture=10 seems to work just fine.\n> \n> On $cam -c 1 -C=10 O get the following:\n> \n> [uajain@localhost libcamera]$ sudo ./build/src/cam/cam  -c 1 -C=10\n> Can't parse integer argument for option --capture\n> Options:\n> ...\n\nThat is because for optional arguments to short options the = character \nis dropped :-)\n\n    $ cam -c 1 -C10\n    Using camera Logitech Webcam C930e\n    Capture 10 frames\n    fps: 0.00 stream0 seq: 000000 bytesused: 49517\n    fps: 37.04 stream0 seq: 000001 bytesused: 50679\n    fps: 8.13 stream0 seq: 000002 bytesused: 49837\n    fps: 8.13 stream0 seq: 000003 bytesused: 50275\n    fps: 7.87 stream0 seq: 000004 bytesused: 50851\n    fps: 8.13 stream0 seq: 000005 bytesused: 51369\n    fps: 8.06 stream0 seq: 000006 bytesused: 50756\n    fps: 14.93 stream0 seq: 000007 bytesused: 51042\n    fps: 15.62 stream0 seq: 000008 bytesused: 52641\n    fps: 14.93 stream0 seq: 000009 bytesused: 51621\n\n> \n> On 7/25/20 12:48 AM, Niklas Söderlund wrote:\n> > Extend the '--capture' option with and optional numerical argument to be\n> > able to specify how many frames to capture before exiting. If the\n> > optional argument is not provided the old behavior of running until the\n> > user interrupts with a SIGINT is retained.\n> > \n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > * Changes since v2\n> > - Move check in Capture::requestComplete() as to not leak the created\n> >    but never used Request.\n> > * Changes since v1\n> > - Extend --capture option instead of adding a new --count option.\n> > ---\n> >   src/cam/capture.cpp | 18 ++++++++++++++++--\n> >   src/cam/capture.h   |  2 ++\n> >   src/cam/main.cpp    |  5 +++--\n> >   3 files changed, 21 insertions(+), 4 deletions(-)\n> > \n> > diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> > index f811a18c579508a1..3d8e89d52c7ab68d 100644\n> > --- a/src/cam/capture.cpp\n> > +++ b/src/cam/capture.cpp\n> > @@ -18,7 +18,8 @@ using namespace libcamera;\n> >   Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config,\n> >   \t\t EventLoop *loop)\n> > -\t: camera_(camera), config_(config), writer_(nullptr), loop_(loop)\n> > +\t: camera_(camera), config_(config), writer_(nullptr), loop_(loop),\n> > +\t  captureCount_(0), captureLimit_(0)\n> >   {\n> >   }\n> > @@ -26,6 +27,9 @@ int Capture::run(const OptionsParser::Options &options)\n> >   {\n> >   \tint ret;\n> > +\tcaptureCount_ = 0;\n> > +\tcaptureLimit_ = options[OptCapture].toInteger();\n> > +\n> >   \tif (!camera_) {\n> >   \t\tstd::cout << \"Can't capture without a camera\" << std::endl;\n> >   \t\treturn -ENODEV;\n> > @@ -132,7 +136,11 @@ int Capture::capture(FrameBufferAllocator *allocator)\n> >   \t\t}\n> >   \t}\n> > -\tstd::cout << \"Capture until user interrupts by SIGINT\" << std::endl;\n> > +\tif (captureLimit_)\n> > +\t\tstd::cout << \"Capture \" << captureLimit_ << \" frames\" << std::endl;\n> > +\telse\n> > +\t\tstd::cout << \"Capture until user interrupts by SIGINT\" << std::endl;\n> > +\n> >   \tret = loop_->exec();\n> >   \tif (ret)\n> >   \t\tstd::cout << \"Failed to run capture loop\" << std::endl;\n> > @@ -184,6 +192,12 @@ void Capture::requestComplete(Request *request)\n> >   \tstd::cout << info.str() << std::endl;\n> > +\tcaptureCount_++;\n> > +\tif (captureLimit_ && captureCount_ >= captureLimit_) {\n> > +\t\tloop_->exit(0);\n> > +\t\treturn;\n> > +\t}\n> > +\n> >   \t/*\n> >   \t * Create a new request and populate it with one buffer for each\n> >   \t * stream.\n> > diff --git a/src/cam/capture.h b/src/cam/capture.h\n> > index acdefc47b24314d2..32940a2a12138887 100644\n> > --- a/src/cam/capture.h\n> > +++ b/src/cam/capture.h\n> > @@ -41,6 +41,8 @@ private:\n> >   \tstd::chrono::steady_clock::time_point last_;\n> >   \tEventLoop *loop_;\n> > +\tunsigned int captureCount_;\n> > +\tunsigned int captureLimit_;\n> >   };\n> >   #endif /* __CAM_CAPTURE_H__ */\n> > diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> > index 3e83feabe64e036c..f5aba041d7c4c181 100644\n> > --- a/src/cam/main.cpp\n> > +++ b/src/cam/main.cpp\n> > @@ -167,8 +167,9 @@ int CamApp::parseOptions(int argc, char *argv[])\n> >   \tparser.addOption(OptCamera, OptionString,\n> >   \t\t\t \"Specify which camera to operate on, by name or by index\", \"camera\",\n> >   \t\t\t ArgumentRequired, \"camera\");\n> > -\tparser.addOption(OptCapture, OptionNone,\n> > -\t\t\t \"Capture until interrupted by user\", \"capture\");\n> > +\tparser.addOption(OptCapture, OptionInteger,\n> > +\t\t\t \"Capture until interrupted by user or until <count> frames captured\",\n> > +\t\t\t \"capture\", ArgumentOptional, \"count\");\n> >   \tparser.addOption(OptFile, OptionString,\n> >   \t\t\t \"Write captured frames to disk\\n\"\n> >   \t\t\t \"The first '#' character in the file name is expanded to the stream name and frame sequence number.\\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 7E06BBD878\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 28 Jul 2020 17:11:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 117DC61176;\n\tTue, 28 Jul 2020 19:11:03 +0200 (CEST)","from mail-lf1-x141.google.com (mail-lf1-x141.google.com\n\t[IPv6:2a00:1450:4864:20::141])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BA10760923\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Jul 2020 19:11:00 +0200 (CEST)","by mail-lf1-x141.google.com with SMTP id j22so5517235lfm.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Jul 2020 10:11:00 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tr13sm3070082ljg.101.2020.07.28.10.10.58\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 28 Jul 2020 10:10:58 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"E5Tw3BPO\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=H3Wos20oUzv8SeiicBkwzDi31nEEFz3WF+ADeEamWXg=;\n\tb=E5Tw3BPOKk1RpN2jbsq80aMflnjgrtKseYvrNpJT+71oDYPZEFap0eFqNasCoI7vM2\n\ttIs8Me3iVmdvfhO6+ySafQt/2zL7Fj01Cgpm/UV8Z5dsrwbwPzAMGr9f4mwP7vQn/5Ce\n\tNqEOWwJtzHBwepMnUgiIs/tv3q5bkrYAC6waN7Femt0p7pAJqX0Jf2qmyjV/Av9owylB\n\tYTNYdwOSFislpLJNBk1246Q+2Q+ipYT+CJwsjkMiQ3M7AKHWbAN6RvDyR/G5TVMd2/oG\n\tfSnSaVu8J3Ba7JK6W9SnAUOt01Do+HAFmwLENmiDMJ2D9lZzBhvHVCewlT6+VJUmbZUd\n\t03kw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=H3Wos20oUzv8SeiicBkwzDi31nEEFz3WF+ADeEamWXg=;\n\tb=HlTrFQ+GyXtl+VwwbQHmHTP13foW96SlNh/H5JYN2cZVyLF/ONJixda5QrkTFP4uX5\n\tN/q+y5JYs3C0G+BRvDRBsJaxTadRZSMLvIIgV3fDXZuQpskEYBAjCm2QQ0/uUBeJ5fUq\n\t6lK4mwh3MbP+NL13Gmpp417ziF3IvNTTTm53lBkf1bcox+zJoyO72q8xwleJ+NgymQiC\n\t7rqAn0lThByUGWWJAY1eWtPIHCAY6eCXqVplLgXhDxjdv4Vs3LkiQDKI655w1HKguS0B\n\tcAvqrgt0dpCYHKmYXta2UexWKoqrXOyFRe/YQg+OULem2BAEdeYVr6pXxT/Pv7XyB0TR\n\t7KLA==","X-Gm-Message-State":"AOAM530vGb/BDiXKlFIFioANeBWnsSa9aYGn4tD4EAruWg5fVreo05hH\n\traTscuUZ5th9KOmQg5YFgoleep1CQtA=","X-Google-Smtp-Source":"ABdhPJxAqTqa5Cv22nC2ZE8T8cgq3FeI8ltNvcHfT3xdUDRgpxiRvoCsN8ph6b5vRn3bN70kEAI5mQ==","X-Received":"by 2002:a05:6512:1047:: with SMTP id\n\tc7mr7364357lfb.11.1595956259583; \n\tTue, 28 Jul 2020 10:10:59 -0700 (PDT)","Date":"Tue, 28 Jul 2020 19:10:58 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Umang Jain <email@uajain.com>","Message-ID":"<20200728171058.GA4100298@oden.dyn.berto.se>","References":"<20200724191851.803350-1-niklas.soderlund@ragnatech.se>\n\t<20200724191851.803350-4-niklas.soderlund@ragnatech.se>\n\t<d56da70f-71ac-42af-f232-8a005e32f356@uajain.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<d56da70f-71ac-42af-f232-8a005e32f356@uajain.com>","Subject":"Re: [libcamera-devel] [PATCH v3 3/3] cam: Add optional argument to\n\t--capture to specify how many frames to capture","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","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]