summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-10-19 16:01:22 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2023-10-23 16:05:46 +0300
commit042649f044ae8cd2f9d970c4be180a2c2191d74e (patch)
tree24cd5e29780067859c01c1756c084dbeb4cad329
parentb5f5a89bc34c601d9b59e160af9db557e1443904 (diff)
libcamera: camera_sensor: Cache rotationTransform_
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@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--include/libcamera/internal/camera_sensor.h1
-rw-r--r--src/libcamera/camera_sensor.cpp54
2 files changed, 32 insertions, 23 deletions
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index 06791c3c..0b2ece31 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -112,6 +112,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 7baa08b3..e3826ceb 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -462,18 +462,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 degrees";
+ rotationTransform_ = Transform::Identity;
}
properties_.set(properties::PixelArraySize, pixelArraySize_);
@@ -1123,21 +1141,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"
@@ -1168,7 +1176,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;
}