libcamera: camera: Add a validation API to the CameraConfiguration class

The CameraConfiguration class implements a simple storage of
StreamConfiguration with internal validation limited to verifying that
the stream configurations are not empty. Extend this mechanism by
implementing a smart validate() method backed by pipeline handlers.

This new mechanism changes the semantic of the camera configuration. The
Camera::generateConfiguration() operation still generates a default
configuration based on roles, but now also supports generating empty
configurations to be filled by applications. Applications can inspect
the configuration, optionally modify it, and validate it. The validation
implements "try" semantics and adjusts invalid configurations instead of
rejecting them completely. Applications then decide whether to accept
the modified configuration, or try again with a different set of
parameters. Once the configuration is valid, it is passed to
Camera::configure(), and pipeline handlers are guaranteed that the
configuration they receive is valid.

A reference to the Camera may need to be stored in the
CameraConfiguration derived classes in order to access it from their
validate() implementation. This must be stored as a std::shared_ptr<> as
the CameraConfiguration instances belong to applications. In order to
make this possible, make the Camera class inherit from
std::shared_from_this<>.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart
2019-05-01 01:06:34 +03:00
parent adc61fc3ce
commit 2b1a908b52
11 changed files with 514 additions and 140 deletions
+7 -10
View File
@@ -248,17 +248,14 @@ void PipelineHandler::unlock()
* is the Camera class which will receive configuration to apply from the
* application.
*
* Each pipeline handler implementation is responsible for validating
* that the configuration requested in \a config can be achieved
* exactly. Any difference in pixel format, frame size or any other
* parameter shall result in the -EINVAL error being returned, and no
* change in configuration being applied to the pipeline. If
* configuration of a subset of the streams can't be satisfied, the
* whole configuration is considered invalid.
* The configuration is guaranteed to have been validated with
* CameraConfiguration::valid(). The pipeline handler implementation shall not
* perform further validation and may rely on any custom field stored in its
* custom CameraConfiguration derived class.
*
* Once the configuration is validated and the camera configured, the pipeline
* handler shall associate a Stream instance to each StreamConfiguration entry
* in the CameraConfiguration with the StreamConfiguration::setStream() method.
* When configuring the camera the pipeline handler shall associate a Stream
* instance to each StreamConfiguration entry in the CameraConfiguration using
* the StreamConfiguration::setStream() method.
*
* \return 0 on success or a negative error code otherwise
*/