GCH: Override sensor pixel modes with an optimized value.
If all the streams in a stream configuration can be used with the
DEFAULT sensor pixel mode, we always use default sensor pixel mode
as an optimization.
Bug: 269679185
Test: GCA; RobustnessTest.java on cuttlefish
Change-Id: I3eac690d570abe21646b53e07d4e9ca11c1e6781
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/common/hal/aidl_service/aidl_camera_device_session.cc b/common/hal/aidl_service/aidl_camera_device_session.cc
index 8cdb89f..9a69d74 100644
--- a/common/hal/aidl_service/aidl_camera_device_session.cc
+++ b/common/hal/aidl_service/aidl_camera_device_session.cc
@@ -608,8 +608,12 @@
num_pending_first_frame_buffers_ = 0;
google_camera_hal::StreamConfiguration hal_stream_config;
- status_t res = aidl_utils::ConvertToHalStreamConfig(requestedConfiguration,
- &hal_stream_config);
+ StreamConfiguration requestedConfigurationOverriddenSensorPixelModes =
+ requestedConfiguration;
+ aidl_utils::FixSensorPixelModesInStreamConfig(
+ &requestedConfigurationOverriddenSensorPixelModes);
+ status_t res = aidl_utils::ConvertToHalStreamConfig(
+ requestedConfigurationOverriddenSensorPixelModes, &hal_stream_config);
if (res != OK) {
return ScopedAStatus::fromServiceSpecificError(
static_cast<int32_t>(Status::ILLEGAL_ARGUMENT));
diff --git a/common/hal/aidl_service/aidl_camera_provider.cc b/common/hal/aidl_service/aidl_camera_provider.cc
index 7eac3f2..be1ccc7 100644
--- a/common/hal/aidl_service/aidl_camera_provider.cc
+++ b/common/hal/aidl_service/aidl_camera_provider.cc
@@ -301,7 +301,13 @@
devices_stream_configs(configs.size());
status_t res = OK;
size_t c = 0;
- for (auto& config : configs) {
+ std::vector<CameraIdAndStreamCombination> configsWithOverriddenSensorPixelModes =
+ configs;
+ for (auto& config : configsWithOverriddenSensorPixelModes) {
+ aidl_utils::FixSensorPixelModesInStreamConfig(&config.streamConfiguration);
+ }
+
+ for (auto& config : configsWithOverriddenSensorPixelModes) {
res = aidl_utils::ConvertToHalStreamConfig(
config.streamConfiguration,
&devices_stream_configs[c].stream_configuration);
@@ -317,7 +323,7 @@
res = google_camera_provider_->IsConcurrentStreamCombinationSupported(
devices_stream_configs, supported);
if (res != OK) {
- ALOGE("%s: ConverToHalStreamConfig failed", __FUNCTION__);
+ ALOGE("%s: IsConcurrentStreamCombinationSupported failed", __FUNCTION__);
return ScopedAStatus::fromServiceSpecificError(
static_cast<int32_t>(Status::INTERNAL_ERROR));
}
diff --git a/common/hal/aidl_service/aidl_utils.cc b/common/hal/aidl_service/aidl_utils.cc
index a7250fc..4a673b6 100644
--- a/common/hal/aidl_service/aidl_utils.cc
+++ b/common/hal/aidl_service/aidl_utils.cc
@@ -893,6 +893,34 @@
return false;
}
+void FixSensorPixelModesInStreamConfig(
+ StreamConfiguration* out_aidl_stream_config) {
+ if (out_aidl_stream_config == nullptr) {
+ ALOGE("%s: input stream config is NULL", __FUNCTION__);
+ return;
+ }
+
+ // Get the sensor pixel modes in the stream config, do one pass and check if
+ // default is present in all.
+ using SensorPixelMode =
+ aidl::android::hardware::camera::metadata::SensorPixelMode;
+ for (const auto& stream : out_aidl_stream_config->streams) {
+ const auto& sensorPixelModes = stream.sensorPixelModesUsed;
+ if ((std::count(sensorPixelModes.begin(), sensorPixelModes.end(),
+ static_cast<SensorPixelMode>(
+ ANDROID_SENSOR_PIXEL_MODE_DEFAULT)) == 0)) {
+ return;
+ }
+ }
+
+ // All of them contain DEFAULT, just override them to be default only.
+ for (auto& stream : out_aidl_stream_config->streams) {
+ stream.sensorPixelModesUsed.clear();
+ stream.sensorPixelModesUsed.push_back(
+ static_cast<SensorPixelMode>(ANDROID_SENSOR_PIXEL_MODE_DEFAULT));
+ }
+}
+
status_t ConvertToHalStreamConfig(
const StreamConfiguration& aidl_stream_config,
google_camera_hal::StreamConfiguration* hal_stream_config) {
diff --git a/common/hal/aidl_service/aidl_utils.h b/common/hal/aidl_service/aidl_utils.h
index 05873f3..be7e6a5 100644
--- a/common/hal/aidl_service/aidl_utils.h
+++ b/common/hal/aidl_service/aidl_utils.h
@@ -162,6 +162,11 @@
const std::vector<BufferCache>& aidl_buffer_caches,
std::vector<google_camera_hal::BufferCache>* hal_buffer_caches);
+// Optimize sensor pixel modes list: If all streams' sensor pixel modes
+// list contains DEFAULT, just override them to DEFAULT only.
+void FixSensorPixelModesInStreamConfig(
+ StreamConfiguration* out_aidl_stream_config);
+
status_t ConvertToHalStreamConfig(
const StreamConfiguration& aidl_stream_config,
google_camera_hal::StreamConfiguration* hal_stream_config);