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>
This commit is contained in:
@@ -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];
|
||||
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user