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:
+23
-9
@@ -40,13 +40,25 @@ protected:
|
||||
camera_->queueRequest(request);
|
||||
}
|
||||
|
||||
int run()
|
||||
int init() override
|
||||
{
|
||||
CameraConfiguration config =
|
||||
camera_->generateConfiguration({ StreamRole::VideoRecording });
|
||||
StreamConfiguration *cfg = &config[0];
|
||||
CameraTest::init();
|
||||
|
||||
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;
|
||||
return TestFail;
|
||||
}
|
||||
@@ -56,7 +68,7 @@ protected:
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
if (camera_->configure(config)) {
|
||||
if (camera_->configure(config_.get())) {
|
||||
cout << "Failed to set default configuration" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
@@ -66,7 +78,7 @@ protected:
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
Stream *stream = cfg->stream();
|
||||
Stream *stream = cfg.stream();
|
||||
BufferPool &pool = stream->bufferPool();
|
||||
std::vector<Request *> requests;
|
||||
for (Buffer &buffer : pool.buffers()) {
|
||||
@@ -110,10 +122,10 @@ protected:
|
||||
while (timer.isRunning())
|
||||
dispatcher->processEvents();
|
||||
|
||||
if (completeRequestsCount_ <= cfg->bufferCount * 2) {
|
||||
if (completeRequestsCount_ <= cfg.bufferCount * 2) {
|
||||
cout << "Failed to capture enough frames (got "
|
||||
<< completeRequestsCount_ << " expected at least "
|
||||
<< cfg->bufferCount * 2 << ")" << endl;
|
||||
<< cfg.bufferCount * 2 << ")" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
@@ -134,6 +146,8 @@ protected:
|
||||
|
||||
return TestPass;
|
||||
}
|
||||
|
||||
std::unique_ptr<CameraConfiguration> config_;
|
||||
};
|
||||
|
||||
} /* namespace */
|
||||
|
||||
@@ -18,21 +18,21 @@ class ConfigurationDefault : public CameraTest
|
||||
protected:
|
||||
int run()
|
||||
{
|
||||
CameraConfiguration config;
|
||||
std::unique_ptr<CameraConfiguration> config;
|
||||
|
||||
/* Test asking for configuration for a video stream. */
|
||||
config = camera_->generateConfiguration({ StreamRole::VideoRecording });
|
||||
if (!config.isValid()) {
|
||||
if (!config || !config->isValid()) {
|
||||
cout << "Default configuration invalid" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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({});
|
||||
if (config.isValid()) {
|
||||
if (!config || config->isValid()) {
|
||||
cout << "Failed to retrieve configuration for empty roles list"
|
||||
<< endl;
|
||||
return TestFail;
|
||||
|
||||
@@ -16,13 +16,25 @@ namespace {
|
||||
class ConfigurationSet : public CameraTest
|
||||
{
|
||||
protected:
|
||||
int run()
|
||||
int init() override
|
||||
{
|
||||
CameraConfiguration config =
|
||||
camera_->generateConfiguration({ StreamRole::VideoRecording });
|
||||
StreamConfiguration *cfg = &config[0];
|
||||
CameraTest::init();
|
||||
|
||||
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;
|
||||
return TestFail;
|
||||
}
|
||||
@@ -33,7 +45,7 @@ protected:
|
||||
}
|
||||
|
||||
/* Test that setting the default configuration works. */
|
||||
if (camera_->configure(config)) {
|
||||
if (camera_->configure(config_.get())) {
|
||||
cout << "Failed to set default configuration" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
@@ -48,7 +60,7 @@ protected:
|
||||
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"
|
||||
<< endl;
|
||||
return TestFail;
|
||||
@@ -64,9 +76,9 @@ protected:
|
||||
* the default configuration of the VIMC camera is known to
|
||||
* work.
|
||||
*/
|
||||
cfg->size.width *= 2;
|
||||
cfg->size.height *= 2;
|
||||
if (camera_->configure(config)) {
|
||||
cfg.size.width *= 2;
|
||||
cfg.size.height *= 2;
|
||||
if (camera_->configure(config_.get())) {
|
||||
cout << "Failed to set modified configuration" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
@@ -74,14 +86,16 @@ protected:
|
||||
/*
|
||||
* Test that setting an invalid configuration fails.
|
||||
*/
|
||||
cfg->size = { 0, 0 };
|
||||
if (!camera_->configure(config)) {
|
||||
cfg.size = { 0, 0 };
|
||||
if (!camera_->configure(config_.get())) {
|
||||
cout << "Invalid configuration incorrectly accepted" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
return TestPass;
|
||||
}
|
||||
|
||||
std::unique_ptr<CameraConfiguration> config_;
|
||||
};
|
||||
|
||||
} /* namespace */
|
||||
|
||||
@@ -19,7 +19,7 @@ protected:
|
||||
int testAvailable()
|
||||
{
|
||||
/* Test operations which should fail. */
|
||||
if (camera_->configure(defconf_) != -EACCES)
|
||||
if (camera_->configure(defconf_.get()) != -EACCES)
|
||||
return TestFail;
|
||||
|
||||
if (camera_->allocateBuffers() != -EACCES)
|
||||
@@ -84,7 +84,7 @@ protected:
|
||||
if (camera_->acquire())
|
||||
return TestFail;
|
||||
|
||||
if (camera_->configure(defconf_))
|
||||
if (camera_->configure(defconf_.get()))
|
||||
return TestFail;
|
||||
|
||||
return TestPass;
|
||||
@@ -113,7 +113,7 @@ protected:
|
||||
return TestFail;
|
||||
|
||||
/* Test operations which should pass. */
|
||||
if (camera_->configure(defconf_))
|
||||
if (camera_->configure(defconf_.get()))
|
||||
return TestFail;
|
||||
|
||||
/* Test valid state transitions, end in Prepared state. */
|
||||
@@ -123,7 +123,7 @@ protected:
|
||||
if (camera_->acquire())
|
||||
return TestFail;
|
||||
|
||||
if (camera_->configure(defconf_))
|
||||
if (camera_->configure(defconf_.get()))
|
||||
return TestFail;
|
||||
|
||||
if (camera_->allocateBuffers())
|
||||
@@ -141,7 +141,7 @@ protected:
|
||||
if (camera_->release() != -EBUSY)
|
||||
return TestFail;
|
||||
|
||||
if (camera_->configure(defconf_) != -EACCES)
|
||||
if (camera_->configure(defconf_.get()) != -EACCES)
|
||||
return TestFail;
|
||||
|
||||
if (camera_->allocateBuffers() != -EACCES)
|
||||
@@ -172,7 +172,7 @@ protected:
|
||||
if (camera_->acquire())
|
||||
return TestFail;
|
||||
|
||||
if (camera_->configure(defconf_))
|
||||
if (camera_->configure(defconf_.get()))
|
||||
return TestFail;
|
||||
|
||||
if (camera_->allocateBuffers())
|
||||
@@ -193,7 +193,7 @@ protected:
|
||||
if (camera_->release() != -EBUSY)
|
||||
return TestFail;
|
||||
|
||||
if (camera_->configure(defconf_) != -EACCES)
|
||||
if (camera_->configure(defconf_.get()) != -EACCES)
|
||||
return TestFail;
|
||||
|
||||
if (camera_->allocateBuffers() != -EACCES)
|
||||
@@ -233,10 +233,22 @@ protected:
|
||||
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) {
|
||||
cout << "State machine in Available state failed" << endl;
|
||||
return TestFail;
|
||||
@@ -265,7 +277,7 @@ protected:
|
||||
return TestPass;
|
||||
}
|
||||
|
||||
CameraConfiguration defconf_;
|
||||
std::unique_ptr<CameraConfiguration> defconf_;
|
||||
};
|
||||
|
||||
} /* namespace */
|
||||
|
||||
Reference in New Issue
Block a user