diff options
author | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-04-02 00:50:55 +0200 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-04-09 17:00:27 +0200 |
commit | c1df18cab6a0575d13930f13a99296cf2160be7e (patch) | |
tree | fc699ff34a101ff6e90cae63bcab10b5013ac6f5 | |
parent | e65e5d59f4c0ee90e4ccd5d76f6eac2ef1d6f421 (diff) |
cam: Extend request completion handler to deal with multiple streams
The completion handler needs to handle all buffers in the request. Solve
this by iterating over all buffers in the completed request. The streams
are named automatically streamX, where X is the order in which the
stream was passed to configureStream().
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r-- | src/cam/main.cpp | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/src/cam/main.cpp b/src/cam/main.cpp index ac4c7e78..f5c0b071 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -11,6 +11,7 @@ #include <limits.h> #include <map> #include <signal.h> +#include <sstream> #include <string.h> #include <libcamera/libcamera.h> @@ -23,6 +24,7 @@ using namespace libcamera; OptionsParser::Options options; std::shared_ptr<Camera> camera; +std::map<Stream *, std::string> streamInfo; EventLoop *loop; BufferWriter *writer; @@ -87,9 +89,12 @@ static int prepareCameraConfig(CameraConfiguration *config) { std::vector<StreamUsage> roles; + streamInfo.clear(); + /* If no configuration is provided assume a single video stream. */ if (!options.isSet(OptStream)) { *config = camera->streamConfiguration({ Stream::VideoRecording() }); + streamInfo[config->front()] = "stream0"; return 0; } @@ -142,31 +147,48 @@ static int prepareCameraConfig(CameraConfiguration *config) (*config)[stream].pixelFormat = conf["pixelformat"]; } + unsigned int index = 0; + for (Stream *stream : *config) { + streamInfo[stream] = "stream" + std::to_string(index); + index++; + } + return 0; } static void requestComplete(Request *request, const std::map<Stream *, Buffer *> &buffers) { - static uint64_t last = 0; + static uint64_t now, last = 0; + double fps = 0.0; if (request->status() == Request::RequestCancelled) return; - Buffer *buffer = buffers.begin()->second; + struct timespec time; + clock_gettime(CLOCK_MONOTONIC, &time); + now = time.tv_sec * 1000 + time.tv_nsec / 1000000; + fps = now - last; + fps = last && fps ? 1000.0 / fps : 0.0; + last = now; - double fps = buffer->timestamp() - last; - fps = last && fps ? 1000000000.0 / fps : 0.0; - last = buffer->timestamp(); + std::stringstream info; + info << "fps: " << std::fixed << std::setprecision(2) << fps; - std::cout << "seq: " << std::setw(6) << std::setfill('0') << buffer->sequence() - << " buf: " << buffer->index() - << " bytesused: " << buffer->bytesused() - << " timestamp: " << buffer->timestamp() - << " fps: " << std::fixed << std::setprecision(2) << fps - << std::endl; + for (auto it = buffers.begin(); it != buffers.end(); ++it) { + Stream *stream = it->first; + Buffer *buffer = it->second; + const std::string &name = streamInfo[stream]; + + info << " " << name + << " (" << buffer->index() << ")" + << " seq: " << std::setw(6) << std::setfill('0') << buffer->sequence() + << " bytesused: " << buffer->bytesused(); + + if (writer) + writer->write(buffer, name); + } - if (writer) - writer->write(buffer, "stream0"); + std::cout << info.str() << std::endl; request = camera->createRequest(); if (!request) { |