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);