Only provide templates for supported capabilities
Plugs in the StaticProperties class for ease of accessing the
static metadata.
Expands StaticProperties to handle checking template support.
Test: Unit tests pass, test app runs, fixes 2 failing CTS tests on rpi3
BUG: b/32951283
Change-Id: I3077a3507751c3072b88f7d91902bdaa5b53c30e
diff --git a/modules/camera/3_4/static_properties.cpp b/modules/camera/3_4/static_properties.cpp
index 0584290..b075e6e 100644
--- a/modules/camera/3_4/static_properties.cpp
+++ b/modules/camera/3_4/static_properties.cpp
@@ -19,14 +19,15 @@
// #define LOG_NDEBUG 0
#define LOG_TAG "StaticProperties"
#include <cutils/log.h>
+#include <hardware/camera3.h>
#include <system/camera.h>
#include "metadata/metadata_reader.h"
namespace default_camera_hal {
-// Build and capabilities from configs + stall durations.
-static bool ConstructCapabilities(
+// Build stream capabilities from configs + stall durations.
+static bool ConstructStreamCapabilities(
const std::vector<StreamConfiguration>& configs,
const std::vector<StreamStallDuration>& stalls,
StaticProperties::CapabilitiesMap* capabilities) {
@@ -59,7 +60,7 @@
// Check that each output config has a valid corresponding stall duration
// (extra durations not matching any output config are ignored).
-static bool ValidateCapabilities(
+static bool ValidateStreamCapabilities(
StaticProperties::CapabilitiesMap capabilities) {
for (const auto& spec_capabilities : capabilities) {
// Only non-negative stall durations are valid. This should only happen
@@ -146,9 +147,10 @@
int32_t max_raw_output_streams = 0;
int32_t max_non_stalling_output_streams = 0;
int32_t max_stalling_output_streams = 0;
+ std::set<uint8_t> request_capabilities;
std::vector<StreamConfiguration> configs;
std::vector<StreamStallDuration> stalls;
- CapabilitiesMap capabilities;
+ CapabilitiesMap stream_capabilities;
ReprocessFormatMap reprocess_map;
// If reading any data returns an error, something is wrong.
@@ -158,18 +160,19 @@
metadata_reader->MaxOutputStreams(&max_raw_output_streams,
&max_non_stalling_output_streams,
&max_stalling_output_streams) ||
+ metadata_reader->RequestCapabilities(&request_capabilities) ||
metadata_reader->StreamConfigurations(&configs) ||
metadata_reader->StreamStallDurations(&stalls) ||
- !ConstructCapabilities(configs, stalls, &capabilities) ||
+ !ConstructStreamCapabilities(configs, stalls, &stream_capabilities) ||
// MetadataReader validates configs and stall seperately,
// but not that they match.
- !ValidateCapabilities(capabilities) ||
+ !ValidateStreamCapabilities(stream_capabilities) ||
// Reprocessing metadata only necessary if input streams are allowed.
(max_input_streams > 0 &&
(metadata_reader->ReprocessFormats(&reprocess_map) ||
// MetadataReader validates configs and the reprocess map seperately,
// but not that they match.
- !ValidateReprocessFormats(capabilities, reprocess_map)))) {
+ !ValidateReprocessFormats(stream_capabilities, reprocess_map)))) {
return nullptr;
}
@@ -180,7 +183,8 @@
max_raw_output_streams,
max_non_stalling_output_streams,
max_stalling_output_streams,
- std::move(capabilities),
+ std::move(request_capabilities),
+ std::move(stream_capabilities),
std::move(reprocess_map));
}
@@ -192,6 +196,7 @@
int32_t max_raw_output_streams,
int32_t max_non_stalling_output_streams,
int32_t max_stalling_output_streams,
+ std::set<uint8_t> request_capabilities,
CapabilitiesMap stream_capabilities,
ReprocessFormatMap supported_reprocess_outputs)
: metadata_reader_(std::move(metadata_reader)),
@@ -201,9 +206,33 @@
max_raw_output_streams_(max_raw_output_streams),
max_non_stalling_output_streams_(max_non_stalling_output_streams),
max_stalling_output_streams_(max_stalling_output_streams),
+ request_capabilities_(std::move(request_capabilities)),
stream_capabilities_(std::move(stream_capabilities)),
supported_reprocess_outputs_(std::move(supported_reprocess_outputs)) {}
+bool StaticProperties::TemplateSupported(int type) {
+ uint8_t required_capability = 0;
+ switch (type) {
+ case CAMERA3_TEMPLATE_PREVIEW:
+ // Preview is always supported.
+ return true;
+ case CAMERA3_TEMPLATE_MANUAL:
+ required_capability =
+ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR;
+ break;
+ case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
+ required_capability =
+ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING;
+ break;
+ default:
+ required_capability =
+ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE;
+ return true;
+ }
+
+ return request_capabilities_.count(required_capability) > 0;
+}
+
// Helper functions for checking stream properties when verifying support.
static bool IsInputType(int stream_type) {
return stream_type == CAMERA3_STREAM_INPUT ||