libcamera: Add user Transform to CameraConfiguration
Add a field to the CameraConfiguration (including the necessary documentation) to represent a 2D transform requested by the application. All pipeline handlers are amended to coerce this to the Identity, marking the configuration as "adjusted" if something different had been requested. Pipeline handlers that support Transforms can be amended subsequently. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
78cbd6a93f
commit
dcae0513f7
8 changed files with 48 additions and 1 deletions
|
@ -17,6 +17,7 @@
|
||||||
#include <libcamera/request.h>
|
#include <libcamera/request.h>
|
||||||
#include <libcamera/signal.h>
|
#include <libcamera/signal.h>
|
||||||
#include <libcamera/stream.h>
|
#include <libcamera/stream.h>
|
||||||
|
#include <libcamera/transform.h>
|
||||||
|
|
||||||
namespace libcamera {
|
namespace libcamera {
|
||||||
|
|
||||||
|
@ -61,6 +62,8 @@ public:
|
||||||
bool empty() const;
|
bool empty() const;
|
||||||
std::size_t size() const;
|
std::size_t size() const;
|
||||||
|
|
||||||
|
Transform transform;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CameraConfiguration();
|
CameraConfiguration();
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ LOG_DECLARE_CATEGORY(Camera)
|
||||||
* \brief Create an empty camera configuration
|
* \brief Create an empty camera configuration
|
||||||
*/
|
*/
|
||||||
CameraConfiguration::CameraConfiguration()
|
CameraConfiguration::CameraConfiguration()
|
||||||
: config_({})
|
: transform(Transform::Identity), config_({})
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,6 +251,20 @@ std::size_t CameraConfiguration::size() const
|
||||||
return config_.size();
|
return config_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \var CameraConfiguration::transform
|
||||||
|
* \brief User-specified transform to be applied to the image
|
||||||
|
*
|
||||||
|
* The transform is a user-specified 2D plane transform that will be applied
|
||||||
|
* to the camera images by the processing pipeline before being handed to
|
||||||
|
* the application. This is subsequent to any transform that is already
|
||||||
|
* required to fix up any platform-defined rotation.
|
||||||
|
*
|
||||||
|
* The usual 2D plane transforms are allowed here (horizontal/vertical
|
||||||
|
* flips, multiple of 90-degree rotations etc.), but the validate() function
|
||||||
|
* may adjust this field at its discretion if the selection is not supported.
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \var CameraConfiguration::config_
|
* \var CameraConfiguration::config_
|
||||||
* \brief The vector of stream configurations
|
* \brief The vector of stream configurations
|
||||||
|
|
|
@ -138,6 +138,11 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
|
||||||
if (config_.empty())
|
if (config_.empty())
|
||||||
return Invalid;
|
return Invalid;
|
||||||
|
|
||||||
|
if (transform != Transform::Identity) {
|
||||||
|
transform = Transform::Identity;
|
||||||
|
status = Adjusted;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cap the number of entries to the available streams. */
|
/* Cap the number of entries to the available streams. */
|
||||||
if (config_.size() > IPU3_MAX_STREAMS) {
|
if (config_.size() > IPU3_MAX_STREAMS) {
|
||||||
config_.resize(IPU3_MAX_STREAMS);
|
config_.resize(IPU3_MAX_STREAMS);
|
||||||
|
|
|
@ -250,6 +250,11 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
|
||||||
if (config_.empty())
|
if (config_.empty())
|
||||||
return Invalid;
|
return Invalid;
|
||||||
|
|
||||||
|
if (transform != Transform::Identity) {
|
||||||
|
transform = Transform::Identity;
|
||||||
|
status = Adjusted;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int rawCount = 0, outCount = 0, count = 0, maxIndex = 0;
|
unsigned int rawCount = 0, outCount = 0, count = 0, maxIndex = 0;
|
||||||
std::pair<int, Size> outSize[2];
|
std::pair<int, Size> outSize[2];
|
||||||
Size maxSize;
|
Size maxSize;
|
||||||
|
|
|
@ -586,6 +586,11 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
|
||||||
if (config_.empty())
|
if (config_.empty())
|
||||||
return Invalid;
|
return Invalid;
|
||||||
|
|
||||||
|
if (transform != Transform::Identity) {
|
||||||
|
transform = Transform::Identity;
|
||||||
|
status = Adjusted;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cap the number of entries to the available streams. */
|
/* Cap the number of entries to the available streams. */
|
||||||
if (config_.size() > 2) {
|
if (config_.size() > 2) {
|
||||||
config_.resize(2);
|
config_.resize(2);
|
||||||
|
|
|
@ -438,6 +438,11 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()
|
||||||
if (config_.empty())
|
if (config_.empty())
|
||||||
return Invalid;
|
return Invalid;
|
||||||
|
|
||||||
|
if (transform != Transform::Identity) {
|
||||||
|
transform = Transform::Identity;
|
||||||
|
status = Adjusted;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cap the number of entries to the available streams. */
|
/* Cap the number of entries to the available streams. */
|
||||||
if (config_.size() > 1) {
|
if (config_.size() > 1) {
|
||||||
config_.resize(1);
|
config_.resize(1);
|
||||||
|
|
|
@ -109,6 +109,11 @@ CameraConfiguration::Status UVCCameraConfiguration::validate()
|
||||||
if (config_.empty())
|
if (config_.empty())
|
||||||
return Invalid;
|
return Invalid;
|
||||||
|
|
||||||
|
if (transform != Transform::Identity) {
|
||||||
|
transform = Transform::Identity;
|
||||||
|
status = Adjusted;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cap the number of entries to the available streams. */
|
/* Cap the number of entries to the available streams. */
|
||||||
if (config_.size() > 1) {
|
if (config_.size() > 1) {
|
||||||
config_.resize(1);
|
config_.resize(1);
|
||||||
|
|
|
@ -130,6 +130,11 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()
|
||||||
if (config_.empty())
|
if (config_.empty())
|
||||||
return Invalid;
|
return Invalid;
|
||||||
|
|
||||||
|
if (transform != Transform::Identity) {
|
||||||
|
transform = Transform::Identity;
|
||||||
|
status = Adjusted;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cap the number of entries to the available streams. */
|
/* Cap the number of entries to the available streams. */
|
||||||
if (config_.size() > 1) {
|
if (config_.size() > 1) {
|
||||||
config_.resize(1);
|
config_.resize(1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue