libcamera: camera: Return a pointer from generateConfiguration()

To prepare for specialising the CameraConfiguration class in pipeline
handlers, return a pointer to a camera configuration instead of a
reference from Camera::generateConfiguration(). The camera configuration
always needs to be allocated from the pipeline handler, and its
ownership is passed to the application.

For symmetry, change Camera::configure() to take a CameraConfiguration
pointer instead of a reference. This aligns with our coding practice of
passing parameters that are modified by the callee by pointer.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2019-04-29 20:58:34 +03:00
parent 77ae64eb24
commit 75de3bff9e
15 changed files with 184 additions and 126 deletions

View file

@ -77,8 +77,8 @@ public:
int release(); int release();
const std::set<Stream *> &streams() const; const std::set<Stream *> &streams() const;
CameraConfiguration generateConfiguration(const StreamRoles &roles); std::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles);
int configure(CameraConfiguration &config); int configure(CameraConfiguration *config);
int allocateBuffers(); int allocateBuffers();
int freeBuffers(); int freeBuffers();

View file

@ -85,15 +85,13 @@ static int parseOptions(int argc, char *argv[])
return 0; return 0;
} }
static int prepareCameraConfig(CameraConfiguration *config) static std::unique_ptr<CameraConfiguration> prepareCameraConfig()
{ {
StreamRoles roles; StreamRoles roles;
/* If no configuration is provided assume a single video stream. */ /* If no configuration is provided assume a single video stream. */
if (!options.isSet(OptStream)) { if (!options.isSet(OptStream))
*config = camera->generateConfiguration({ StreamRole::VideoRecording }); return camera->generateConfiguration({ StreamRole::VideoRecording });
return 0;
}
const std::vector<OptionValue> &streamOptions = const std::vector<OptionValue> &streamOptions =
options[OptStream].toArray(); options[OptStream].toArray();
@ -113,23 +111,22 @@ static int prepareCameraConfig(CameraConfiguration *config)
} else { } else {
std::cerr << "Unknown stream role " std::cerr << "Unknown stream role "
<< conf["role"].toString() << std::endl; << conf["role"].toString() << std::endl;
return -EINVAL; return nullptr;
} }
} }
*config = camera->generateConfiguration(roles); std::unique_ptr<CameraConfiguration> config = camera->generateConfiguration(roles);
if (!config || !config->isValid()) {
if (!config->isValid()) {
std::cerr << "Failed to get default stream configuration" std::cerr << "Failed to get default stream configuration"
<< std::endl; << std::endl;
return -EINVAL; return nullptr;
} }
/* Apply configuration explicitly requested. */ /* Apply configuration explicitly requested. */
unsigned int i = 0; unsigned int i = 0;
for (auto const &value : streamOptions) { for (auto const &value : streamOptions) {
KeyValueParser::Options conf = value.toKeyValues(); KeyValueParser::Options conf = value.toKeyValues();
StreamConfiguration &cfg = (*config)[i++]; StreamConfiguration &cfg = config->at(i++);
if (conf.isSet("width")) if (conf.isSet("width"))
cfg.size.width = conf["width"]; cfg.size.width = conf["width"];
@ -142,7 +139,7 @@ static int prepareCameraConfig(CameraConfiguration *config)
cfg.pixelFormat = conf["pixelformat"]; cfg.pixelFormat = conf["pixelformat"];
} }
return 0; return config;
} }
static void requestComplete(Request *request, const std::map<Stream *, Buffer *> &buffers) static void requestComplete(Request *request, const std::map<Stream *, Buffer *> &buffers)
@ -191,16 +188,15 @@ static void requestComplete(Request *request, const std::map<Stream *, Buffer *>
static int capture() static int capture()
{ {
CameraConfiguration config;
int ret; int ret;
ret = prepareCameraConfig(&config); std::unique_ptr<CameraConfiguration> config = prepareCameraConfig();
if (ret) { if (!config) {
std::cout << "Failed to prepare camera configuration" << std::endl; std::cout << "Failed to prepare camera configuration" << std::endl;
return ret; return -EINVAL;
} }
ret = camera->configure(config); ret = camera->configure(config.get());
if (ret < 0) { if (ret < 0) {
std::cout << "Failed to configure camera" << std::endl; std::cout << "Failed to configure camera" << std::endl;
return ret; return ret;
@ -208,8 +204,8 @@ static int capture()
streamInfo.clear(); streamInfo.clear();
for (unsigned int index = 0; index < config.size(); ++index) { for (unsigned int index = 0; index < config->size(); ++index) {
StreamConfiguration &cfg = config[index]; StreamConfiguration &cfg = config->at(index);
streamInfo[cfg.stream()] = "stream" + std::to_string(index); streamInfo[cfg.stream()] = "stream" + std::to_string(index);
} }
@ -224,7 +220,7 @@ static int capture()
/* Identify the stream with the least number of buffers. */ /* Identify the stream with the least number of buffers. */
unsigned int nbuffers = UINT_MAX; unsigned int nbuffers = UINT_MAX;
for (StreamConfiguration &cfg : config) { for (StreamConfiguration &cfg : *config) {
Stream *stream = cfg.stream(); Stream *stream = cfg.stream();
nbuffers = std::min(nbuffers, stream->bufferPool().count()); nbuffers = std::min(nbuffers, stream->bufferPool().count());
} }
@ -244,7 +240,7 @@ static int capture()
} }
std::map<Stream *, Buffer *> map; std::map<Stream *, Buffer *> map;
for (StreamConfiguration &cfg : config) { for (StreamConfiguration &cfg : *config) {
Stream *stream = cfg.stream(); Stream *stream = cfg.stream();
map[stream] = &stream->bufferPool().buffers()[i]; map[stream] = &stream->bufferPool().buffers()[i];
} }

View file

@ -540,27 +540,37 @@ const std::set<Stream *> &Camera::streams() const
* *
* Generate a camera configuration for a set of desired stream roles. The caller * Generate a camera configuration for a set of desired stream roles. The caller
* specifies a list of stream roles and the camera returns a configuration * specifies a list of stream roles and the camera returns a configuration
* containing suitable streams and their suggested default configurations. * containing suitable streams and their suggested default configurations. An
* empty list of roles is valid, and will generate an empty configuration that
* can be filled by the caller.
* *
* \return A valid CameraConfiguration if the requested roles can be satisfied, * \return A CameraConfiguration if the requested roles can be satisfied, or a
* or a invalid one otherwise * null pointer otherwise. The ownership of the returned configuration is
* passed to the caller.
*/ */
CameraConfiguration std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(const StreamRoles &roles)
Camera::generateConfiguration(const StreamRoles &roles)
{ {
if (disconnected_ || !roles.size() || roles.size() > streams_.size()) if (disconnected_ || roles.size() > streams_.size())
return CameraConfiguration(); return nullptr;
CameraConfiguration config = pipe_->generateConfiguration(this, roles); CameraConfiguration *config = pipe_->generateConfiguration(this, roles);
if (!config) {
LOG(Camera, Debug)
<< "Pipeline handler failed to generate configuration";
return nullptr;
}
std::ostringstream msg("streams configuration:", std::ios_base::ate); std::ostringstream msg("streams configuration:", std::ios_base::ate);
for (unsigned int index = 0; index < config.size(); ++index) if (config->empty())
msg << " (" << index << ") " << config[index].toString(); msg << " empty";
for (unsigned int index = 0; index < config->size(); ++index)
msg << " (" << index << ") " << config->at(index).toString();
LOG(Camera, Debug) << msg.str(); LOG(Camera, Debug) << msg.str();
return config; return std::unique_ptr<CameraConfiguration>(config);
} }
/** /**
@ -590,7 +600,7 @@ Camera::generateConfiguration(const StreamRoles &roles)
* \retval -EACCES The camera is not in a state where it can be configured * \retval -EACCES The camera is not in a state where it can be configured
* \retval -EINVAL The configuration is not valid * \retval -EINVAL The configuration is not valid
*/ */
int Camera::configure(CameraConfiguration &config) int Camera::configure(CameraConfiguration *config)
{ {
int ret; int ret;
@ -600,7 +610,7 @@ int Camera::configure(CameraConfiguration &config)
if (!stateBetween(CameraAcquired, CameraConfigured)) if (!stateBetween(CameraAcquired, CameraConfigured))
return -EACCES; return -EACCES;
if (!config.isValid()) { if (!config->isValid()) {
LOG(Camera, Error) LOG(Camera, Error)
<< "Can't configure camera with invalid configuration"; << "Can't configure camera with invalid configuration";
return -EINVAL; return -EINVAL;
@ -608,8 +618,8 @@ int Camera::configure(CameraConfiguration &config)
std::ostringstream msg("configuring streams:", std::ios_base::ate); std::ostringstream msg("configuring streams:", std::ios_base::ate);
for (unsigned int index = 0; index < config.size(); ++index) { for (unsigned int index = 0; index < config->size(); ++index) {
StreamConfiguration &cfg = config[index]; StreamConfiguration &cfg = config->at(index);
cfg.setStream(nullptr); cfg.setStream(nullptr);
msg << " (" << index << ") " << cfg.toString(); msg << " (" << index << ") " << cfg.toString();
} }
@ -621,7 +631,7 @@ int Camera::configure(CameraConfiguration &config)
return ret; return ret;
activeStreams_.clear(); activeStreams_.clear();
for (const StreamConfiguration &cfg : config) { for (const StreamConfiguration &cfg : *config) {
Stream *stream = cfg.stream(); Stream *stream = cfg.stream();
if (!stream) if (!stream)
LOG(Camera, Fatal) LOG(Camera, Fatal)

View file

@ -60,9 +60,9 @@ public:
bool lock(); bool lock();
void unlock(); void unlock();
virtual CameraConfiguration virtual CameraConfiguration *generateConfiguration(Camera *camera,
generateConfiguration(Camera *camera, const StreamRoles &roles) = 0; const StreamRoles &roles) = 0;
virtual int configure(Camera *camera, CameraConfiguration &config) = 0; virtual int configure(Camera *camera, CameraConfiguration *config) = 0;
virtual int allocateBuffers(Camera *camera, virtual int allocateBuffers(Camera *camera,
const std::set<Stream *> &streams) = 0; const std::set<Stream *> &streams) = 0;

View file

@ -150,9 +150,9 @@ class PipelineHandlerIPU3 : public PipelineHandler
public: public:
PipelineHandlerIPU3(CameraManager *manager); PipelineHandlerIPU3(CameraManager *manager);
CameraConfiguration CameraConfiguration *generateConfiguration(Camera *camera,
generateConfiguration(Camera *camera, const StreamRoles &roles) override; const StreamRoles &roles) override;
int configure(Camera *camera, CameraConfiguration &config) override; int configure(Camera *camera, CameraConfiguration *config) override;
int allocateBuffers(Camera *camera, int allocateBuffers(Camera *camera,
const std::set<Stream *> &streams) override; const std::set<Stream *> &streams) override;
@ -207,12 +207,11 @@ PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager)
{ {
} }
CameraConfiguration CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
PipelineHandlerIPU3::generateConfiguration(Camera *camera,
const StreamRoles &roles) const StreamRoles &roles)
{ {
IPU3CameraData *data = cameraData(camera); IPU3CameraData *data = cameraData(camera);
CameraConfiguration config = {}; CameraConfiguration *config = new CameraConfiguration();
std::set<IPU3Stream *> streams = { std::set<IPU3Stream *> streams = {
&data->outStream_, &data->outStream_,
&data->vfStream_, &data->vfStream_,
@ -290,21 +289,23 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera,
break; break;
} }
if (!stream) if (!stream) {
return CameraConfiguration{}; delete config;
return nullptr;
}
streams.erase(stream); streams.erase(stream);
cfg.pixelFormat = V4L2_PIX_FMT_NV12; cfg.pixelFormat = V4L2_PIX_FMT_NV12;
cfg.bufferCount = IPU3_BUFFER_COUNT; cfg.bufferCount = IPU3_BUFFER_COUNT;
config.addConfiguration(cfg); config->addConfiguration(cfg);
} }
return config; return config;
} }
int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration &config) int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *config)
{ {
IPU3CameraData *data = cameraData(camera); IPU3CameraData *data = cameraData(camera);
IPU3Stream *outStream = &data->outStream_; IPU3Stream *outStream = &data->outStream_;
@ -316,7 +317,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration &config)
outStream->active_ = false; outStream->active_ = false;
vfStream->active_ = false; vfStream->active_ = false;
for (StreamConfiguration &cfg : config) { for (StreamConfiguration &cfg : *config) {
/* /*
* Pick a stream for the configuration entry. * Pick a stream for the configuration entry.
* \todo: This is a naive temporary implementation that will be * \todo: This is a naive temporary implementation that will be
@ -382,7 +383,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration &config)
return ret; return ret;
/* Apply the format to the configured streams output devices. */ /* Apply the format to the configured streams output devices. */
for (StreamConfiguration &cfg : config) { for (StreamConfiguration &cfg : *config) {
IPU3Stream *stream = static_cast<IPU3Stream *>(cfg.stream()); IPU3Stream *stream = static_cast<IPU3Stream *>(cfg.stream());
ret = imgu->configureOutput(stream->device_, cfg); ret = imgu->configureOutput(stream->device_, cfg);
if (ret) if (ret)
@ -395,13 +396,13 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration &config)
* be at least one active stream in the configuration request). * be at least one active stream in the configuration request).
*/ */
if (!outStream->active_) { if (!outStream->active_) {
ret = imgu->configureOutput(outStream->device_, config[0]); ret = imgu->configureOutput(outStream->device_, config->at(0));
if (ret) if (ret)
return ret; return ret;
} }
if (!vfStream->active_) { if (!vfStream->active_) {
ret = imgu->configureOutput(vfStream->device_, config[0]); ret = imgu->configureOutput(vfStream->device_, config->at(0));
if (ret) if (ret)
return ret; return ret;
} }

View file

@ -34,9 +34,9 @@ public:
PipelineHandlerRkISP1(CameraManager *manager); PipelineHandlerRkISP1(CameraManager *manager);
~PipelineHandlerRkISP1(); ~PipelineHandlerRkISP1();
CameraConfiguration generateConfiguration(Camera *camera, CameraConfiguration *generateConfiguration(Camera *camera,
const StreamRoles &roles) override; const StreamRoles &roles) override;
int configure(Camera *camera, CameraConfiguration &config) override; int configure(Camera *camera, CameraConfiguration *config) override;
int allocateBuffers(Camera *camera, int allocateBuffers(Camera *camera,
const std::set<Stream *> &streams) override; const std::set<Stream *> &streams) override;
@ -105,26 +105,29 @@ PipelineHandlerRkISP1::~PipelineHandlerRkISP1()
* Pipeline Operations * Pipeline Operations
*/ */
CameraConfiguration PipelineHandlerRkISP1::generateConfiguration(Camera *camera, CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera,
const StreamRoles &roles) const StreamRoles &roles)
{ {
RkISP1CameraData *data = cameraData(camera); RkISP1CameraData *data = cameraData(camera);
CameraConfiguration config; CameraConfiguration *config = new CameraConfiguration();
StreamConfiguration cfg{};
if (roles.empty())
return config;
StreamConfiguration cfg{};
cfg.pixelFormat = V4L2_PIX_FMT_NV12; cfg.pixelFormat = V4L2_PIX_FMT_NV12;
cfg.size = data->sensor_->resolution(); cfg.size = data->sensor_->resolution();
cfg.bufferCount = RKISP1_BUFFER_COUNT; cfg.bufferCount = RKISP1_BUFFER_COUNT;
config.addConfiguration(cfg); config->addConfiguration(cfg);
return config; return config;
} }
int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration &config) int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *config)
{ {
RkISP1CameraData *data = cameraData(camera); RkISP1CameraData *data = cameraData(camera);
StreamConfiguration &cfg = config[0]; StreamConfiguration &cfg = config->at(0);
CameraSensor *sensor = data->sensor_; CameraSensor *sensor = data->sensor_;
int ret; int ret;

View file

@ -25,9 +25,9 @@ class PipelineHandlerUVC : public PipelineHandler
public: public:
PipelineHandlerUVC(CameraManager *manager); PipelineHandlerUVC(CameraManager *manager);
CameraConfiguration CameraConfiguration *generateConfiguration(Camera *camera,
generateConfiguration(Camera *camera, const StreamRoles &roles) override; const StreamRoles &roles) override;
int configure(Camera *camera, CameraConfiguration &config) override; int configure(Camera *camera, CameraConfiguration *config) override;
int allocateBuffers(Camera *camera, int allocateBuffers(Camera *camera,
const std::set<Stream *> &streams) override; const std::set<Stream *> &streams) override;
@ -73,26 +73,28 @@ PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager)
{ {
} }
CameraConfiguration CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera,
PipelineHandlerUVC::generateConfiguration(Camera *camera,
const StreamRoles &roles) const StreamRoles &roles)
{ {
CameraConfiguration config; CameraConfiguration *config = new CameraConfiguration();
StreamConfiguration cfg;
if (roles.empty())
return config;
StreamConfiguration cfg{};
cfg.pixelFormat = V4L2_PIX_FMT_YUYV; cfg.pixelFormat = V4L2_PIX_FMT_YUYV;
cfg.size = { 640, 480 }; cfg.size = { 640, 480 };
cfg.bufferCount = 4; cfg.bufferCount = 4;
config.addConfiguration(cfg); config->addConfiguration(cfg);
return config; return config;
} }
int PipelineHandlerUVC::configure(Camera *camera, CameraConfiguration &config) int PipelineHandlerUVC::configure(Camera *camera, CameraConfiguration *config)
{ {
UVCCameraData *data = cameraData(camera); UVCCameraData *data = cameraData(camera);
StreamConfiguration &cfg = config[0]; StreamConfiguration &cfg = config->at(0);
int ret; int ret;
V4L2DeviceFormat format = {}; V4L2DeviceFormat format = {};

View file

@ -25,9 +25,9 @@ class PipelineHandlerVimc : public PipelineHandler
public: public:
PipelineHandlerVimc(CameraManager *manager); PipelineHandlerVimc(CameraManager *manager);
CameraConfiguration CameraConfiguration *generateConfiguration(Camera *camera,
generateConfiguration(Camera *camera, const StreamRoles &roles) override; const StreamRoles &roles) override;
int configure(Camera *camera, CameraConfiguration &config) override; int configure(Camera *camera, CameraConfiguration *config) override;
int allocateBuffers(Camera *camera, int allocateBuffers(Camera *camera,
const std::set<Stream *> &streams) override; const std::set<Stream *> &streams) override;
@ -73,26 +73,28 @@ PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager)
{ {
} }
CameraConfiguration CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
PipelineHandlerVimc::generateConfiguration(Camera *camera,
const StreamRoles &roles) const StreamRoles &roles)
{ {
CameraConfiguration config; CameraConfiguration *config = new CameraConfiguration();
StreamConfiguration cfg;
if (roles.empty())
return config;
StreamConfiguration cfg{};
cfg.pixelFormat = V4L2_PIX_FMT_RGB24; cfg.pixelFormat = V4L2_PIX_FMT_RGB24;
cfg.size = { 640, 480 }; cfg.size = { 640, 480 };
cfg.bufferCount = 4; cfg.bufferCount = 4;
config.addConfiguration(cfg); config->addConfiguration(cfg);
return config; return config;
} }
int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration &config) int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)
{ {
VimcCameraData *data = cameraData(camera); VimcCameraData *data = cameraData(camera);
StreamConfiguration &cfg = config[0]; StreamConfiguration &cfg = config->at(0);
int ret; int ret;
V4L2DeviceFormat format = {}; V4L2DeviceFormat format = {};

View file

@ -233,7 +233,8 @@ void PipelineHandler::unlock()
* the group of streams parameters. * the group of streams parameters.
* *
* \return A valid CameraConfiguration if the requested roles can be satisfied, * \return A valid CameraConfiguration if the requested roles can be satisfied,
* or a invalid configuration otherwise * or a null pointer otherwise. The ownership of the returned configuration is
* passed to the caller.
*/ */
/** /**

View file

@ -98,13 +98,13 @@ int MainWindow::startCapture()
int ret; int ret;
config_ = camera_->generateConfiguration({ StreamRole::VideoRecording }); config_ = camera_->generateConfiguration({ StreamRole::VideoRecording });
ret = camera_->configure(config_); ret = camera_->configure(config_.get());
if (ret < 0) { if (ret < 0) {
std::cout << "Failed to configure camera" << std::endl; std::cout << "Failed to configure camera" << std::endl;
return ret; return ret;
} }
const StreamConfiguration &cfg = config_[0]; const StreamConfiguration &cfg = config_->at(0);
Stream *stream = cfg.stream(); Stream *stream = cfg.stream();
ret = viewfinder_->setFormat(cfg.pixelFormat, cfg.size.width, ret = viewfinder_->setFormat(cfg.pixelFormat, cfg.size.width,
cfg.size.height); cfg.size.height);
@ -180,6 +180,8 @@ void MainWindow::stopCapture()
camera_->freeBuffers(); camera_->freeBuffers();
isCapturing_ = false; isCapturing_ = false;
config_.reset();
} }
void MainWindow::requestComplete(Request *request, void MainWindow::requestComplete(Request *request,

View file

@ -8,6 +8,7 @@
#define __QCAM_MAIN_WINDOW_H__ #define __QCAM_MAIN_WINDOW_H__
#include <map> #include <map>
#include <memory>
#include <QMainWindow> #include <QMainWindow>
@ -45,7 +46,7 @@ private:
std::shared_ptr<Camera> camera_; std::shared_ptr<Camera> camera_;
bool isCapturing_; bool isCapturing_;
CameraConfiguration config_; std::unique_ptr<CameraConfiguration> config_;
ViewFinder *viewfinder_; ViewFinder *viewfinder_;
}; };

View file

@ -40,13 +40,25 @@ protected:
camera_->queueRequest(request); camera_->queueRequest(request);
} }
int run() int init() override
{ {
CameraConfiguration config = CameraTest::init();
camera_->generateConfiguration({ StreamRole::VideoRecording });
StreamConfiguration *cfg = &config[0];
if (!config.isValid()) { config_ = camera_->generateConfiguration({ StreamRole::VideoRecording });
if (!config_) {
cout << "Failed to generate default configuration" << endl;
CameraTest::cleanup();
return TestFail;
}
return TestPass;
}
int run() override
{
StreamConfiguration &cfg = config_->at(0);
if (!config_->isValid()) {
cout << "Failed to read default configuration" << endl; cout << "Failed to read default configuration" << endl;
return TestFail; return TestFail;
} }
@ -56,7 +68,7 @@ protected:
return TestFail; return TestFail;
} }
if (camera_->configure(config)) { if (camera_->configure(config_.get())) {
cout << "Failed to set default configuration" << endl; cout << "Failed to set default configuration" << endl;
return TestFail; return TestFail;
} }
@ -66,7 +78,7 @@ protected:
return TestFail; return TestFail;
} }
Stream *stream = cfg->stream(); Stream *stream = cfg.stream();
BufferPool &pool = stream->bufferPool(); BufferPool &pool = stream->bufferPool();
std::vector<Request *> requests; std::vector<Request *> requests;
for (Buffer &buffer : pool.buffers()) { for (Buffer &buffer : pool.buffers()) {
@ -110,10 +122,10 @@ protected:
while (timer.isRunning()) while (timer.isRunning())
dispatcher->processEvents(); dispatcher->processEvents();
if (completeRequestsCount_ <= cfg->bufferCount * 2) { if (completeRequestsCount_ <= cfg.bufferCount * 2) {
cout << "Failed to capture enough frames (got " cout << "Failed to capture enough frames (got "
<< completeRequestsCount_ << " expected at least " << completeRequestsCount_ << " expected at least "
<< cfg->bufferCount * 2 << ")" << endl; << cfg.bufferCount * 2 << ")" << endl;
return TestFail; return TestFail;
} }
@ -134,6 +146,8 @@ protected:
return TestPass; return TestPass;
} }
std::unique_ptr<CameraConfiguration> config_;
}; };
} /* namespace */ } /* namespace */

View file

@ -18,21 +18,21 @@ class ConfigurationDefault : public CameraTest
protected: protected:
int run() int run()
{ {
CameraConfiguration config; std::unique_ptr<CameraConfiguration> config;
/* Test asking for configuration for a video stream. */ /* Test asking for configuration for a video stream. */
config = camera_->generateConfiguration({ StreamRole::VideoRecording }); config = camera_->generateConfiguration({ StreamRole::VideoRecording });
if (!config.isValid()) { if (!config || !config->isValid()) {
cout << "Default configuration invalid" << endl; cout << "Default configuration invalid" << endl;
return TestFail; return TestFail;
} }
/* /*
* Test that asking for configuration for an empty array of * Test that asking for configuration for an empty array of
* stream roles returns an empty list of configurations. * stream roles returns an empty camera configuration.
*/ */
config = camera_->generateConfiguration({}); config = camera_->generateConfiguration({});
if (config.isValid()) { if (!config || config->isValid()) {
cout << "Failed to retrieve configuration for empty roles list" cout << "Failed to retrieve configuration for empty roles list"
<< endl; << endl;
return TestFail; return TestFail;

View file

@ -16,13 +16,25 @@ namespace {
class ConfigurationSet : public CameraTest class ConfigurationSet : public CameraTest
{ {
protected: protected:
int run() int init() override
{ {
CameraConfiguration config = CameraTest::init();
camera_->generateConfiguration({ StreamRole::VideoRecording });
StreamConfiguration *cfg = &config[0];
if (!config.isValid()) { config_ = camera_->generateConfiguration({ StreamRole::VideoRecording });
if (!config_) {
cout << "Failed to generate default configuration" << endl;
CameraTest::cleanup();
return TestFail;
}
return TestPass;
}
int run() override
{
StreamConfiguration &cfg = config_->at(0);
if (!config_->isValid()) {
cout << "Failed to read default configuration" << endl; cout << "Failed to read default configuration" << endl;
return TestFail; return TestFail;
} }
@ -33,7 +45,7 @@ protected:
} }
/* Test that setting the default configuration works. */ /* Test that setting the default configuration works. */
if (camera_->configure(config)) { if (camera_->configure(config_.get())) {
cout << "Failed to set default configuration" << endl; cout << "Failed to set default configuration" << endl;
return TestFail; return TestFail;
} }
@ -48,7 +60,7 @@ protected:
return TestFail; return TestFail;
} }
if (!camera_->configure(config)) { if (!camera_->configure(config_.get())) {
cout << "Setting configuration on a camera not acquired succeeded when it should have failed" cout << "Setting configuration on a camera not acquired succeeded when it should have failed"
<< endl; << endl;
return TestFail; return TestFail;
@ -64,9 +76,9 @@ protected:
* the default configuration of the VIMC camera is known to * the default configuration of the VIMC camera is known to
* work. * work.
*/ */
cfg->size.width *= 2; cfg.size.width *= 2;
cfg->size.height *= 2; cfg.size.height *= 2;
if (camera_->configure(config)) { if (camera_->configure(config_.get())) {
cout << "Failed to set modified configuration" << endl; cout << "Failed to set modified configuration" << endl;
return TestFail; return TestFail;
} }
@ -74,14 +86,16 @@ protected:
/* /*
* Test that setting an invalid configuration fails. * Test that setting an invalid configuration fails.
*/ */
cfg->size = { 0, 0 }; cfg.size = { 0, 0 };
if (!camera_->configure(config)) { if (!camera_->configure(config_.get())) {
cout << "Invalid configuration incorrectly accepted" << endl; cout << "Invalid configuration incorrectly accepted" << endl;
return TestFail; return TestFail;
} }
return TestPass; return TestPass;
} }
std::unique_ptr<CameraConfiguration> config_;
}; };
} /* namespace */ } /* namespace */

View file

@ -19,7 +19,7 @@ protected:
int testAvailable() int testAvailable()
{ {
/* Test operations which should fail. */ /* Test operations which should fail. */
if (camera_->configure(defconf_) != -EACCES) if (camera_->configure(defconf_.get()) != -EACCES)
return TestFail; return TestFail;
if (camera_->allocateBuffers() != -EACCES) if (camera_->allocateBuffers() != -EACCES)
@ -84,7 +84,7 @@ protected:
if (camera_->acquire()) if (camera_->acquire())
return TestFail; return TestFail;
if (camera_->configure(defconf_)) if (camera_->configure(defconf_.get()))
return TestFail; return TestFail;
return TestPass; return TestPass;
@ -113,7 +113,7 @@ protected:
return TestFail; return TestFail;
/* Test operations which should pass. */ /* Test operations which should pass. */
if (camera_->configure(defconf_)) if (camera_->configure(defconf_.get()))
return TestFail; return TestFail;
/* Test valid state transitions, end in Prepared state. */ /* Test valid state transitions, end in Prepared state. */
@ -123,7 +123,7 @@ protected:
if (camera_->acquire()) if (camera_->acquire())
return TestFail; return TestFail;
if (camera_->configure(defconf_)) if (camera_->configure(defconf_.get()))
return TestFail; return TestFail;
if (camera_->allocateBuffers()) if (camera_->allocateBuffers())
@ -141,7 +141,7 @@ protected:
if (camera_->release() != -EBUSY) if (camera_->release() != -EBUSY)
return TestFail; return TestFail;
if (camera_->configure(defconf_) != -EACCES) if (camera_->configure(defconf_.get()) != -EACCES)
return TestFail; return TestFail;
if (camera_->allocateBuffers() != -EACCES) if (camera_->allocateBuffers() != -EACCES)
@ -172,7 +172,7 @@ protected:
if (camera_->acquire()) if (camera_->acquire())
return TestFail; return TestFail;
if (camera_->configure(defconf_)) if (camera_->configure(defconf_.get()))
return TestFail; return TestFail;
if (camera_->allocateBuffers()) if (camera_->allocateBuffers())
@ -193,7 +193,7 @@ protected:
if (camera_->release() != -EBUSY) if (camera_->release() != -EBUSY)
return TestFail; return TestFail;
if (camera_->configure(defconf_) != -EACCES) if (camera_->configure(defconf_.get()) != -EACCES)
return TestFail; return TestFail;
if (camera_->allocateBuffers() != -EACCES) if (camera_->allocateBuffers() != -EACCES)
@ -233,10 +233,22 @@ protected:
return TestPass; return TestPass;
} }
int run() int init() override
{ {
defconf_ = camera_->generateConfiguration({ StreamRole::VideoRecording }); CameraTest::init();
defconf_ = camera_->generateConfiguration({ StreamRole::VideoRecording });
if (!defconf_) {
cout << "Failed to generate default configuration" << endl;
CameraTest::cleanup();
return TestFail;
}
return TestPass;
}
int run() override
{
if (testAvailable() != TestPass) { if (testAvailable() != TestPass) {
cout << "State machine in Available state failed" << endl; cout << "State machine in Available state failed" << endl;
return TestFail; return TestFail;
@ -265,7 +277,7 @@ protected:
return TestPass; return TestPass;
} }
CameraConfiguration defconf_; std::unique_ptr<CameraConfiguration> defconf_;
}; };
} /* namespace */ } /* namespace */