Skip to content

Commit

Permalink
libcamera: properties: Make 'Rotation' the mounting rotation
Browse files Browse the repository at this point in the history
Specify in the documentation that properties::Rotation specifies the
mounting rotation of the camera module. This avoids confusion with the
image orientation which is instead expressed by
CameraConfiguration::orientation.

For this reason, do not compensate the Rotation property when
initializing the CameraSensor class but report the value of
V4L2_CID_CAMERA_SENSOR_ROTATION or 0 if the control is not available.

Signed-off-by: Jacopo Mondi <[email protected]>
Reviewed-by: David Plowman <[email protected]>
Reviewed-by: Laurent Pinchart <[email protected]>
Signed-off-by: Laurent Pinchart <[email protected]>
  • Loading branch information
Jacopo Mondi authored and pinchartl committed Oct 23, 2023
1 parent 891720a commit 568569b
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 16 deletions.
15 changes: 3 additions & 12 deletions src/libcamera/camera_sensor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -433,11 +433,11 @@ int CameraSensor::initProperties()

/* Retrieve and register properties from the kernel interface. */
const ControlInfoMap &controls = subdev_->controls();
int32_t propertyValue;

const auto &orientation = controls.find(V4L2_CID_CAMERA_ORIENTATION);
if (orientation != controls.end()) {
int32_t v4l2Orientation = orientation->second.def().get<int32_t>();
int32_t propertyValue;

switch (v4l2Orientation) {
default:
Expand All @@ -462,7 +462,7 @@ int CameraSensor::initProperties()

const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
if (rotationControl != controls.end()) {
propertyValue = rotationControl->second.def().get<int32_t>();
int32_t propertyValue = rotationControl->second.def().get<int32_t>();

/*
* Cache the Transform associated with the camera mounting
Expand All @@ -477,20 +477,11 @@ int CameraSensor::initProperties()
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.
*/
if (propertyValue == 180 && supportFlips_)
propertyValue = 0;
properties_.set(properties::Rotation, propertyValue);
} else {
LOG(CameraSensor, Warning)
<< "Rotation control not available, default to 0 degrees";
properties_.set(properties::Rotation, 0);
rotationTransform_ = Transform::Identity;
}

Expand Down
8 changes: 4 additions & 4 deletions src/libcamera/property_ids.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ controls:
- Rotation:
type: int32_t
description: |
The camera rotation is expressed as the angular difference in degrees
between two reference systems, one relative to the camera module, and
one defined on the external world scene to be captured when projected
on the image sensor pixel array.
The camera physical mounting rotation. It is expressed as the angular
difference in degrees between two reference systems, one relative to the
camera module, and one defined on the external world scene to be
captured when projected on the image sensor pixel array.
A camera sensor has a 2-dimensional reference system 'Rc' defined by
its pixel array read-out order. The origin is set to the first pixel
Expand Down

0 comments on commit 568569b

Please sign in to comment.