[libcamera-devel] [PATCH v4 4/5] cam: Extend request completion handler to deal with multiple streams

Niklas Söderlund niklas.soderlund at ragnatech.se
Mon Apr 8 15:50:05 CEST 2019


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 of which the
stream was passed to configureStream().

Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
 src/cam/main.cpp | 48 +++++++++++++++++++++++++++++++++++-------------
 1 file changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index ac4c7e78c597a2c5..337933d412451e20 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;
+		std::string name = streamInfo[stream];
 
-	if (writer)
-		writer->write(buffer, "stream0");
+		info << " " << name
+		     << " (" << buffer->index() << ")"
+		     << " seq: " << std::setw(6) << std::setfill('0') << buffer->sequence()
+		     << " bytesused: " << buffer->bytesused();
+
+		if (writer)
+			writer->write(buffer, name);
+	}
+
+	std::cout << info.str() << std::endl;
 
 	request = camera->createRequest();
 	if (!request) {
-- 
2.21.0



More information about the libcamera-devel mailing list