[libcamera-devel] [PATCH v4 4/7] libcamera: Add user Transform to CameraConfiguration
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Aug 28 17:33:06 CEST 2020
Hi David,
On 28/08/2020 15:41, David Plowman wrote:
> 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 at raspberrypi.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> include/libcamera/camera.h | 3 +++
> src/libcamera/camera.cpp | 16 +++++++++++++++-
> src/libcamera/pipeline/ipu3/ipu3.cpp | 5 +++++
> .../pipeline/raspberrypi/raspberrypi.cpp | 5 +++++
> src/libcamera/pipeline/rkisp1/rkisp1.cpp | 5 +++++
> src/libcamera/pipeline/simple/simple.cpp | 5 +++++
> src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 5 +++++
> src/libcamera/pipeline/vimc/vimc.cpp | 5 +++++
> 8 files changed, 48 insertions(+), 1 deletion(-)
>
> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> index 272c12c..a2ee4e7 100644
> --- a/include/libcamera/camera.h
> +++ b/include/libcamera/camera.h
> @@ -17,6 +17,7 @@
> #include <libcamera/request.h>
> #include <libcamera/signal.h>
> #include <libcamera/stream.h>
> +#include <libcamera/transform.h>
>
> namespace libcamera {
>
> @@ -61,6 +62,8 @@ public:
> bool empty() const;
> std::size_t size() const;
>
> + Transform transform;
> +
> protected:
> CameraConfiguration();
>
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index 4a9c19c..b547ffe 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -93,7 +93,7 @@ LOG_DECLARE_CATEGORY(Camera)
> * \brief Create an empty camera configuration
> */
> CameraConfiguration::CameraConfiguration()
> - : config_({})
> + : transform(Transform::Identity), config_({})
> {
> }
>
> @@ -250,6 +250,20 @@ std::size_t CameraConfiguration::size() const
> 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_
> * \brief The vector of stream configurations
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 2d881fe..22b8825 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -138,6 +138,11 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
> if (config_.empty())
> return Invalid;
>
> + if (transform != Transform::Identity) {
> + transform = Transform::Identity;
> + status = Adjusted;
> + }
> +
> /* Cap the number of entries to the available streams. */
> if (config_.size() > IPU3_MAX_STREAMS) {
> config_.resize(IPU3_MAX_STREAMS);
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 7aace71..dc36f53 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -400,6 +400,11 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
> if (config_.empty())
> return Invalid;
>
> + if (transform != Transform::Identity) {
> + transform = Transform::Identity;
> + status = Adjusted;
> + }
> +
> /*
> * Configure the H/V flip controls based on the sensor rotation. We do
> * this here so that the sensor has the correct Bayer format that will
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 4d89aab..6f53a1d 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -478,6 +478,11 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
> if (config_.empty())
> return Invalid;
>
> + if (transform != Transform::Identity) {
> + transform = Transform::Identity;
> + status = Adjusted;
> + }
> +
> /* Cap the number of entries to the available streams. */
> if (config_.size() > 1) {
> config_.resize(1);
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index eb72e3b..10223a9 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -438,6 +438,11 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()
> if (config_.empty())
> return Invalid;
>
> + if (transform != Transform::Identity) {
> + transform = Transform::Identity;
> + status = Adjusted;
> + }
> +
> /* Cap the number of entries to the available streams. */
> if (config_.size() > 1) {
> config_.resize(1);
> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> index bafe6f1..ba0efc8 100644
> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> @@ -109,6 +109,11 @@ CameraConfiguration::Status UVCCameraConfiguration::validate()
> if (config_.empty())
> return Invalid;
>
> + if (transform != Transform::Identity) {
> + transform = Transform::Identity;
> + status = Adjusted;
> + }
> +
> /* Cap the number of entries to the available streams. */
> if (config_.size() > 1) {
> config_.resize(1);
> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
> index d192670..fc8085f 100644
> --- a/src/libcamera/pipeline/vimc/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc/vimc.cpp
> @@ -130,6 +130,11 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()
> if (config_.empty())
> return Invalid;
>
> + if (transform != Transform::Identity) {
> + transform = Transform::Identity;
> + status = Adjusted;
> + }
> +
> /* Cap the number of entries to the available streams. */
> if (config_.size() > 1) {
> config_.resize(1);
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list