libcamera: android: Add optional mirrored value for config
diff mbox series

Message ID 20250716204625.3221592-1-ballway@chromium.org
State New
Headers show
Series
  • libcamera: android: Add optional mirrored value for config
Related show

Commit Message

Allen Ballway July 16, 2025, 8:46 p.m. UTC
Adds an optional `mirrored` value to the HAL config, which is used to modify
the `orientation` of the camera config. No rotation is used, so it can
only set the orientation to `Orientation::Rotate0Mirror`.

This enables sensors which are incorrectly mirrored to be corrected.

Signed-off-by: Allen Ballway <ballway@chromium.org>
---
 src/android/camera_device.cpp     |  6 ++++++
 src/android/camera_device.h       |  1 +
 src/android/camera_hal_config.cpp | 14 ++++++++++++++
 src/android/camera_hal_config.h   |  1 +
 4 files changed, 22 insertions(+)

--
2.50.0.727.gbf7dc18ff4-goog

Patch
diff mbox series

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 80ff248c2..b20e9f3db 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -377,6 +377,7 @@  int CameraDevice::initialize(const CameraConfigData *cameraConfigData)
 		orientation_ = 0;
 	}

+	mirrored_ = cameraConfigData && cameraConfigData->mirrored;
 	return capabilities_.initialize(camera_, orientation_, facing_);
 }

@@ -547,6 +548,11 @@  int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
 		return -EINVAL;
 	}

+	// Rotation is unsupported, so if mirrored just set orientation.
+	if (mirrored_) {
+		config->orientation = Orientation::Rotate0Mirror;
+	}
+
 	/*
 	 * Clear and remove any existing configuration from previous calls, and
 	 * ensure the required entries are available without further
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 194ca3030..d304a1285 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -126,6 +126,7 @@  private:

 	int facing_;
 	int orientation_;
+	int mirrored_;

 	CameraMetadata lastSettings_;
 };
diff --git a/src/android/camera_hal_config.cpp b/src/android/camera_hal_config.cpp
index 7ef451ef8..a2beba5d3 100644
--- a/src/android/camera_hal_config.cpp
+++ b/src/android/camera_hal_config.cpp
@@ -33,6 +33,7 @@  private:
 	int parseCameraConfigData(const std::string &cameraId, const YamlObject &);
 	int parseLocation(const YamlObject &, CameraConfigData &cameraConfigData);
 	int parseRotation(const YamlObject &, CameraConfigData &cameraConfigData);
+	int parseMirrored(const YamlObject &, CameraConfigData &cameraConfigData);

 	std::map<std::string, CameraConfigData> *cameras_;
 };
@@ -106,6 +107,9 @@  int CameraHalConfig::Private::parseCameraConfigData(const std::string &cameraId,
 	if (parseRotation(cameraObject, cameraConfigData))
 		return -EINVAL;

+	/* Parse optional property "mirrored" */
+	parseMirrored(cameraObject, cameraConfigData);
+
 	return 0;
 }

@@ -145,6 +149,16 @@  int CameraHalConfig::Private::parseRotation(const YamlObject &cameraObject,
 	return 0;
 }

+int CameraHalConfig::Private::parseMirrored(const YamlObject &cameraObject,
+					    CameraConfigData &cameraConfigData)
+{
+	if (!cameraObject.contains("mirrored"))
+		return -EINVAL;
+
+	cameraConfigData.mirrored = cameraObject["mirrored"].get<bool>(false);
+	return 0;
+}
+
 CameraHalConfig::CameraHalConfig()
 	: Extensible(std::make_unique<Private>()), exists_(false), valid_(false)
 {
diff --git a/src/android/camera_hal_config.h b/src/android/camera_hal_config.h
index a4bedb6e6..a96190470 100644
--- a/src/android/camera_hal_config.h
+++ b/src/android/camera_hal_config.h
@@ -15,6 +15,7 @@ 
 struct CameraConfigData {
 	int facing = -1;
 	int rotation = -1;
+	bool mirrored = false;
 };

 class CameraHalConfig final : public libcamera::Extensible