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>
This commit is contained in:
Jacopo Mondi
2023-06-14 12:46:09 +02:00
parent 5a142438b0
commit 9c666075f3
2 changed files with 19 additions and 5 deletions
+18 -3
View File
@@ -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