From 857a216fd5b32f2a275262a03a16317d689eca7c Mon Sep 17 00:00:00 2001
From: Jacopo Mondi <jacopo@jmondi.org>
Date: Wed, 20 Nov 2019 17:00:49 +0100
Subject: android: camera_device: Use Camera properties for static Metadata
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Construct two example static metadata to be reported to the Android
framework using the properties reported by the Camera.

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/android/camera_device.cpp | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

(limited to 'src')

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index b460d499..76af70eb 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -8,6 +8,9 @@
 #include "camera_device.h"
 #include "camera_ops.h"
 
+#include <libcamera/controls.h>
+#include <libcamera/property_ids.h>
+
 #include "log.h"
 #include "utils.h"
 
@@ -109,6 +112,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	if (staticMetadata_)
 		return staticMetadata_->get();
 
+	const ControlList &properties = camera_->properties();
+
 	/*
 	 * The here reported metadata are enough to implement a basic capture
 	 * example application, but a real camera implementation will require
@@ -273,9 +278,15 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	staticMetadata_->addEntry(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
 				  &exposureTimeRange, 2);
 
+	/*
+	 * The Android orientation metadata and libcamera rotation property are
+	 * defined differently but have identical numerical values for Android
+	 * devices such as phones and tablets.
+	 */
 	int32_t orientation = 0;
-	staticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION,
-				  &orientation, 1);
+	if (properties.contains(properties::Rotation))
+		orientation = properties.get(properties::Rotation);
+	staticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION, &orientation, 1);
 
 	std::vector<int32_t> testPatterModes = {
 		ANDROID_SENSOR_TEST_PATTERN_MODE_OFF,
@@ -322,6 +333,20 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 				  lensApertures.size());
 
 	uint8_t lensFacing = ANDROID_LENS_FACING_FRONT;
+	if (properties.contains(properties::Location)) {
+		int32_t location = properties.get(properties::Location);
+		switch (location) {
+		case properties::CameraLocationFront:
+			lensFacing = ANDROID_LENS_FACING_FRONT;
+			break;
+		case properties::CameraLocationBack:
+			lensFacing = ANDROID_LENS_FACING_BACK;
+			break;
+		case properties::CameraLocationExternal:
+			lensFacing = ANDROID_LENS_FACING_EXTERNAL;
+			break;
+		}
+	}
 	staticMetadata_->addEntry(ANDROID_LENS_FACING, &lensFacing, 1);
 
 	std::vector<float> lensFocalLenghts = {
-- 
cgit v1.2.1