[libcamera-devel,RFC,v3,08/16] android: Plumb AeEnable control
diff mbox series

Message ID 20210702103800.41291-9-paul.elder@ideasonboard.com
State Superseded
Delegated to: Paul Elder
Headers show
Series
  • Preliminary FULL plumbing
Related show

Commit Message

Paul Elder July 2, 2021, 10:37 a.m. UTC
Plumb the AeEnable control into the HAL for CONTROL_AE_AVAILABLE_MODES
for static metadata, and CONTROL_AE_MODE for result metadata.

Bug: https://bugs.libcamera.org/show_bug.cgi?id=42
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>

---
Changes in v3
- use new setMetadata
- rebase on camera capabilities refactor
---
 src/android/camera_capabilities.cpp | 19 ++++++++++++++-----
 src/android/camera_device.cpp       |  6 ++++--
 2 files changed, 18 insertions(+), 7 deletions(-)

Patch
diff mbox series

diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp
index 530167de..21ba791a 100644
--- a/src/android/camera_capabilities.cpp
+++ b/src/android/camera_capabilities.cpp
@@ -7,6 +7,7 @@ 
 
 #include "camera_capabilities.h"
 
+#include <algorithm>
 #include <array>
 #include <cmath>
 #include <map>
@@ -561,11 +562,19 @@  int CameraCapabilities::initializeStaticMetadata()
 	staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
 				  aeAvailableAntiBandingModes);
 
-	std::vector<uint8_t> aeAvailableModes = {
-		ANDROID_CONTROL_AE_MODE_ON,
-	};
-	staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_MODES,
-				  aeAvailableModes);
+	std::vector<uint8_t> aeModes = setMetadata<uint8_t, bool>(
+		staticMetadata_.get(),
+		ANDROID_CONTROL_AE_AVAILABLE_MODES,
+		controlsInfo, &controls::AeEnable,
+		std::vector<uint8_t>({ ANDROID_CONTROL_AE_MODE_ON }));
+
+	if (std::find(aeModes.begin(), aeModes.end(),
+		      ANDROID_CONTROL_AE_MODE_OFF) == aeModes.end()) {
+		LOG(HAL, Info) << "AE cannot be turned off";
+		hwLevels.erase(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL);
+		/* \todo Double check if this is the correct capability */
+		capabilities.erase(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR);
+	}
 
 	int64_t minFrameDurationNsec = -1;
 	int64_t maxFrameDurationNsec = -1;
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 678cde23..1711f271 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1202,8 +1202,10 @@  CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons
 	value = ANDROID_CONTROL_AE_LOCK_OFF;
 	resultMetadata->addEntry(ANDROID_CONTROL_AE_LOCK, value);
 
-	value = ANDROID_CONTROL_AE_MODE_ON;
-	resultMetadata->addEntry(ANDROID_CONTROL_AE_MODE, value);
+	if (metadata.contains(controls::AeEnable)) {
+		uint8_t aeMode = metadata.get<bool>(controls::AeEnable);
+		resultMetadata->addEntry(ANDROID_CONTROL_AE_MODE, aeMode);
+	}
 
 	if (settings.getEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, &entry))
 		/*