ITS: handle non 4:3 & 16:9 sensors better

files affects:
  tests/scene1_2/test_yuv_plus_dng.py
  tests/scene1_2/test_yuv_plus_jpeg.py
  tests/scene1_2/test_yuv_plus_raw.py
  tests/scene1_2/test_yuv_plus_raw10.py
  tests/scene1_2/test_yuv_plus_raw12.py
  utils/capture_request_utils.py

bug: 217977349
Change-Id: I48f33a1ba7dc5b252c48c0b6a176f772bbe93338
diff --git a/apps/CameraITS/tests/scene1_2/test_yuv_plus_dng.py b/apps/CameraITS/tests/scene1_2/test_yuv_plus_dng.py
index c632fc9..57edfb9 100644
--- a/apps/CameraITS/tests/scene1_2/test_yuv_plus_dng.py
+++ b/apps/CameraITS/tests/scene1_2/test_yuv_plus_dng.py
@@ -56,8 +56,12 @@
       req = capture_request_utils.auto_capture_request()
       max_dng_size = capture_request_utils.get_available_output_sizes(
           'raw', props)[0]
-      w, h = capture_request_utils.get_available_output_sizes(
-          'yuv', props, MAX_IMG_SIZE, max_dng_size)[0]
+      if capture_request_utils.is_common_aspect_ratio(max_dng_size):
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, MAX_IMG_SIZE, max_dng_size)[0]
+      else:
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, max_size=MAX_IMG_SIZE)[0]
       out_surfaces = [{'format': 'dng'},
                       {'format': 'yuv', 'width': w, 'height': h}]
       cap_dng, cap_yuv = cam.do_capture(req, out_surfaces)
diff --git a/apps/CameraITS/tests/scene1_2/test_yuv_plus_jpeg.py b/apps/CameraITS/tests/scene1_2/test_yuv_plus_jpeg.py
index 6e242ef..87a4bcb 100644
--- a/apps/CameraITS/tests/scene1_2/test_yuv_plus_jpeg.py
+++ b/apps/CameraITS/tests/scene1_2/test_yuv_plus_jpeg.py
@@ -78,8 +78,12 @@
       # Create requests
       max_jpeg_size = capture_request_utils.get_available_output_sizes(
           'jpeg', props)[0]
-      w, h = capture_request_utils.get_available_output_sizes(
-          'yuv', props, MAX_IMG_SIZE, max_jpeg_size)[0]
+      if capture_request_utils.is_common_aspect_ratio(max_jpeg_size):
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, MAX_IMG_SIZE, max_jpeg_size)[0]
+      else:
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, max_size=MAX_IMG_SIZE)[0]
       fmt_yuv = {'format': 'yuv', 'width': w, 'height': h}
       fmt_jpg = {'format': 'jpeg'}
 
diff --git a/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw.py b/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw.py
index 305f418..bb4f8a1 100644
--- a/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw.py
+++ b/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw.py
@@ -70,8 +70,12 @@
 
       max_raw_size = capture_request_utils.get_available_output_sizes(
           'raw', props)[0]
-      w, h = capture_request_utils.get_available_output_sizes(
-          'yuv', props, MAX_IMG_SIZE, max_raw_size)[0]
+      if capture_request_utils.is_common_aspect_ratio(max_raw_size):
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, MAX_IMG_SIZE, max_raw_size)[0]
+      else:
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, max_size=MAX_IMG_SIZE)[0]
       out_surfaces = [{'format': 'raw'},
                       {'format': 'yuv', 'width': w, 'height': h}]
       cap_raw, cap_yuv = cam.do_capture(req, out_surfaces)
diff --git a/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw10.py b/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw10.py
index ec88410..c02e37f 100644
--- a/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw10.py
+++ b/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw10.py
@@ -70,8 +70,12 @@
 
       max_raw10_size = capture_request_utils.get_available_output_sizes(
           'raw10', props)[0]
-      w, h = capture_request_utils.get_available_output_sizes(
-          'yuv', props, MAX_IMG_SIZE, max_raw10_size)[0]
+      if capture_request_utils.is_common_aspect_ratio(max_raw10_size):
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, MAX_IMG_SIZE, max_raw10_size)[0]
+      else:
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, max_size=MAX_IMG_SIZE)[0]
       out_surfaces = [{'format': 'raw10'},
                       {'format': 'yuv', 'width': w, 'height': h}]
       cap_raw, cap_yuv = cam.do_capture(req, out_surfaces)
diff --git a/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw12.py b/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw12.py
index a970de5..8e62a7f 100644
--- a/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw12.py
+++ b/apps/CameraITS/tests/scene1_2/test_yuv_plus_raw12.py
@@ -70,8 +70,12 @@
 
       max_raw12_size = capture_request_utils.get_available_output_sizes(
           'raw12', props)[0]
-      w, h = capture_request_utils.get_available_output_sizes(
-          'yuv', props, MAX_IMG_SIZE, max_raw12_size)[0]
+      if capture_request_utils.is_common_aspect_ratio(max_raw12_size):
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, MAX_IMG_SIZE, max_raw12_size)[0]
+      else:
+        w, h = capture_request_utils.get_available_output_sizes(
+            'yuv', props, max_size=MAX_IMG_SIZE)[0]
       out_surfaces = [{'format': 'raw12'},
                       {'format': 'yuv', 'width': w, 'height': h}]
       cap_raw, cap_yuv = cam.do_capture(req, out_surfaces)
diff --git a/apps/CameraITS/utils/capture_request_utils.py b/apps/CameraITS/utils/capture_request_utils.py
index 4d0ea32..2887925 100644
--- a/apps/CameraITS/utils/capture_request_utils.py
+++ b/apps/CameraITS/utils/capture_request_utils.py
@@ -17,6 +17,24 @@
 import math
 import unittest
 
+COMMON_IMG_ARS = (1.333, 1.778)
+COMMON_IMG_ARS_ATOL = 0.01
+
+
+def is_common_aspect_ratio(size):
+  """Returns if aspect ratio is a 4:3 or 16:9.
+
+  Args:
+    size: tuple of image (w, h)
+
+  Returns:
+    Boolean
+  """
+  for aspect_ratio in COMMON_IMG_ARS:
+    if math.isclose(size[0]/size[1], aspect_ratio, abs_tol=COMMON_IMG_ARS_ATOL):
+      return True
+  return False
+
 
 def auto_capture_request(linear_tonemap=False, props=None):
   """Returns a capture request with everything set to auto.