summaryrefslogtreecommitdiff
path: root/src/cam
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-04-02 00:50:55 +0200
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-04-09 17:00:27 +0200
commitc1df18cab6a0575d13930f13a99296cf2160be7e (patch)
treefc699ff34a101ff6e90cae63bcab10b5013ac6f5 /src/cam
parente65e5d59f4c0ee90e4ccd5d76f6eac2ef1d6f421 (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>
Diffstat (limited to 'src/cam')
-rw-r--r--src/cam/main.cpp48
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) {