[{"id":11554,"web_url":"https://patchwork.libcamera.org/comment/11554/","msgid":"<89d56a80-ad8f-8f7f-41f6-5f1163e56568@linaro.org>","date":"2020-07-24T13:58:42","subject":"Re: [libcamera-devel] [PATCH 3/3] cam: Add option to exit capture\n\tloop after n frames","submitter":{"id":25,"url":"https://patchwork.libcamera.org/api/people/25/","name":"Andrey Konovalov","email":"andrey.konovalov@linaro.org"},"content":"Hi Niklas,\n\nThis is a very nice addition to cam!\n\nJust could it be easier to add a numerical argument to the \"capture\" option ('cam -C <N>' - similar\nto how yavta works) rather creating a new option?\n\nThanks,\nAndrey\n\nOn 24.07.2020 16:43, Niklas Söderlund wrote:\n> Add an option '--count' to specify how many frames to capture before\n> terminating the capture loop.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>   src/cam/capture.cpp | 17 +++++++++++++++--\n>   src/cam/capture.h   |  2 ++\n>   src/cam/main.cpp    |  2 ++\n>   src/cam/main.h      |  1 +\n>   4 files changed, 20 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> index aa53c407d7b71b44..3ca70d9c6a8c7b7e 100644\n> --- a/src/cam/capture.cpp\n> +++ b/src/cam/capture.cpp\n> @@ -17,7 +17,8 @@\n>   using namespace libcamera;\n>   \n>   Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config)\n> -\t: camera_(camera), config_(config), writer_(nullptr), loop_(nullptr)\n> +\t: camera_(camera), config_(config), writer_(nullptr), loop_(nullptr),\n> +\t  captureCount_(0), captureLimit_(0)\n>   {\n>   }\n>   \n> @@ -26,6 +27,8 @@ int Capture::run(EventLoop *loop, const OptionsParser::Options &options)\n>   \tint ret;\n>   \n>   \tloop_ = loop;\n> +\tcaptureCount_ = 0;\n> +\tcaptureLimit_ = options.isSet(OptCount) ? options[OptCount].toInteger() : 0;\n>   \n>   \tif (!camera_) {\n>   \t\tstd::cout << \"Can't capture without a camera\" << std::endl;\n> @@ -133,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> @@ -202,5 +209,11 @@ void Capture::requestComplete(Request *request)\n>   \t\trequest->addBuffer(stream, buffer);\n>   \t}\n>   \n> +\tcaptureCount_++;\n> +\tif (captureLimit_ && captureCount_ >= captureLimit_) {\n> +\t\tloop_->exit(0);\n> +\t\treturn;\n> +\t}\n> +\n>   \tcamera_->queueRequest(request);\n>   }\n> diff --git a/src/cam/capture.h b/src/cam/capture.h\n> index 67c6260bfe24aefc..0a1cbc519f2a90c5 100644\n> --- a/src/cam/capture.h\n> +++ b/src/cam/capture.h\n> @@ -40,6 +40,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 a223563ad37e9fe5..f3bacb4a895600ee 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -188,6 +188,8 @@ int CamApp::parseOptions(int argc, char *argv[])\n>   \tparser.addOption(OptStrictFormats, OptionNone,\n>   \t\t\t \"Do not allow requested stream format(s) to be adjusted\",\n>   \t\t\t \"strict-formats\");\n> +\tparser.addOption(OptCount, OptionInteger, \"Number of frames to capture\",\n> +\t\t\t \"count\", ArgumentRequired, \"count\");\n>   \n>   \toptions_ = parser.parse(argc, argv);\n>   \tif (!options_.valid())\n> diff --git a/src/cam/main.h b/src/cam/main.h\n> index 6f95add31a6341cf..d4c93fee35681e86 100644\n> --- a/src/cam/main.h\n> +++ b/src/cam/main.h\n> @@ -18,6 +18,7 @@ enum {\n>   \tOptStream = 's',\n>   \tOptListControls = 256,\n>   \tOptStrictFormats = 257,\n> +\tOptCount = 258,\n>   };\n>   \n>   #endif /* __CAM_MAIN_H__ */\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 25C2ABD878\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2020 13:58:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E5151611B0;\n\tFri, 24 Jul 2020 15:58:47 +0200 (CEST)","from mail-lf1-x142.google.com (mail-lf1-x142.google.com\n\t[IPv6:2a00:1450:4864:20::142])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4975960535\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2020 15:58:46 +0200 (CEST)","by mail-lf1-x142.google.com with SMTP id i19so5231936lfj.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2020 06:58:46 -0700 (PDT)","from [192.168.118.216] (37-144-159-139.broadband.corbina.ru.\n\t[37.144.159.139]) by smtp.gmail.com with ESMTPSA id\n\tt4sm269371ljg.11.2020.07.24.06.58.44\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tFri, 24 Jul 2020 06:58:44 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"ZLpVpHWq\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;\n\th=subject:to:references:from:message-id:date:user-agent:mime-version\n\t:in-reply-to:content-language:content-transfer-encoding;\n\tbh=ChFWUBBdayQikwkAtA71GzYTVEzhoYPiKG70uyxtYAU=;\n\tb=ZLpVpHWquYdqyH12y5ax5VoukIgTWzsUFeK8cxOmnpCpOjKwG6tMgDqeDjp7T0GjV1\n\tjkOVulxTHy+2Inx2kirOppdpCEAVctNQu5T2MDlDdWdzFgbrHAXqcBzDfuh7KS6/0Cto\n\tudVAIupmX3yd7EnM6CDUrwxJQRVTli1XR/8KuyGmgCaMdNw90NcMX1gK0jfYucOvZzgn\n\t4TI7bMCH0ORK6SkkYk0PEGQPkDbM+SkqmknP92ElkPynayxFH6gilwIh3kWLcYfxPe+T\n\trWX/cBqY2RmsWeW2YrAPgiHmjDJjjIL0d70PbyzxCIrW/jjRs4a7i2sGWvTtkQQJU9Az\n\tXTXg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:to:references:from:message-id:date\n\t:user-agent:mime-version:in-reply-to:content-language\n\t:content-transfer-encoding;\n\tbh=ChFWUBBdayQikwkAtA71GzYTVEzhoYPiKG70uyxtYAU=;\n\tb=nopURRb03qSUSETdowyD0V5+3HwI2J1oUWAgfpI0FXtlfcB5AdAUGgiF4Ek+tJHuLh\n\teAPmINpmbkZJPWJL8RkBOlX491Rz27gjlRf0cU+RaF/vr0Uv9MkYo8TIYQwMMhVJKagx\n\ttsMf8QMBxHaUHvP6tjN2ImwTlN0nTR7YkBwGZeZymmqjlrDt67aZ4NzRPATkBaUtnyWN\n\tsl/HwKWvXN0SyDpPwyIo+mShHtFPJFvBF4BOWpdgumVl2hzr7flyVvRBNO1gC2M0XMvd\n\tmnboTsy+ofOdxhA92wm5JaEc+QgynbZRCWtzErQI3lsbkhgJnatd5KAIOAih20cPvNGu\n\tHCDg==","X-Gm-Message-State":"AOAM5322+M4EuJke9PFC2j5Ncun5Sh3SQ6kOfW77r2Uc+6BRA7gUIqEY\n\td0aJ4D9DUTROLOpkCF5YLMpNOA==","X-Google-Smtp-Source":"ABdhPJyXcMu+FLnlpcRdhKCP4lxmw1ew9V3CwM279oTHuTEhAvyRFPSTpxgvYGx/GAe3iJQeDwLgFQ==","X-Received":"by 2002:a19:a07:: with SMTP id 7mr5114846lfk.65.1595599125549;\n\tFri, 24 Jul 2020 06:58:45 -0700 (PDT)","To":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20200724134320.637696-1-niklas.soderlund@ragnatech.se>\n\t<20200724134320.637696-4-niklas.soderlund@ragnatech.se>","From":"Andrey Konovalov <andrey.konovalov@linaro.org>","Message-ID":"<89d56a80-ad8f-8f7f-41f6-5f1163e56568@linaro.org>","Date":"Fri, 24 Jul 2020 16:58:42 +0300","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":"<20200724134320.637696-4-niklas.soderlund@ragnatech.se>","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH 3/3] cam: Add option to exit capture\n\tloop after n frames","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":"base64","Content-Type":"text/plain; charset=\"utf-8\"; Format=\"flowed\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":11555,"web_url":"https://patchwork.libcamera.org/comment/11555/","msgid":"<6e4934ba-00cf-95e3-2de8-380c2bbc8d27@ideasonboard.com>","date":"2020-07-24T14:06:12","subject":"Re: [libcamera-devel] [PATCH 3/3] cam: Add option to exit capture\n\tloop after n frames","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Niklas,\n\nAndrey beat me to the option value point, but still a Q below:\n\n\nOn 24/07/2020 14:43, Niklas Söderlund wrote:\n> Add an option '--count' to specify how many frames to capture before\n> terminating the capture loop.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n<edit, actually there isn't anything but minors here, so addressed how\nyou feel best:>\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n> ---\n>  src/cam/capture.cpp | 17 +++++++++++++++--\n>  src/cam/capture.h   |  2 ++\n>  src/cam/main.cpp    |  2 ++\n>  src/cam/main.h      |  1 +\n>  4 files changed, 20 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> index aa53c407d7b71b44..3ca70d9c6a8c7b7e 100644\n> --- a/src/cam/capture.cpp\n> +++ b/src/cam/capture.cpp\n> @@ -17,7 +17,8 @@\n>  using namespace libcamera;\n>  \n>  Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config)\n> -\t: camera_(camera), config_(config), writer_(nullptr), loop_(nullptr)\n> +\t: camera_(camera), config_(config), writer_(nullptr), loop_(nullptr),\n> +\t  captureCount_(0), captureLimit_(0)\n>  {\n>  }\n>  \n> @@ -26,6 +27,8 @@ int Capture::run(EventLoop *loop, const OptionsParser::Options &options)\n>  \tint ret;\n>  \n>  \tloop_ = loop;\n> +\tcaptureCount_ = 0;\n> +\tcaptureLimit_ = options.isSet(OptCount) ? options[OptCount].toInteger() : 0;\n\nThis prevents setting a limit of 0. I don't know if that's useful,\nexcept for testing stream_on, followed by immediate stream_off ...\n\nActually that wouldn't work anyway, as the check would only happen in\nrequest complete, so we know it's always going to do at least one capture...\n\n\n\n>  \tif (!camera_) {\n>  \t\tstd::cout << \"Can't capture without a camera\" << std::endl;\n> @@ -133,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> @@ -202,5 +209,11 @@ void Capture::requestComplete(Request *request)\n>  \t\trequest->addBuffer(stream, buffer);\n>  \t}\n>  \n> +\tcaptureCount_++;\n> +\tif (captureLimit_ && captureCount_ >= captureLimit_) {\n> +\t\tloop_->exit(0);\n> +\t\treturn;\n> +\t}\n> +\n>  \tcamera_->queueRequest(request);\n>  }\n> diff --git a/src/cam/capture.h b/src/cam/capture.h\n> index 67c6260bfe24aefc..0a1cbc519f2a90c5 100644\n> --- a/src/cam/capture.h\n> +++ b/src/cam/capture.h\n> @@ -40,6 +40,8 @@ private:\n>  \tstd::chrono::steady_clock::time_point last_;\n>  \n>  \tEventLoop *loop_;\n> +\tunsigned int captureCount_;\n> +\tunsigned int captureLimit_;\n\nAs these are already in the capture class, I guess they could just be\ncount, and limit ... but that's just some bikeshed colour ...\n\n\n>  };\n>  \n>  #endif /* __CAM_CAPTURE_H__ */\n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index a223563ad37e9fe5..f3bacb4a895600ee 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -188,6 +188,8 @@ int CamApp::parseOptions(int argc, char *argv[])\n>  \tparser.addOption(OptStrictFormats, OptionNone,\n>  \t\t\t \"Do not allow requested stream format(s) to be adjusted\",\n>  \t\t\t \"strict-formats\");\n> +\tparser.addOption(OptCount, OptionInteger, \"Number of frames to capture\",\n> +\t\t\t \"count\", ArgumentRequired, \"count\");\n\n\nWould reusing the capture option simplify the args?\n\n>  \n>  \toptions_ = parser.parse(argc, argv);\n>  \tif (!options_.valid())\n> diff --git a/src/cam/main.h b/src/cam/main.h\n> index 6f95add31a6341cf..d4c93fee35681e86 100644\n> --- a/src/cam/main.h\n> +++ b/src/cam/main.h\n> @@ -18,6 +18,7 @@ enum {\n>  \tOptStream = 's',\n>  \tOptListControls = 256,\n>  \tOptStrictFormats = 257,\n> +\tOptCount = 258,\n>  };\n>  \n>  #endif /* __CAM_MAIN_H__ */\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 507F4BD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2020 14:06:18 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D1F13611B0;\n\tFri, 24 Jul 2020 16:06:17 +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 B823C60535\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2020 16:06:15 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 3468D538;\n\tFri, 24 Jul 2020 16:06:15 +0200 (CEST)"],"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=\"PHlvBpXk\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1595599575;\n\tbh=K4pvv8WN2NY/nE+HLY5vV4aHcDei1I/QFWumgkri11U=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=PHlvBpXk/vyMCUc3v1hJmAkmn8BOhjZSxZ82mjOge5tlA7ZVPvjGdWf0ncwe6wl9V\n\tvWrXDgyv9nO+EkpAaqS9eU25RKkGcX+C1K4iRMX8YJYehs4Xkr8/Z9m6NLeSrRJsZ0\n\tgMOz9Megjg6o9kmW9fR8oOFVmOeeBlu5ZX3EoucU=","To":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20200724134320.637696-1-niklas.soderlund@ragnatech.se>\n\t<20200724134320.637696-4-niklas.soderlund@ragnatech.se>","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":"<6e4934ba-00cf-95e3-2de8-380c2bbc8d27@ideasonboard.com>","Date":"Fri, 24 Jul 2020 15:06:12 +0100","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":"<20200724134320.637696-4-niklas.soderlund@ragnatech.se>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH 3/3] cam: Add option to exit capture\n\tloop after n frames","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","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":11580,"web_url":"https://patchwork.libcamera.org/comment/11580/","msgid":"<20200724172557.GB2729799@oden.dyn.berto.se>","date":"2020-07-24T17:25:57","subject":"Re: [libcamera-devel] [PATCH 3/3] cam: Add option to exit capture\n\tloop after n frames","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Andrey and Kieran,\n\nOn 2020-07-24 16:58:42 +0300, Andrey Konovalov wrote:\n> Hi Niklas,\n> \n> This is a very nice addition to cam!\n> \n> Just could it be easier to add a numerical argument to the \"capture\" option ('cam -C <N>' - similar\n> to how yavta works) rather creating a new option?\n\nThis is a great suggestion pointed out by you and Kieran and I will do \nso for v2.\n\n> \n> Thanks,\n> Andrey\n> \n> On 24.07.2020 16:43, Niklas Söderlund wrote:\n> > Add an option '--count' to specify how many frames to capture before\n> > terminating the capture loop.\n> > \n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >   src/cam/capture.cpp | 17 +++++++++++++++--\n> >   src/cam/capture.h   |  2 ++\n> >   src/cam/main.cpp    |  2 ++\n> >   src/cam/main.h      |  1 +\n> >   4 files changed, 20 insertions(+), 2 deletions(-)\n> > \n> > diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\n> > index aa53c407d7b71b44..3ca70d9c6a8c7b7e 100644\n> > --- a/src/cam/capture.cpp\n> > +++ b/src/cam/capture.cpp\n> > @@ -17,7 +17,8 @@\n> >   using namespace libcamera;\n> >   Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config)\n> > -\t: camera_(camera), config_(config), writer_(nullptr), loop_(nullptr)\n> > +\t: camera_(camera), config_(config), writer_(nullptr), loop_(nullptr),\n> > +\t  captureCount_(0), captureLimit_(0)\n> >   {\n> >   }\n> > @@ -26,6 +27,8 @@ int Capture::run(EventLoop *loop, const OptionsParser::Options &options)\n> >   \tint ret;\n> >   \tloop_ = loop;\n> > +\tcaptureCount_ = 0;\n> > +\tcaptureLimit_ = options.isSet(OptCount) ? options[OptCount].toInteger() : 0;\n> >   \tif (!camera_) {\n> >   \t\tstd::cout << \"Can't capture without a camera\" << std::endl;\n> > @@ -133,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> > @@ -202,5 +209,11 @@ void Capture::requestComplete(Request *request)\n> >   \t\trequest->addBuffer(stream, buffer);\n> >   \t}\n> > +\tcaptureCount_++;\n> > +\tif (captureLimit_ && captureCount_ >= captureLimit_) {\n> > +\t\tloop_->exit(0);\n> > +\t\treturn;\n> > +\t}\n> > +\n> >   \tcamera_->queueRequest(request);\n> >   }\n> > diff --git a/src/cam/capture.h b/src/cam/capture.h\n> > index 67c6260bfe24aefc..0a1cbc519f2a90c5 100644\n> > --- a/src/cam/capture.h\n> > +++ b/src/cam/capture.h\n> > @@ -40,6 +40,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 a223563ad37e9fe5..f3bacb4a895600ee 100644\n> > --- a/src/cam/main.cpp\n> > +++ b/src/cam/main.cpp\n> > @@ -188,6 +188,8 @@ int CamApp::parseOptions(int argc, char *argv[])\n> >   \tparser.addOption(OptStrictFormats, OptionNone,\n> >   \t\t\t \"Do not allow requested stream format(s) to be adjusted\",\n> >   \t\t\t \"strict-formats\");\n> > +\tparser.addOption(OptCount, OptionInteger, \"Number of frames to capture\",\n> > +\t\t\t \"count\", ArgumentRequired, \"count\");\n> >   \toptions_ = parser.parse(argc, argv);\n> >   \tif (!options_.valid())\n> > diff --git a/src/cam/main.h b/src/cam/main.h\n> > index 6f95add31a6341cf..d4c93fee35681e86 100644\n> > --- a/src/cam/main.h\n> > +++ b/src/cam/main.h\n> > @@ -18,6 +18,7 @@ enum {\n> >   \tOptStream = 's',\n> >   \tOptListControls = 256,\n> >   \tOptStrictFormats = 257,\n> > +\tOptCount = 258,\n> >   };\n> >   #endif /* __CAM_MAIN_H__ */\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 C9606BD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2020 17:26:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9925C61236;\n\tFri, 24 Jul 2020 19:26:00 +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 A9AD66039B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2020 19:25:59 +0200 (CEST)","by mail-lf1-x141.google.com with SMTP id i19so5586546lfj.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2020 10:25:59 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tv8sm375032ljj.61.2020.07.24.10.25.58\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 24 Jul 2020 10:25: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=\"eZ1Dm3Mb\"; 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=xvLIPtZ/XKxtns1P/wwfg1fe4sKm87DRTWRdJbXcXr0=;\n\tb=eZ1Dm3MbmudvqBUx2htRWwU2bX7AzQYj0XHgYNAk57mOH9+ySgJmrM2G/oJxrllFNf\n\t+o2PI2kCROCQzewTMRJ3iK6sPTpt25cSC4IylaBr8FOUvVx4WQ1mArlmHx9npTQxvxBG\n\t7WUzkZ/iD83M8F5rGm4vKZrgVotm5eAORjJLsnX52IvNvyg914vYTPzSwgZtn9jyh3nU\n\tLxBQnOJIRNQbXoRROM/ASxQpHM2pxG7FCDF0Yf5/7INQYx3/C2Ta6Sh08MWVnLN/9Emu\n\tuAQd5BQY9F0b35hD+eMdYL+qIfWvzq4NU+BiLOAmYfInHBZavCw5g29tOXsJdo/gGFs5\n\tQ9ZA==","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=xvLIPtZ/XKxtns1P/wwfg1fe4sKm87DRTWRdJbXcXr0=;\n\tb=C7l3/KIiq3HUOM39kZMk/Die5hh7DAhxm9k9TnqgDyd3eiwuXpfuwH/qyceP/8FDUo\n\tOXhShcFYXvAu1oby2euvILJ3rS+DXYrGuzh5fU2l+f73ldgZedGKbvD0GSL6dca4Yi64\n\tyop7xwtzAP8GWg201kVwWI8FUQ/MHTs3R1xJnP1dGQ+CXO2WZDEbutxUNmSqKQF2MPwf\n\tinUZl22tXJz2dqdwE9uWpOE0n2cOg4aN7cb9XgS7uhMz2oNq61n72+cW+oJmgxeZS/Uc\n\tsp7lfL11I0xUByQrpmvQuSpKYstsAl9E4QAqN7p99fivM/Z+9P0l6j5n88nIvLFUXvmT\n\t6HOA==","X-Gm-Message-State":"AOAM531csgJm63vrvdpL4Q+2IE1rRr7cn1H4JXoAgGCHOHODKS8df3bd\n\tRaJH8qrmXsQQKq/Eee+UsUX4jQ==","X-Google-Smtp-Source":"ABdhPJz06fPSkRBG9NQq7d7TdXTIxVwNL5eSDLEI7KXFf3mWuLmJtKjTvDNE5Sk1sjk941VVj7/WjA==","X-Received":"by 2002:a05:6512:36cf:: with SMTP id\n\te15mr5583633lfs.149.1595611558761; \n\tFri, 24 Jul 2020 10:25:58 -0700 (PDT)","Date":"Fri, 24 Jul 2020 19:25:57 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Andrey Konovalov <andrey.konovalov@linaro.org>","Message-ID":"<20200724172557.GB2729799@oden.dyn.berto.se>","References":"<20200724134320.637696-1-niklas.soderlund@ragnatech.se>\n\t<20200724134320.637696-4-niklas.soderlund@ragnatech.se>\n\t<89d56a80-ad8f-8f7f-41f6-5f1163e56568@linaro.org>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<89d56a80-ad8f-8f7f-41f6-5f1163e56568@linaro.org>","Subject":"Re: [libcamera-devel] [PATCH 3/3] cam: Add option to exit capture\n\tloop after n frames","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>"}}]