[{"id":1323,"web_url":"https://patchwork.libcamera.org/comment/1323/","msgid":"<20190409141310.GC4578@pendragon.ideasonboard.com>","date":"2019-04-09T14:13:10","subject":"Re: [libcamera-devel] [PATCH v4 4/5] cam: Extend request completion\n\thandler to deal with multiple streams","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nOn Mon, Apr 08, 2019 at 03:50:05PM +0200, Niklas Söderlund wrote:\n> The completion handler needs to handle all buffers in the request. Solve\n> this by iterating over all buffers in the completed request. The streams\n> are named automatically streamX, where X is the order of which the\n\ns/of which/in which/\n\n> stream was passed to configureStream().\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  src/cam/main.cpp | 48 +++++++++++++++++++++++++++++++++++-------------\n>  1 file changed, 35 insertions(+), 13 deletions(-)\n> \n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index ac4c7e78c597a2c5..337933d412451e20 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -11,6 +11,7 @@\n>  #include <limits.h>\n>  #include <map>\n>  #include <signal.h>\n> +#include <sstream>\n>  #include <string.h>\n>  \n>  #include <libcamera/libcamera.h>\n> @@ -23,6 +24,7 @@ using namespace libcamera;\n>  \n>  OptionsParser::Options options;\n>  std::shared_ptr<Camera> camera;\n> +std::map<Stream *, std::string> streamInfo;\n>  EventLoop *loop;\n>  BufferWriter *writer;\n>  \n> @@ -87,9 +89,12 @@ static int prepareCameraConfig(CameraConfiguration *config)\n>  {\n>  \tstd::vector<StreamUsage> roles;\n>  \n> +\tstreamInfo.clear();\n> +\n>  \t/* If no configuration is provided assume a single video stream. */\n>  \tif (!options.isSet(OptStream)) {\n>  \t\t*config = camera->streamConfiguration({ Stream::VideoRecording() });\n> +\t\tstreamInfo[config->front()] = \"stream0\";\n>  \t\treturn 0;\n>  \t}\n>  \n> @@ -142,31 +147,48 @@ static int prepareCameraConfig(CameraConfiguration *config)\n>  \t\t\t(*config)[stream].pixelFormat = conf[\"pixelformat\"];\n>  \t}\n>  \n> +\tunsigned int index = 0;\n> +\tfor (Stream *stream : *config) {\n> +\t\tstreamInfo[stream] = \"stream\" + std::to_string(index);\n> +\t\tindex++;\n> +\t}\n> +\n>  \treturn 0;\n>  }\n>  \n>  static void requestComplete(Request *request, const std::map<Stream *, Buffer *> &buffers)\n>  {\n> -\tstatic uint64_t last = 0;\n> +\tstatic uint64_t now, last = 0;\n> +\tdouble fps = 0.0;\n>  \n>  \tif (request->status() == Request::RequestCancelled)\n>  \t\treturn;\n>  \n> -\tBuffer *buffer = buffers.begin()->second;\n> +\tstruct timespec time;\n> +\tclock_gettime(CLOCK_MONOTONIC, &time);\n> +\tnow = time.tv_sec * 1000 + time.tv_nsec / 1000000;\n> +\tfps = now - last;\n> +\tfps = last && fps ? 1000.0 / fps : 0.0;\n> +\tlast = now;\n>  \n> -\tdouble fps = buffer->timestamp() - last;\n> -\tfps = last && fps ? 1000000000.0 / fps : 0.0;\n> -\tlast = buffer->timestamp();\n> +\tstd::stringstream info;\n> +\tinfo << \"fps: \" << std::fixed << std::setprecision(2) << fps;\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> -\t\t  << std::endl;\n> +\tfor (auto it = buffers.begin(); it != buffers.end(); ++it) {\n> +\t\tStream *stream = it->first;\n> +\t\tBuffer *buffer = it->second;\n> +\t\tstd::string name = streamInfo[stream];\n\nconst std::string &name\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \n> -\tif (writer)\n> -\t\twriter->write(buffer, \"stream0\");\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> +\t\tif (writer)\n> +\t\t\twriter->write(buffer, name);\n> +\t}\n> +\n> +\tstd::cout << info.str() << std::endl;\n>  \n>  \trequest = camera->createRequest();\n>  \tif (!request) {","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D8C0860DB4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  9 Apr 2019 16:13:20 +0200 (CEST)","from pendragon.ideasonboard.com (unknown\n\t[IPv6:2a02:2788:66a:3eb:e14:8605:25ce:b577])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5503933A;\n\tTue,  9 Apr 2019 16:13:20 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1554819200;\n\tbh=GoucfC4I8CHRQjaMg5wiPhLF6WK/CKPwiwC1FjeTPAQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=OwneKdvaAFl4kX6OEAhTU5kOjmYpW53+Fus+rcmC3An/Gzq9niuS953fiQltRVZK2\n\tqBcEjHZWiodBhqqSvHwJSG/yh928OBL+tHsEO8bm7G/I6sO8YflK9RqiXECjU9W84a\n\tq5hWxiPOaIMOoMYVea5CX8gqppEApqG0gUeQhP9I=","Date":"Tue, 9 Apr 2019 17:13:10 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190409141310.GC4578@pendragon.ideasonboard.com>","References":"<20190408135006.15423-1-niklas.soderlund@ragnatech.se>\n\t<20190408135006.15423-5-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190408135006.15423-5-niklas.soderlund@ragnatech.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v4 4/5] cam: Extend request completion\n\thandler to deal with multiple streams","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Tue, 09 Apr 2019 14:13:21 -0000"}}]