summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-06-14 12:46:09 +0200
committerJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-06-19 10:58:12 +0200
commit9c666075f3e8886217a4c557a6a59112a139e98f (patch)
tree6b63eaf9d043bd44051f873797b89e69c8adaf8b
parent5a142438b025b448eedfa67678fe8e169c66f566 (diff)
libcamera: camera_sensor: Adjust properties::Rotation
As the CameraSensor::validateTransform() function compensate for the sensor's mounting rotation, the properties::Rotation value should be adjusted to make sure application that receive already "corrected" images do not get confused by Rotation still reporting a value. Howerver, as an image sensor can only compensate rotations by applying H/V flips, only correct Rotation when the mounting rotation is 180 degrees. Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
-rw-r--r--src/libcamera/camera.cpp3
-rw-r--r--src/libcamera/camera_sensor.cpp21
2 files changed, 19 insertions, 5 deletions
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 99683e49..3e252f3b 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -397,8 +397,7 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF
*
* 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 application.
*
* The usual 2D plane transforms are allowed here (horizontal/vertical
* flips, multiple of 90-degree rotations etc.), but the validate() function
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 60bf87b4..f3a5aa37 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -461,7 +461,17 @@ int CameraSensor::initProperties()
const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
if (rotationControl != controls.end()) {
+ /*
+ * 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);
}
@@ -1028,10 +1038,15 @@ void CameraSensor::updateControlInfo()
*/
Transform CameraSensor::validateTransform(Transform *transform) const
{
- /* Adjust the requested transform to compensate the sensor rotation. */
- int32_t rotation = properties().get(properties::Rotation).value_or(0);
- bool success;
+ /* 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