android: Filter preview streams on FPS

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@jmondi.org>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Jacopo Mondi 2021-07-03 14:51:07 +02:00
parent 5d3d666465
commit f78f714b44

View file

@ -1279,6 +1279,23 @@ int CameraCapabilities::initializeStaticMetadata()
std::vector<uint32_t> availableStreamConfigurations; std::vector<uint32_t> availableStreamConfigurations;
availableStreamConfigurations.reserve(streamConfigurations_.size() * 4); availableStreamConfigurations.reserve(streamConfigurations_.size() * 4);
for (const auto &entry : streamConfigurations_) { 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.androidFormat);
availableStreamConfigurations.push_back(entry.resolution.width); availableStreamConfigurations.push_back(entry.resolution.width);
availableStreamConfigurations.push_back(entry.resolution.height); availableStreamConfigurations.push_back(entry.resolution.height);
@ -1291,6 +1308,11 @@ int CameraCapabilities::initializeStaticMetadata()
std::vector<int64_t> minFrameDurations; std::vector<int64_t> minFrameDurations;
minFrameDurations.reserve(streamConfigurations_.size() * 4); minFrameDurations.reserve(streamConfigurations_.size() * 4);
for (const auto &entry : streamConfigurations_) { 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.androidFormat);
minFrameDurations.push_back(entry.resolution.width); minFrameDurations.push_back(entry.resolution.width);
minFrameDurations.push_back(entry.resolution.height); minFrameDurations.push_back(entry.resolution.height);