[libcamera-devel] [PATCH v4 12/16] android: Filter preview streams on FPS

Jacopo Mondi jacopo at jmondi.org
Thu Oct 14 19:42:04 CEST 2021


Register as preview streams only streams capable of producing at least
30 FPS.

This requirement comes from inspecting the existing HAL implementation
on Intel IPU3 platform and from inspecting the CTS RecordingTests
results.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/android/camera_capabilities.cpp | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp
index 43ef2ee6ec74..bf82bbf7424e 100644
--- a/src/android/camera_capabilities.cpp
+++ b/src/android/camera_capabilities.cpp
@@ -1279,6 +1279,23 @@ int CameraCapabilities::initializeStaticMetadata()
 	std::vector<uint32_t> availableStreamConfigurations;
 	availableStreamConfigurations.reserve(streamConfigurations_.size() * 4);
 	for (const auto &entry : streamConfigurations_) {
+		/*
+		 * Filter out YUV streams not capable of running at 30 FPS.
+		 *
+		 * This requirement comes from CTS RecordingTest failures most
+		 * probably related to a requirement of the camcoder video
+		 * recording profile. Inspecting the Intel IPU3 HAL
+		 * implementation confirms this but no reference has been found
+		 * in the metadata documentation.
+		 *
+		 * Calculate FPS as CTS does: see
+		 * Camera2SurfaceViewTestCase.java:getSuitableFpsRangeForDuration()
+		 */
+		unsigned int fps = static_cast<unsigned int>
+				   (floor(1e9 / entry.minFrameDurationNsec + 0.05f));
+		if (entry.androidFormat != HAL_PIXEL_FORMAT_BLOB && fps < 30)
+			continue;
+
 		availableStreamConfigurations.push_back(entry.androidFormat);
 		availableStreamConfigurations.push_back(entry.resolution.width);
 		availableStreamConfigurations.push_back(entry.resolution.height);
@@ -1291,6 +1308,11 @@ int CameraCapabilities::initializeStaticMetadata()
 	std::vector<int64_t> minFrameDurations;
 	minFrameDurations.reserve(streamConfigurations_.size() * 4);
 	for (const auto &entry : streamConfigurations_) {
+		unsigned int fps = static_cast<unsigned int>
+				   (floor(1e9 / entry.minFrameDurationNsec + 0.05f));
+		if (entry.androidFormat != HAL_PIXEL_FORMAT_BLOB && fps < 30)
+			continue;
+
 		minFrameDurations.push_back(entry.androidFormat);
 		minFrameDurations.push_back(entry.resolution.width);
 		minFrameDurations.push_back(entry.resolution.height);
-- 
2.33.0



More information about the libcamera-devel mailing list