[libcamera-devel] [RFC 1/4] libcamera: camera_sensor: Cache rotationTransform_
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Jun 22 10:54:20 CEST 2023
Hi Jacopo,
Thank you for the patch.
On Tue, Jun 20, 2023 at 04:29:01PM +0200, Jacopo Mondi via libcamera-devel wrote:
> The rotationTransform_ depends on a V4L2 control whose value does not
> change for the whole lifetime of the camera.
>
> Instead of re-calculating it everytime the camera is configured, cache
> it at properties initialization time.
>
> Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> ---
> include/libcamera/internal/camera_sensor.h | 1 +
> src/libcamera/camera_sensor.cpp | 54 +++++++++++++---------
> 2 files changed, 32 insertions(+), 23 deletions(-)
>
> diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
> index 02c77ab037da..02b4b4d25e6d 100644
> --- a/include/libcamera/internal/camera_sensor.h
> +++ b/include/libcamera/internal/camera_sensor.h
> @@ -107,6 +107,7 @@ private:
> Rectangle activeArea_;
> const BayerFormat *bayerFormat_;
> bool supportFlips_;
> + Transform rotationTransform_;
>
> ControlList properties_;
>
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index f3a5aa37149f..a15a6c89c5c8 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -461,18 +461,36 @@ int CameraSensor::initProperties()
>
> const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
> if (rotationControl != controls.end()) {
> + propertyValue = rotationControl->second.def().get<int32_t>();
> +
> /*
> - * validateTransform() compensates for the mounting rotation.
> - * However, as a camera sensor can only compensate rotations
> - * by applying H/VFlips, only rotation of 180 degrees are
> - * automatically compensated. The other valid rotations (Rot90
> - * and Rot270) require transposition, which the camera sensor
> - * cannot perform, so leave them untouched.
> + * Cache the Transform associated with the camera mounting
> + * rotation for later use in validateTransform().
> + */
> + bool success;
> + rotationTransform_ = transformFromRotation(propertyValue, &success);
> + if (!success) {
> + LOG(CameraSensor, Warning)
> + << "Invalid rotation of " << propertyValue
> + << " degrees - ignoring";
> + rotationTransform_ = Transform::Identity;
> + }
> +
> + /*
> + * Adjust property::Rotation as validateTransform() compensates
> + * for the mounting rotation. However, as a camera sensor can
> + * only compensate rotations by applying H/VFlips, only rotation
> + * of 180 degrees are automatically compensated. The other valid
> + * rotations (Rot90 and Rot270) require transposition, which the
> + * camera sensor cannot perform, so leave them untouched.
> */
> - propertyValue = rotationControl->second.def().get<int32_t>();
> if (propertyValue == 180 && supportFlips_)
> propertyValue = 0;
> properties_.set(properties::Rotation, propertyValue);
> + } else {
> + LOG(CameraSensor, Warning)
> + << "Rotation control not available, default to 0 degreees";
I think "degrees" has enough e's without having to add an extra one :-)
With this fixed,
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> + rotationTransform_ = Transform::Identity;
> }
>
> properties_.set(properties::PixelArraySize, pixelArraySize_);
> @@ -1038,21 +1056,11 @@ void CameraSensor::updateControlInfo()
> */
> Transform CameraSensor::validateTransform(Transform *transform) const
> {
> - /* Adjust the requested transform to compensate the sensor mounting rotation. */
> - const ControlInfoMap &controls = subdev_->controls();
> - int rotation = 0;
> -
> - const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
> - if (rotationControl != controls.end())
> - rotation = rotationControl->second.def().get<int32_t>();
> -
> - bool success;
> - Transform rotationTransform = transformFromRotation(rotation, &success);
> - if (!success)
> - LOG(CameraSensor, Warning) << "Invalid rotation of " << rotation
> - << " degrees - ignoring";
> -
> - Transform combined = *transform * rotationTransform;
> + /*
> + * Combine the requested transform to compensate the sensor mounting
> + * rotation.
> + */
> + Transform combined = *transform * rotationTransform_;
>
> /*
> * We combine the platform and user transform, but must "adjust away"
> @@ -1083,7 +1091,7 @@ Transform CameraSensor::validateTransform(Transform *transform) const
> * rise to this is the inverse of the rotation. (Recall that
> * combined = transform * rotationTransform.)
> */
> - *transform = -rotationTransform;
> + *transform = -rotationTransform_;
> combined = Transform::Identity;
> }
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list