[libcamera-devel] [PATCH v3 8/8] android: camera_device: Report frame durations

Jacopo Mondi jacopo at jmondi.org
Fri Jun 5 16:10:02 CEST 2020


Report the minimum frame durations for each collected stream
configuration by inspecting the camera reported FrameDurationLimits
property.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/android/camera_device.cpp | 33 +++++++++++++++++++++++++++++----
 src/android/camera_device.h   |  3 ++-
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index bbfc2464c908..fdcbada754f6 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -175,7 +175,7 @@ int CameraDevice::initialize()
 		return ret;
 	}
 
-	ret = initializeStreamConfigurations();
+	ret = initializeStreamConfigurations(properties);
 	camera_->release();
 	return ret;
 }
@@ -186,8 +186,27 @@ int CameraDevice::initialize()
  * stream configurations to be reported to the Android camera framework through
  * the static stream configuration metadata.
  */
-int CameraDevice::initializeStreamConfigurations()
+int CameraDevice::initializeStreamConfigurations(const ControlList &properties)
 {
+	/*
+	 * Collect minimum frame durations from the camera. Default to it
+	 * 33.3 msec if the camera does not report frame duration information.
+	 *
+	 * \todo The frame durations interval reported by the camera through the
+	 * FrameDurationLimits property represents the camera minimum and
+	 * maximum durations, regardless of the currently configured image
+	 * format and resolution. As we are currently missing an API to report
+	 * the frame durations for a specific configuration and Android requires
+	 * the minimum frame duration to be reported per-configuration, as of
+	 * now report the duration value for all supported stream
+	 * configurations.
+	 */
+	int64_t minFrameDuration = 33333333;
+	if (properties.contains(properties::FrameDurationLimits)) {
+		Span<const int32_t> durationLimits = properties.get(properties::FrameDurationLimits);
+		minFrameDuration = static_cast<int64_t>(durationLimits[0]);
+	}
+
 	/*
 	 * Get the maximum output resolutions
 	 * \todo Get this from the camera properties once defined
@@ -316,7 +335,13 @@ int CameraDevice::initializeStreamConfigurations()
 			    status != CameraConfiguration::Valid)
 				continue;
 
-			streamConfigurations_.push_back({ res, camera3Format.scalerFormat });
+			/*
+			 * Default the minimum frame duration and update it
+			 * later.
+			 */
+			streamConfigurations_.push_back({ res,
+							  camera3Format.scalerFormat,
+							  minFrameDuration });
 		}
 	}
 
@@ -691,7 +716,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 		minFrameDurations.push_back(entry.androidScalerCode);
 		minFrameDurations.push_back(entry.resolution.width);
 		minFrameDurations.push_back(entry.resolution.height);
-		minFrameDurations.push_back(33333333);
+		minFrameDurations.push_back(entry.minFrameDuration);
 	}
 	staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
 				  minFrameDurations.data(),
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index ed11410a5577..b689d67263b0 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -66,9 +66,10 @@ private:
 	struct Camera3StreamConfiguration {
 		libcamera::Size resolution;
 		int androidScalerCode;
+		int64_t minFrameDuration;
 	};
 
-	int initializeStreamConfigurations();
+	int initializeStreamConfigurations(const libcamera::ControlList &properties);
 	std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize();
 	void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
 	void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
-- 
2.27.0



More information about the libcamera-devel mailing list