libcamera/test/camera/capture.cpp
Niklas Söderlund d9a468aaac test: camera: Increase runtime for capture test
Upstream commit 2978a505aaa981b2 ("media: vimc: stream: fix thread state
before sleep") changes the frame rate when capturing from the vimc raw
capture video nodes. The commit changes the frame rate from thousands of
frames per second to to roughly fifty.

The libcamera capture test was written with the assumption that vimc
would keep providing this fast frame rate and ran for a very short time
to decrease the overall run time of tests. This is no longer possible
and the test fails as it can't capture enough frames in its runtime,
increase the runtime to match the new vimc frame rate.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2019-06-11 15:56:36 +02:00

152 lines
3.3 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* libcamera Camera API tests
*/
#include <iostream>
#include "camera_test.h"
using namespace std;
namespace {
class Capture : public CameraTest
{
protected:
unsigned int completeBuffersCount_;
unsigned int completeRequestsCount_;
void bufferComplete(Request *request, Buffer *buffer)
{
if (buffer->status() != Buffer::BufferSuccess)
return;
completeBuffersCount_++;
}
void requestComplete(Request *request, const std::map<Stream *, Buffer *> &buffers)
{
if (request->status() != Request::RequestComplete)
return;
completeRequestsCount_++;
/* Reuse the buffers for a new request. */
request = camera_->createRequest();
request->setBuffers(buffers);
camera_->queueRequest(request);
}
int init() override
{
int ret = CameraTest::init();
if (ret)
return ret;
config_ = camera_->generateConfiguration({ StreamRole::VideoRecording });
if (!config_ || config_->size() != 1) {
cout << "Failed to generate default configuration" << endl;
CameraTest::cleanup();
return TestFail;
}
return TestPass;
}
int run() override
{
StreamConfiguration &cfg = config_->at(0);
if (camera_->acquire()) {
cout << "Failed to acquire the camera" << endl;
return TestFail;
}
if (camera_->configure(config_.get())) {
cout << "Failed to set default configuration" << endl;
return TestFail;
}
if (camera_->allocateBuffers()) {
cout << "Failed to allocate buffers" << endl;
return TestFail;
}
Stream *stream = cfg.stream();
BufferPool &pool = stream->bufferPool();
std::vector<Request *> requests;
for (Buffer &buffer : pool.buffers()) {
Request *request = camera_->createRequest();
if (!request) {
cout << "Failed to create request" << endl;
return TestFail;
}
std::map<Stream *, Buffer *> map = { { stream, &buffer } };
if (request->setBuffers(map)) {
cout << "Failed to associating buffer with request" << endl;
return TestFail;
}
requests.push_back(request);
}
completeRequestsCount_ = 0;
completeBuffersCount_ = 0;
camera_->bufferCompleted.connect(this, &Capture::bufferComplete);
camera_->requestCompleted.connect(this, &Capture::requestComplete);
if (camera_->start()) {
cout << "Failed to start camera" << endl;
return TestFail;
}
for (Request *request : requests) {
if (camera_->queueRequest(request)) {
cout << "Failed to queue request" << endl;
return TestFail;
}
}
EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();
Timer timer;
timer.start(1000);
while (timer.isRunning())
dispatcher->processEvents();
if (completeRequestsCount_ <= cfg.bufferCount * 2) {
cout << "Failed to capture enough frames (got "
<< completeRequestsCount_ << " expected at least "
<< cfg.bufferCount * 2 << ")" << endl;
return TestFail;
}
if (completeRequestsCount_ != completeBuffersCount_) {
cout << "Number of completed buffers and requests differ" << endl;
return TestFail;
}
if (camera_->stop()) {
cout << "Failed to stop camera" << endl;
return TestFail;
}
if (camera_->freeBuffers()) {
cout << "Failed to free buffers" << endl;
return TestFail;
}
return TestPass;
}
std::unique_ptr<CameraConfiguration> config_;
};
} /* namespace */
TEST_REGISTER(Capture);