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:
parent
e65e5d59f4
commit
c1df18cab6
1 changed files with 35 additions and 13 deletions
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue