xref: /aosp_15_r20/cts/apps/CameraITS/utils/camera_properties_utils.py (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker# Copyright 2014 The Android Open Source Project
2*b7c941bbSAndroid Build Coastguard Worker#
3*b7c941bbSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*b7c941bbSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*b7c941bbSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*b7c941bbSAndroid Build Coastguard Worker#
7*b7c941bbSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*b7c941bbSAndroid Build Coastguard Worker#
9*b7c941bbSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*b7c941bbSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*b7c941bbSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*b7c941bbSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*b7c941bbSAndroid Build Coastguard Worker# limitations under the License.
14*b7c941bbSAndroid Build Coastguard Worker"""Utility functions to determine what functionality the camera supports."""
15*b7c941bbSAndroid Build Coastguard Worker
16*b7c941bbSAndroid Build Coastguard Worker
17*b7c941bbSAndroid Build Coastguard Workerimport logging
18*b7c941bbSAndroid Build Coastguard Workerimport math
19*b7c941bbSAndroid Build Coastguard Workerimport types
20*b7c941bbSAndroid Build Coastguard Worker
21*b7c941bbSAndroid Build Coastguard Workerfrom mobly import asserts
22*b7c941bbSAndroid Build Coastguard Workerimport numpy as np
23*b7c941bbSAndroid Build Coastguard Worker
24*b7c941bbSAndroid Build Coastguard Workerimport capture_request_utils
25*b7c941bbSAndroid Build Coastguard Worker
26*b7c941bbSAndroid Build Coastguard WorkerFD_CAL_RTOL = 0.20
27*b7c941bbSAndroid Build Coastguard WorkerLENS_FACING = types.MappingProxyType({'FRONT': 0, 'BACK': 1, 'EXTERNAL': 2})
28*b7c941bbSAndroid Build Coastguard WorkerMULTI_CAMERA_SYNC_CALIBRATED = 1
29*b7c941bbSAndroid Build Coastguard WorkerNUM_DISTORTION_PARAMS = 5  # number of terms in lens.distortion
30*b7c941bbSAndroid Build Coastguard WorkerNUM_INTRINSIC_CAL_PARAMS = 5  # number of terms in intrinsic calibration
31*b7c941bbSAndroid Build Coastguard WorkerNUM_POSE_ROTATION_PARAMS = 4  # number of terms in poseRotation
32*b7c941bbSAndroid Build Coastguard WorkerNUM_POSE_TRANSLATION_PARAMS = 3  # number of terms in poseTranslation
33*b7c941bbSAndroid Build Coastguard WorkerSKIP_RET_MSG = 'Test skipped'
34*b7c941bbSAndroid Build Coastguard WorkerSOLID_COLOR_TEST_PATTERN = 1
35*b7c941bbSAndroid Build Coastguard WorkerCOLOR_BARS_TEST_PATTERN = 2
36*b7c941bbSAndroid Build Coastguard WorkerUSE_CASE_STILL_CAPTURE = 2
37*b7c941bbSAndroid Build Coastguard WorkerDEFAULT_AE_TARGET_FPS_RANGE = (15, 30)
38*b7c941bbSAndroid Build Coastguard WorkerCOLOR_SPACES = [
39*b7c941bbSAndroid Build Coastguard Worker    'SRGB', 'LINEAR_SRGB', 'EXTENDED_SRGB',
40*b7c941bbSAndroid Build Coastguard Worker    'LINEAR_EXTENDED_SRGB', 'BT709', 'BT2020',
41*b7c941bbSAndroid Build Coastguard Worker    'DCI_P3', 'DISPLAY_P3', 'NTSC_1953', 'SMPTE_C',
42*b7c941bbSAndroid Build Coastguard Worker    'ADOBE_RGB', 'PRO_PHOTO_RGB', 'ACES', 'ACESCG',
43*b7c941bbSAndroid Build Coastguard Worker    'CIE_XYZ', 'CIE_LAB', 'BT2020_HLG', 'BT2020_PQ'
44*b7c941bbSAndroid Build Coastguard Worker]
45*b7c941bbSAndroid Build Coastguard WorkerSETTINGS_OVERRIDE_ZOOM = 1
46*b7c941bbSAndroid Build Coastguard WorkerSTABILIZATION_MODE_OFF = 0
47*b7c941bbSAndroid Build Coastguard WorkerSTABILIZATION_MODE_PREVIEW = 2
48*b7c941bbSAndroid Build Coastguard WorkerLENS_OPTICAL_STABILIZATION_MODE_ON = 1
49*b7c941bbSAndroid Build Coastguard Worker
50*b7c941bbSAndroid Build Coastguard Worker_M_TO_CM = 100
51*b7c941bbSAndroid Build Coastguard Worker
52*b7c941bbSAndroid Build Coastguard Worker
53*b7c941bbSAndroid Build Coastguard Workerdef log_minimum_focus_distance(props):
54*b7c941bbSAndroid Build Coastguard Worker  """Log the minimum focus distance for debugging AF issues.
55*b7c941bbSAndroid Build Coastguard Worker
56*b7c941bbSAndroid Build Coastguard Worker  Args:
57*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
58*b7c941bbSAndroid Build Coastguard Worker  """
59*b7c941bbSAndroid Build Coastguard Worker  min_fd_diopters = props['android.lens.info.minimumFocusDistance']
60*b7c941bbSAndroid Build Coastguard Worker  if min_fd_diopters:  # not equal to 0
61*b7c941bbSAndroid Build Coastguard Worker    min_fd_cm = 1 / min_fd_diopters * _M_TO_CM
62*b7c941bbSAndroid Build Coastguard Worker    logging.debug('Minimum focus distance (cm): %.2f', min_fd_cm)
63*b7c941bbSAndroid Build Coastguard Worker  else:
64*b7c941bbSAndroid Build Coastguard Worker    logging.debug('Fixed focus camera')
65*b7c941bbSAndroid Build Coastguard Worker
66*b7c941bbSAndroid Build Coastguard Worker
67*b7c941bbSAndroid Build Coastguard Workerdef check_front_or_rear_camera(props):
68*b7c941bbSAndroid Build Coastguard Worker  """Raises an error if not LENS_FACING FRONT or BACK.
69*b7c941bbSAndroid Build Coastguard Worker
70*b7c941bbSAndroid Build Coastguard Worker  Args:
71*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
72*b7c941bbSAndroid Build Coastguard Worker
73*b7c941bbSAndroid Build Coastguard Worker  Raises:
74*b7c941bbSAndroid Build Coastguard Worker    assertionError if not front or rear camera.
75*b7c941bbSAndroid Build Coastguard Worker  """
76*b7c941bbSAndroid Build Coastguard Worker  facing = props['android.lens.facing']
77*b7c941bbSAndroid Build Coastguard Worker  if not (facing == LENS_FACING['BACK'] or facing == LENS_FACING['FRONT']):
78*b7c941bbSAndroid Build Coastguard Worker    raise AssertionError('Unknown lens facing: {facing}.')
79*b7c941bbSAndroid Build Coastguard Worker
80*b7c941bbSAndroid Build Coastguard Worker
81*b7c941bbSAndroid Build Coastguard Workerdef legacy(props):
82*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device is a LEGACY capability camera2 device.
83*b7c941bbSAndroid Build Coastguard Worker
84*b7c941bbSAndroid Build Coastguard Worker  Args:
85*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
86*b7c941bbSAndroid Build Coastguard Worker
87*b7c941bbSAndroid Build Coastguard Worker  Returns:
88*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device is a LEGACY camera.
89*b7c941bbSAndroid Build Coastguard Worker  """
90*b7c941bbSAndroid Build Coastguard Worker  return props.get('android.info.supportedHardwareLevel') == 2
91*b7c941bbSAndroid Build Coastguard Worker
92*b7c941bbSAndroid Build Coastguard Worker
93*b7c941bbSAndroid Build Coastguard Workerdef limited(props):
94*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device is a LIMITED capability camera2 device.
95*b7c941bbSAndroid Build Coastguard Worker
96*b7c941bbSAndroid Build Coastguard Worker  Args:
97*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
98*b7c941bbSAndroid Build Coastguard Worker
99*b7c941bbSAndroid Build Coastguard Worker  Returns:
100*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if device is a LIMITED camera.
101*b7c941bbSAndroid Build Coastguard Worker  """
102*b7c941bbSAndroid Build Coastguard Worker  return props.get('android.info.supportedHardwareLevel') == 0
103*b7c941bbSAndroid Build Coastguard Worker
104*b7c941bbSAndroid Build Coastguard Worker
105*b7c941bbSAndroid Build Coastguard Workerdef full_or_better(props):
106*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device is a FULL or better camera2 device.
107*b7c941bbSAndroid Build Coastguard Worker
108*b7c941bbSAndroid Build Coastguard Worker  Args:
109*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
110*b7c941bbSAndroid Build Coastguard Worker
111*b7c941bbSAndroid Build Coastguard Worker  Returns:
112*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if device is FULL or LEVEL3 camera.
113*b7c941bbSAndroid Build Coastguard Worker  """
114*b7c941bbSAndroid Build Coastguard Worker  return (props.get('android.info.supportedHardwareLevel') >= 1 and
115*b7c941bbSAndroid Build Coastguard Worker          props.get('android.info.supportedHardwareLevel') != 2)
116*b7c941bbSAndroid Build Coastguard Worker
117*b7c941bbSAndroid Build Coastguard Worker
118*b7c941bbSAndroid Build Coastguard Workerdef level3(props):
119*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device is a LEVEL3 capability camera2 device.
120*b7c941bbSAndroid Build Coastguard Worker
121*b7c941bbSAndroid Build Coastguard Worker  Args:
122*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
123*b7c941bbSAndroid Build Coastguard Worker
124*b7c941bbSAndroid Build Coastguard Worker  Returns:
125*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device is LEVEL3 camera.
126*b7c941bbSAndroid Build Coastguard Worker  """
127*b7c941bbSAndroid Build Coastguard Worker  return props.get('android.info.supportedHardwareLevel') == 3
128*b7c941bbSAndroid Build Coastguard Worker
129*b7c941bbSAndroid Build Coastguard Worker
130*b7c941bbSAndroid Build Coastguard Workerdef manual_sensor(props):
131*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports MANUAL_SENSOR capabilities.
132*b7c941bbSAndroid Build Coastguard Worker
133*b7c941bbSAndroid Build Coastguard Worker  Args:
134*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
135*b7c941bbSAndroid Build Coastguard Worker
136*b7c941bbSAndroid Build Coastguard Worker  Returns:
137*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if devices supports MANUAL_SENSOR capabilities.
138*b7c941bbSAndroid Build Coastguard Worker  """
139*b7c941bbSAndroid Build Coastguard Worker  return 1 in props.get('android.request.availableCapabilities', [])
140*b7c941bbSAndroid Build Coastguard Worker
141*b7c941bbSAndroid Build Coastguard Worker
142*b7c941bbSAndroid Build Coastguard Workerdef manual_post_proc(props):
143*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports MANUAL_POST_PROCESSING capabilities.
144*b7c941bbSAndroid Build Coastguard Worker
145*b7c941bbSAndroid Build Coastguard Worker  Args:
146*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
147*b7c941bbSAndroid Build Coastguard Worker
148*b7c941bbSAndroid Build Coastguard Worker  Returns:
149*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports MANUAL_POST_PROCESSING capabilities.
150*b7c941bbSAndroid Build Coastguard Worker  """
151*b7c941bbSAndroid Build Coastguard Worker  return 2 in props.get('android.request.availableCapabilities', [])
152*b7c941bbSAndroid Build Coastguard Worker
153*b7c941bbSAndroid Build Coastguard Worker
154*b7c941bbSAndroid Build Coastguard Workerdef raw(props):
155*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports RAW capabilities.
156*b7c941bbSAndroid Build Coastguard Worker
157*b7c941bbSAndroid Build Coastguard Worker  Args:
158*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
159*b7c941bbSAndroid Build Coastguard Worker
160*b7c941bbSAndroid Build Coastguard Worker  Returns:
161*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports RAW capabilities.
162*b7c941bbSAndroid Build Coastguard Worker  """
163*b7c941bbSAndroid Build Coastguard Worker  return 3 in props.get('android.request.availableCapabilities', [])
164*b7c941bbSAndroid Build Coastguard Worker
165*b7c941bbSAndroid Build Coastguard Worker
166*b7c941bbSAndroid Build Coastguard Workerdef sensor_fusion(props):
167*b7c941bbSAndroid Build Coastguard Worker  """Checks the camera and motion sensor timestamps.
168*b7c941bbSAndroid Build Coastguard Worker
169*b7c941bbSAndroid Build Coastguard Worker  Returns whether the camera and motion sensor timestamps for the device
170*b7c941bbSAndroid Build Coastguard Worker  are in the same time domain and can be compared directly.
171*b7c941bbSAndroid Build Coastguard Worker
172*b7c941bbSAndroid Build Coastguard Worker  Args:
173*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
174*b7c941bbSAndroid Build Coastguard Worker
175*b7c941bbSAndroid Build Coastguard Worker  Returns:
176*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if camera and motion sensor timestamps in same time domain.
177*b7c941bbSAndroid Build Coastguard Worker  """
178*b7c941bbSAndroid Build Coastguard Worker  return props.get('android.sensor.info.timestampSource') == 1
179*b7c941bbSAndroid Build Coastguard Worker
180*b7c941bbSAndroid Build Coastguard Worker
181*b7c941bbSAndroid Build Coastguard Workerdef burst_capture_capable(props):
182*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports burst capture.
183*b7c941bbSAndroid Build Coastguard Worker
184*b7c941bbSAndroid Build Coastguard Worker  Args:
185*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
186*b7c941bbSAndroid Build Coastguard Worker
187*b7c941bbSAndroid Build Coastguard Worker  Returns:
188*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if the device supports burst capture.
189*b7c941bbSAndroid Build Coastguard Worker  """
190*b7c941bbSAndroid Build Coastguard Worker  return 6 in props.get('android.request.availableCapabilities', [])
191*b7c941bbSAndroid Build Coastguard Worker
192*b7c941bbSAndroid Build Coastguard Worker
193*b7c941bbSAndroid Build Coastguard Workerdef logical_multi_camera(props):
194*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device is a logical multi-camera.
195*b7c941bbSAndroid Build Coastguard Worker
196*b7c941bbSAndroid Build Coastguard Worker  Args:
197*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
198*b7c941bbSAndroid Build Coastguard Worker
199*b7c941bbSAndroid Build Coastguard Worker  Returns:
200*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if the device is a logical multi-camera.
201*b7c941bbSAndroid Build Coastguard Worker  """
202*b7c941bbSAndroid Build Coastguard Worker  return 11 in props.get('android.request.availableCapabilities', [])
203*b7c941bbSAndroid Build Coastguard Worker
204*b7c941bbSAndroid Build Coastguard Worker
205*b7c941bbSAndroid Build Coastguard Workerdef logical_multi_camera_physical_ids(props):
206*b7c941bbSAndroid Build Coastguard Worker  """Returns a logical multi-camera's underlying physical cameras.
207*b7c941bbSAndroid Build Coastguard Worker
208*b7c941bbSAndroid Build Coastguard Worker  Args:
209*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
210*b7c941bbSAndroid Build Coastguard Worker
211*b7c941bbSAndroid Build Coastguard Worker  Returns:
212*b7c941bbSAndroid Build Coastguard Worker    list of physical cameras backing the logical multi-camera.
213*b7c941bbSAndroid Build Coastguard Worker  """
214*b7c941bbSAndroid Build Coastguard Worker  physical_ids_list = []
215*b7c941bbSAndroid Build Coastguard Worker  if logical_multi_camera(props):
216*b7c941bbSAndroid Build Coastguard Worker    physical_ids_list = props['camera.characteristics.physicalCamIds']
217*b7c941bbSAndroid Build Coastguard Worker  return physical_ids_list
218*b7c941bbSAndroid Build Coastguard Worker
219*b7c941bbSAndroid Build Coastguard Worker
220*b7c941bbSAndroid Build Coastguard Workerdef skip_unless(cond, msg=None):
221*b7c941bbSAndroid Build Coastguard Worker  """Skips the test if the condition is false.
222*b7c941bbSAndroid Build Coastguard Worker
223*b7c941bbSAndroid Build Coastguard Worker  If a test is skipped, then it is exited and returns the special code
224*b7c941bbSAndroid Build Coastguard Worker  of 101 to the calling shell, which can be used by an external test
225*b7c941bbSAndroid Build Coastguard Worker  harness to differentiate a skip from a pass or fail.
226*b7c941bbSAndroid Build Coastguard Worker
227*b7c941bbSAndroid Build Coastguard Worker  Args:
228*b7c941bbSAndroid Build Coastguard Worker    cond: Boolean, which must be true for the test to not skip.
229*b7c941bbSAndroid Build Coastguard Worker    msg: String, reason for test to skip
230*b7c941bbSAndroid Build Coastguard Worker
231*b7c941bbSAndroid Build Coastguard Worker  Returns:
232*b7c941bbSAndroid Build Coastguard Worker     Nothing.
233*b7c941bbSAndroid Build Coastguard Worker  """
234*b7c941bbSAndroid Build Coastguard Worker  if not cond:
235*b7c941bbSAndroid Build Coastguard Worker    skip_msg = SKIP_RET_MSG if not msg else f'{SKIP_RET_MSG}: {msg}'
236*b7c941bbSAndroid Build Coastguard Worker    asserts.skip(skip_msg)
237*b7c941bbSAndroid Build Coastguard Worker
238*b7c941bbSAndroid Build Coastguard Worker
239*b7c941bbSAndroid Build Coastguard Workerdef backward_compatible(props):
240*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports BACKWARD_COMPATIBLE.
241*b7c941bbSAndroid Build Coastguard Worker
242*b7c941bbSAndroid Build Coastguard Worker  Args:
243*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
244*b7c941bbSAndroid Build Coastguard Worker
245*b7c941bbSAndroid Build Coastguard Worker  Returns:
246*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if the devices supports BACKWARD_COMPATIBLE.
247*b7c941bbSAndroid Build Coastguard Worker  """
248*b7c941bbSAndroid Build Coastguard Worker  return 0 in props.get('android.request.availableCapabilities', [])
249*b7c941bbSAndroid Build Coastguard Worker
250*b7c941bbSAndroid Build Coastguard Worker
251*b7c941bbSAndroid Build Coastguard Workerdef lens_calibrated(props):
252*b7c941bbSAndroid Build Coastguard Worker  """Returns whether lens position is calibrated or not.
253*b7c941bbSAndroid Build Coastguard Worker
254*b7c941bbSAndroid Build Coastguard Worker  android.lens.info.focusDistanceCalibration has 3 modes.
255*b7c941bbSAndroid Build Coastguard Worker  0: Uncalibrated
256*b7c941bbSAndroid Build Coastguard Worker  1: Approximate
257*b7c941bbSAndroid Build Coastguard Worker  2: Calibrated
258*b7c941bbSAndroid Build Coastguard Worker
259*b7c941bbSAndroid Build Coastguard Worker  Args:
260*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties objects.
261*b7c941bbSAndroid Build Coastguard Worker
262*b7c941bbSAndroid Build Coastguard Worker  Returns:
263*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if lens is CALIBRATED.
264*b7c941bbSAndroid Build Coastguard Worker  """
265*b7c941bbSAndroid Build Coastguard Worker  return 'android.lens.info.focusDistanceCalibration' in props and props[
266*b7c941bbSAndroid Build Coastguard Worker      'android.lens.info.focusDistanceCalibration'] == 2
267*b7c941bbSAndroid Build Coastguard Worker
268*b7c941bbSAndroid Build Coastguard Worker
269*b7c941bbSAndroid Build Coastguard Workerdef lens_approx_calibrated(props):
270*b7c941bbSAndroid Build Coastguard Worker  """Returns whether lens position is calibrated or not.
271*b7c941bbSAndroid Build Coastguard Worker
272*b7c941bbSAndroid Build Coastguard Worker  android.lens.info.focusDistanceCalibration has 3 modes.
273*b7c941bbSAndroid Build Coastguard Worker  0: Uncalibrated
274*b7c941bbSAndroid Build Coastguard Worker  1: Approximate
275*b7c941bbSAndroid Build Coastguard Worker  2: Calibrated
276*b7c941bbSAndroid Build Coastguard Worker
277*b7c941bbSAndroid Build Coastguard Worker  Args:
278*b7c941bbSAndroid Build Coastguard Worker   props: Camera properties objects.
279*b7c941bbSAndroid Build Coastguard Worker
280*b7c941bbSAndroid Build Coastguard Worker  Returns:
281*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if lens is APPROXIMATE or CALIBRATED.
282*b7c941bbSAndroid Build Coastguard Worker  """
283*b7c941bbSAndroid Build Coastguard Worker  return props.get('android.lens.info.focusDistanceCalibration') in [1, 2]
284*b7c941bbSAndroid Build Coastguard Worker
285*b7c941bbSAndroid Build Coastguard Worker
286*b7c941bbSAndroid Build Coastguard Workerdef raw10(props):
287*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports RAW10 capabilities.
288*b7c941bbSAndroid Build Coastguard Worker
289*b7c941bbSAndroid Build Coastguard Worker  Args:
290*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
291*b7c941bbSAndroid Build Coastguard Worker
292*b7c941bbSAndroid Build Coastguard Worker  Returns:
293*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports RAW10 capabilities.
294*b7c941bbSAndroid Build Coastguard Worker  """
295*b7c941bbSAndroid Build Coastguard Worker  if capture_request_utils.get_available_output_sizes('raw10', props):
296*b7c941bbSAndroid Build Coastguard Worker    return True
297*b7c941bbSAndroid Build Coastguard Worker  return False
298*b7c941bbSAndroid Build Coastguard Worker
299*b7c941bbSAndroid Build Coastguard Worker
300*b7c941bbSAndroid Build Coastguard Workerdef raw12(props):
301*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports RAW12 capabilities.
302*b7c941bbSAndroid Build Coastguard Worker
303*b7c941bbSAndroid Build Coastguard Worker  Args:
304*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
305*b7c941bbSAndroid Build Coastguard Worker
306*b7c941bbSAndroid Build Coastguard Worker  Returns:
307*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports RAW12 capabilities.
308*b7c941bbSAndroid Build Coastguard Worker  """
309*b7c941bbSAndroid Build Coastguard Worker  if capture_request_utils.get_available_output_sizes('raw12', props):
310*b7c941bbSAndroid Build Coastguard Worker    return True
311*b7c941bbSAndroid Build Coastguard Worker  return False
312*b7c941bbSAndroid Build Coastguard Worker
313*b7c941bbSAndroid Build Coastguard Worker
314*b7c941bbSAndroid Build Coastguard Workerdef raw16(props):
315*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports RAW16 output.
316*b7c941bbSAndroid Build Coastguard Worker
317*b7c941bbSAndroid Build Coastguard Worker  Args:
318*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
319*b7c941bbSAndroid Build Coastguard Worker
320*b7c941bbSAndroid Build Coastguard Worker  Returns:
321*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports RAW16 capabilities.
322*b7c941bbSAndroid Build Coastguard Worker  """
323*b7c941bbSAndroid Build Coastguard Worker  if capture_request_utils.get_available_output_sizes('raw', props):
324*b7c941bbSAndroid Build Coastguard Worker    return True
325*b7c941bbSAndroid Build Coastguard Worker  return False
326*b7c941bbSAndroid Build Coastguard Worker
327*b7c941bbSAndroid Build Coastguard Worker
328*b7c941bbSAndroid Build Coastguard Workerdef raw_output(props):
329*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports any of the RAW output formats.
330*b7c941bbSAndroid Build Coastguard Worker
331*b7c941bbSAndroid Build Coastguard Worker  Args:
332*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
333*b7c941bbSAndroid Build Coastguard Worker
334*b7c941bbSAndroid Build Coastguard Worker  Returns:
335*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports any of the RAW output formats
336*b7c941bbSAndroid Build Coastguard Worker  """
337*b7c941bbSAndroid Build Coastguard Worker  return raw16(props) or raw10(props) or raw12(props)
338*b7c941bbSAndroid Build Coastguard Worker
339*b7c941bbSAndroid Build Coastguard Worker
340*b7c941bbSAndroid Build Coastguard Workerdef per_frame_control(props):
341*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports per frame control.
342*b7c941bbSAndroid Build Coastguard Worker
343*b7c941bbSAndroid Build Coastguard Worker  Args:
344*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
345*b7c941bbSAndroid Build Coastguard Worker
346*b7c941bbSAndroid Build Coastguard Worker  Returns: Boolean. True if devices supports per frame control.
347*b7c941bbSAndroid Build Coastguard Worker  """
348*b7c941bbSAndroid Build Coastguard Worker  return 'android.sync.maxLatency' in props and props[
349*b7c941bbSAndroid Build Coastguard Worker      'android.sync.maxLatency'] == 0
350*b7c941bbSAndroid Build Coastguard Worker
351*b7c941bbSAndroid Build Coastguard Worker
352*b7c941bbSAndroid Build Coastguard Workerdef mono_camera(props):
353*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device is monochromatic.
354*b7c941bbSAndroid Build Coastguard Worker
355*b7c941bbSAndroid Build Coastguard Worker  Args:
356*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
357*b7c941bbSAndroid Build Coastguard Worker  Returns: Boolean. True if MONO camera.
358*b7c941bbSAndroid Build Coastguard Worker  """
359*b7c941bbSAndroid Build Coastguard Worker  return 12 in props.get('android.request.availableCapabilities', [])
360*b7c941bbSAndroid Build Coastguard Worker
361*b7c941bbSAndroid Build Coastguard Worker
362*b7c941bbSAndroid Build Coastguard Workerdef fixed_focus(props):
363*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device is fixed focus.
364*b7c941bbSAndroid Build Coastguard Worker
365*b7c941bbSAndroid Build Coastguard Worker  props[android.lens.info.minimumFocusDistance] == 0 is fixed focus
366*b7c941bbSAndroid Build Coastguard Worker
367*b7c941bbSAndroid Build Coastguard Worker  Args:
368*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties objects.
369*b7c941bbSAndroid Build Coastguard Worker
370*b7c941bbSAndroid Build Coastguard Worker  Returns:
371*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device is a fixed focus camera.
372*b7c941bbSAndroid Build Coastguard Worker  """
373*b7c941bbSAndroid Build Coastguard Worker  return 'android.lens.info.minimumFocusDistance' in props and props[
374*b7c941bbSAndroid Build Coastguard Worker      'android.lens.info.minimumFocusDistance'] == 0
375*b7c941bbSAndroid Build Coastguard Worker
376*b7c941bbSAndroid Build Coastguard Worker
377*b7c941bbSAndroid Build Coastguard Workerdef face_detect(props):
378*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device has face detection mode.
379*b7c941bbSAndroid Build Coastguard Worker
380*b7c941bbSAndroid Build Coastguard Worker  props['android.statistics.info.availableFaceDetectModes'] != 0
381*b7c941bbSAndroid Build Coastguard Worker
382*b7c941bbSAndroid Build Coastguard Worker  Args:
383*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties objects.
384*b7c941bbSAndroid Build Coastguard Worker
385*b7c941bbSAndroid Build Coastguard Worker  Returns:
386*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports face detection.
387*b7c941bbSAndroid Build Coastguard Worker  """
388*b7c941bbSAndroid Build Coastguard Worker  return 'android.statistics.info.availableFaceDetectModes' in props and props[
389*b7c941bbSAndroid Build Coastguard Worker      'android.statistics.info.availableFaceDetectModes'] != [0]
390*b7c941bbSAndroid Build Coastguard Worker
391*b7c941bbSAndroid Build Coastguard Worker
392*b7c941bbSAndroid Build Coastguard Workerdef read_3a(props):
393*b7c941bbSAndroid Build Coastguard Worker  """Return whether a device supports reading out the below 3A settings.
394*b7c941bbSAndroid Build Coastguard Worker
395*b7c941bbSAndroid Build Coastguard Worker  sensitivity
396*b7c941bbSAndroid Build Coastguard Worker  exposure time
397*b7c941bbSAndroid Build Coastguard Worker  awb gain
398*b7c941bbSAndroid Build Coastguard Worker  awb cct
399*b7c941bbSAndroid Build Coastguard Worker  focus distance
400*b7c941bbSAndroid Build Coastguard Worker
401*b7c941bbSAndroid Build Coastguard Worker  Args:
402*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
403*b7c941bbSAndroid Build Coastguard Worker
404*b7c941bbSAndroid Build Coastguard Worker  Returns:
405*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if device supports reading out 3A settings.
406*b7c941bbSAndroid Build Coastguard Worker  """
407*b7c941bbSAndroid Build Coastguard Worker  return manual_sensor(props) and manual_post_proc(props)
408*b7c941bbSAndroid Build Coastguard Worker
409*b7c941bbSAndroid Build Coastguard Worker
410*b7c941bbSAndroid Build Coastguard Workerdef compute_target_exposure(props):
411*b7c941bbSAndroid Build Coastguard Worker  """Return whether a device supports target exposure computation.
412*b7c941bbSAndroid Build Coastguard Worker
413*b7c941bbSAndroid Build Coastguard Worker  Args:
414*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
415*b7c941bbSAndroid Build Coastguard Worker
416*b7c941bbSAndroid Build Coastguard Worker  Returns:
417*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports target exposure computation.
418*b7c941bbSAndroid Build Coastguard Worker  """
419*b7c941bbSAndroid Build Coastguard Worker  return manual_sensor(props) and manual_post_proc(props)
420*b7c941bbSAndroid Build Coastguard Worker
421*b7c941bbSAndroid Build Coastguard Worker
422*b7c941bbSAndroid Build Coastguard Workerdef y8(props):
423*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports Y8 output.
424*b7c941bbSAndroid Build Coastguard Worker
425*b7c941bbSAndroid Build Coastguard Worker  Args:
426*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
427*b7c941bbSAndroid Build Coastguard Worker
428*b7c941bbSAndroid Build Coastguard Worker  Returns:
429*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if device suupports Y8 output.
430*b7c941bbSAndroid Build Coastguard Worker  """
431*b7c941bbSAndroid Build Coastguard Worker  if capture_request_utils.get_available_output_sizes('y8', props):
432*b7c941bbSAndroid Build Coastguard Worker    return True
433*b7c941bbSAndroid Build Coastguard Worker  return False
434*b7c941bbSAndroid Build Coastguard Worker
435*b7c941bbSAndroid Build Coastguard Worker
436*b7c941bbSAndroid Build Coastguard Workerdef jpeg_quality(props):
437*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports JPEG quality."""
438*b7c941bbSAndroid Build Coastguard Worker  return ('camera.characteristics.requestKeys' in props) and (
439*b7c941bbSAndroid Build Coastguard Worker      'android.jpeg.quality' in props['camera.characteristics.requestKeys'])
440*b7c941bbSAndroid Build Coastguard Worker
441*b7c941bbSAndroid Build Coastguard Worker
442*b7c941bbSAndroid Build Coastguard Workerdef jpeg_orientation(props):
443*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports JPEG orientation."""
444*b7c941bbSAndroid Build Coastguard Worker  return ('camera.characteristics.requestKeys' in props) and (
445*b7c941bbSAndroid Build Coastguard Worker      'android.jpeg.orientation' in props['camera.characteristics.requestKeys'])
446*b7c941bbSAndroid Build Coastguard Worker
447*b7c941bbSAndroid Build Coastguard Worker
448*b7c941bbSAndroid Build Coastguard Workerdef sensor_orientation(props):
449*b7c941bbSAndroid Build Coastguard Worker  """Returns the sensor orientation of the camera."""
450*b7c941bbSAndroid Build Coastguard Worker  return props['android.sensor.orientation']
451*b7c941bbSAndroid Build Coastguard Worker
452*b7c941bbSAndroid Build Coastguard Worker
453*b7c941bbSAndroid Build Coastguard Workerdef zoom_ratio_range(props):
454*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports zoom capabilities.
455*b7c941bbSAndroid Build Coastguard Worker
456*b7c941bbSAndroid Build Coastguard Worker  Args:
457*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
458*b7c941bbSAndroid Build Coastguard Worker
459*b7c941bbSAndroid Build Coastguard Worker  Returns:
460*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports zoom capabilities.
461*b7c941bbSAndroid Build Coastguard Worker  """
462*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.zoomRatioRange' in props and props[
463*b7c941bbSAndroid Build Coastguard Worker      'android.control.zoomRatioRange'] is not None
464*b7c941bbSAndroid Build Coastguard Worker
465*b7c941bbSAndroid Build Coastguard Worker
466*b7c941bbSAndroid Build Coastguard Workerdef low_latency_zoom(props):
467*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports low latency zoom via settings override.
468*b7c941bbSAndroid Build Coastguard Worker
469*b7c941bbSAndroid Build Coastguard Worker  Args:
470*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
471*b7c941bbSAndroid Build Coastguard Worker
472*b7c941bbSAndroid Build Coastguard Worker  Returns:
473*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports SETTINGS_OVERRIDE_ZOOM.
474*b7c941bbSAndroid Build Coastguard Worker  """
475*b7c941bbSAndroid Build Coastguard Worker  return ('android.control.availableSettingsOverrides') in props and (
476*b7c941bbSAndroid Build Coastguard Worker      SETTINGS_OVERRIDE_ZOOM in props[
477*b7c941bbSAndroid Build Coastguard Worker          'android.control.availableSettingsOverrides'])
478*b7c941bbSAndroid Build Coastguard Worker
479*b7c941bbSAndroid Build Coastguard Worker
480*b7c941bbSAndroid Build Coastguard Workerdef sync_latency(props):
481*b7c941bbSAndroid Build Coastguard Worker  """Returns sync latency in number of frames.
482*b7c941bbSAndroid Build Coastguard Worker
483*b7c941bbSAndroid Build Coastguard Worker  If undefined, 8 frames.
484*b7c941bbSAndroid Build Coastguard Worker
485*b7c941bbSAndroid Build Coastguard Worker  Args:
486*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
487*b7c941bbSAndroid Build Coastguard Worker
488*b7c941bbSAndroid Build Coastguard Worker  Returns:
489*b7c941bbSAndroid Build Coastguard Worker    integer number of frames.
490*b7c941bbSAndroid Build Coastguard Worker  """
491*b7c941bbSAndroid Build Coastguard Worker  latency = props['android.sync.maxLatency']
492*b7c941bbSAndroid Build Coastguard Worker  if latency < 0:
493*b7c941bbSAndroid Build Coastguard Worker    latency = 8
494*b7c941bbSAndroid Build Coastguard Worker  return latency
495*b7c941bbSAndroid Build Coastguard Worker
496*b7c941bbSAndroid Build Coastguard Worker
497*b7c941bbSAndroid Build Coastguard Workerdef get_max_digital_zoom(props):
498*b7c941bbSAndroid Build Coastguard Worker  """Returns the maximum amount of zooming possible by the camera device.
499*b7c941bbSAndroid Build Coastguard Worker
500*b7c941bbSAndroid Build Coastguard Worker  Args:
501*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
502*b7c941bbSAndroid Build Coastguard Worker
503*b7c941bbSAndroid Build Coastguard Worker  Returns:
504*b7c941bbSAndroid Build Coastguard Worker    A float indicating the maximum amount of zooming possible by the
505*b7c941bbSAndroid Build Coastguard Worker    camera device.
506*b7c941bbSAndroid Build Coastguard Worker  """
507*b7c941bbSAndroid Build Coastguard Worker  z_max = 1.0
508*b7c941bbSAndroid Build Coastguard Worker  if 'android.scaler.availableMaxDigitalZoom' in props:
509*b7c941bbSAndroid Build Coastguard Worker    z_max = props['android.scaler.availableMaxDigitalZoom']
510*b7c941bbSAndroid Build Coastguard Worker  return z_max
511*b7c941bbSAndroid Build Coastguard Worker
512*b7c941bbSAndroid Build Coastguard Worker
513*b7c941bbSAndroid Build Coastguard Workerdef get_ae_target_fps_ranges(props):
514*b7c941bbSAndroid Build Coastguard Worker  """Returns the AE target FPS ranges supported by the camera device.
515*b7c941bbSAndroid Build Coastguard Worker
516*b7c941bbSAndroid Build Coastguard Worker  Args:
517*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
518*b7c941bbSAndroid Build Coastguard Worker
519*b7c941bbSAndroid Build Coastguard Worker  Returns:
520*b7c941bbSAndroid Build Coastguard Worker    A list of AE target FPS ranges supported by the camera device.
521*b7c941bbSAndroid Build Coastguard Worker  """
522*b7c941bbSAndroid Build Coastguard Worker  ranges = []  # return empty list instead of Boolean if no FPS range in props
523*b7c941bbSAndroid Build Coastguard Worker  if 'android.control.aeAvailableTargetFpsRanges' in props:
524*b7c941bbSAndroid Build Coastguard Worker    ranges = props['android.control.aeAvailableTargetFpsRanges']
525*b7c941bbSAndroid Build Coastguard Worker  return ranges
526*b7c941bbSAndroid Build Coastguard Worker
527*b7c941bbSAndroid Build Coastguard Worker
528*b7c941bbSAndroid Build Coastguard Workerdef get_fps_range_to_test(fps_ranges):
529*b7c941bbSAndroid Build Coastguard Worker  """Returns an AE target FPS range to test based on camera device properties.
530*b7c941bbSAndroid Build Coastguard Worker
531*b7c941bbSAndroid Build Coastguard Worker  Args:
532*b7c941bbSAndroid Build Coastguard Worker    fps_ranges: list of AE target FPS ranges supported by camera.
533*b7c941bbSAndroid Build Coastguard Worker      e.g. [[7, 30], [24, 30], [30, 30]]
534*b7c941bbSAndroid Build Coastguard Worker  Returns:
535*b7c941bbSAndroid Build Coastguard Worker    An AE target FPS range for testing.
536*b7c941bbSAndroid Build Coastguard Worker  """
537*b7c941bbSAndroid Build Coastguard Worker  default_range_min, default_range_max = DEFAULT_AE_TARGET_FPS_RANGE
538*b7c941bbSAndroid Build Coastguard Worker  default_range_size = default_range_max - default_range_min
539*b7c941bbSAndroid Build Coastguard Worker  logging.debug('AE target FPS ranges: %s', fps_ranges)
540*b7c941bbSAndroid Build Coastguard Worker  widest_fps_range = max(fps_ranges, key=lambda r: r[1] - r[0])
541*b7c941bbSAndroid Build Coastguard Worker  if widest_fps_range[1] - widest_fps_range[0] < default_range_size:
542*b7c941bbSAndroid Build Coastguard Worker    logging.debug('Default range %s is wider than widest '
543*b7c941bbSAndroid Build Coastguard Worker                  'available AE target FPS range %s.',
544*b7c941bbSAndroid Build Coastguard Worker                  DEFAULT_AE_TARGET_FPS_RANGE,
545*b7c941bbSAndroid Build Coastguard Worker                  widest_fps_range)
546*b7c941bbSAndroid Build Coastguard Worker  logging.debug('Accepted AE target FPS range: %s', widest_fps_range)
547*b7c941bbSAndroid Build Coastguard Worker  return widest_fps_range
548*b7c941bbSAndroid Build Coastguard Worker
549*b7c941bbSAndroid Build Coastguard Worker
550*b7c941bbSAndroid Build Coastguard Workerdef ae_lock(props):
551*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports AE lock.
552*b7c941bbSAndroid Build Coastguard Worker
553*b7c941bbSAndroid Build Coastguard Worker  Args:
554*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
555*b7c941bbSAndroid Build Coastguard Worker
556*b7c941bbSAndroid Build Coastguard Worker  Returns:
557*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports AE lock.
558*b7c941bbSAndroid Build Coastguard Worker  """
559*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.aeLockAvailable' in props and props[
560*b7c941bbSAndroid Build Coastguard Worker      'android.control.aeLockAvailable'] == 1
561*b7c941bbSAndroid Build Coastguard Worker
562*b7c941bbSAndroid Build Coastguard Worker
563*b7c941bbSAndroid Build Coastguard Workerdef awb_lock(props):
564*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports AWB lock.
565*b7c941bbSAndroid Build Coastguard Worker
566*b7c941bbSAndroid Build Coastguard Worker  Args:
567*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
568*b7c941bbSAndroid Build Coastguard Worker
569*b7c941bbSAndroid Build Coastguard Worker  Returns:
570*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports AWB lock.
571*b7c941bbSAndroid Build Coastguard Worker  """
572*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.awbLockAvailable' in props and props[
573*b7c941bbSAndroid Build Coastguard Worker      'android.control.awbLockAvailable'] == 1
574*b7c941bbSAndroid Build Coastguard Worker
575*b7c941bbSAndroid Build Coastguard Worker
576*b7c941bbSAndroid Build Coastguard Workerdef ev_compensation(props):
577*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports ev compensation.
578*b7c941bbSAndroid Build Coastguard Worker
579*b7c941bbSAndroid Build Coastguard Worker  Args:
580*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
581*b7c941bbSAndroid Build Coastguard Worker
582*b7c941bbSAndroid Build Coastguard Worker  Returns:
583*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports EV compensation.
584*b7c941bbSAndroid Build Coastguard Worker  """
585*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.aeCompensationRange' in props and props[
586*b7c941bbSAndroid Build Coastguard Worker      'android.control.aeCompensationRange'] != [0, 0]
587*b7c941bbSAndroid Build Coastguard Worker
588*b7c941bbSAndroid Build Coastguard Worker
589*b7c941bbSAndroid Build Coastguard Workerdef flash(props):
590*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports flash control.
591*b7c941bbSAndroid Build Coastguard Worker
592*b7c941bbSAndroid Build Coastguard Worker  Args:
593*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
594*b7c941bbSAndroid Build Coastguard Worker
595*b7c941bbSAndroid Build Coastguard Worker  Returns:
596*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports flash control.
597*b7c941bbSAndroid Build Coastguard Worker  """
598*b7c941bbSAndroid Build Coastguard Worker  return 'android.flash.info.available' in props and props[
599*b7c941bbSAndroid Build Coastguard Worker      'android.flash.info.available'] == 1
600*b7c941bbSAndroid Build Coastguard Worker
601*b7c941bbSAndroid Build Coastguard Worker
602*b7c941bbSAndroid Build Coastguard Workerdef distortion_correction(props):
603*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports android.lens.distortion capabilities.
604*b7c941bbSAndroid Build Coastguard Worker
605*b7c941bbSAndroid Build Coastguard Worker  Args:
606*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
607*b7c941bbSAndroid Build Coastguard Worker
608*b7c941bbSAndroid Build Coastguard Worker  Returns:
609*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports lens distortion correction capabilities.
610*b7c941bbSAndroid Build Coastguard Worker  """
611*b7c941bbSAndroid Build Coastguard Worker  return 'android.lens.distortion' in props and props[
612*b7c941bbSAndroid Build Coastguard Worker      'android.lens.distortion'] is not None
613*b7c941bbSAndroid Build Coastguard Worker
614*b7c941bbSAndroid Build Coastguard Worker
615*b7c941bbSAndroid Build Coastguard Workerdef distortion_correction_mode(props, mode):
616*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports a distortionCorrection mode.
617*b7c941bbSAndroid Build Coastguard Worker
618*b7c941bbSAndroid Build Coastguard Worker  Args:
619*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object
620*b7c941bbSAndroid Build Coastguard Worker    mode: Integer indicating distortion correction mode
621*b7c941bbSAndroid Build Coastguard Worker
622*b7c941bbSAndroid Build Coastguard Worker  Returns:
623*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports distortion correction mode(s).
624*b7c941bbSAndroid Build Coastguard Worker  """
625*b7c941bbSAndroid Build Coastguard Worker  if 'android.distortionCorrection.availableModes' in props:
626*b7c941bbSAndroid Build Coastguard Worker    logging.debug('distortionCorrection.availableModes: %s',
627*b7c941bbSAndroid Build Coastguard Worker                  props['android.distortionCorrection.availableModes'])
628*b7c941bbSAndroid Build Coastguard Worker  else:
629*b7c941bbSAndroid Build Coastguard Worker    logging.debug('distortionCorrection.availableModes not in props!')
630*b7c941bbSAndroid Build Coastguard Worker  return ('android.distortionCorrection.availableModes' in props and
631*b7c941bbSAndroid Build Coastguard Worker          mode in props['android.distortionCorrection.availableModes'])
632*b7c941bbSAndroid Build Coastguard Worker
633*b7c941bbSAndroid Build Coastguard Worker
634*b7c941bbSAndroid Build Coastguard Workerdef freeform_crop(props):
635*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports freefrom cropping.
636*b7c941bbSAndroid Build Coastguard Worker
637*b7c941bbSAndroid Build Coastguard Worker  Args:
638*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
639*b7c941bbSAndroid Build Coastguard Worker
640*b7c941bbSAndroid Build Coastguard Worker  Returns:
641*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports freeform cropping.
642*b7c941bbSAndroid Build Coastguard Worker  """
643*b7c941bbSAndroid Build Coastguard Worker  return 'android.scaler.croppingType' in props and props[
644*b7c941bbSAndroid Build Coastguard Worker      'android.scaler.croppingType'] == 1
645*b7c941bbSAndroid Build Coastguard Worker
646*b7c941bbSAndroid Build Coastguard Worker
647*b7c941bbSAndroid Build Coastguard Workerdef noise_reduction_mode(props, mode):
648*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports the noise reduction mode.
649*b7c941bbSAndroid Build Coastguard Worker
650*b7c941bbSAndroid Build Coastguard Worker  Args:
651*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties objects.
652*b7c941bbSAndroid Build Coastguard Worker    mode: Integer indicating noise reduction mode to check for availability.
653*b7c941bbSAndroid Build Coastguard Worker
654*b7c941bbSAndroid Build Coastguard Worker  Returns:
655*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if devices supports noise reduction mode(s).
656*b7c941bbSAndroid Build Coastguard Worker  """
657*b7c941bbSAndroid Build Coastguard Worker  return ('android.noiseReduction.availableNoiseReductionModes' in props and
658*b7c941bbSAndroid Build Coastguard Worker          mode in props['android.noiseReduction.availableNoiseReductionModes'])
659*b7c941bbSAndroid Build Coastguard Worker
660*b7c941bbSAndroid Build Coastguard Worker
661*b7c941bbSAndroid Build Coastguard Workerdef lsc_map(props):
662*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports lens shading map output.
663*b7c941bbSAndroid Build Coastguard Worker
664*b7c941bbSAndroid Build Coastguard Worker  Args:
665*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
666*b7c941bbSAndroid Build Coastguard Worker  Returns: Boolean. True if device supports lens shading map output.
667*b7c941bbSAndroid Build Coastguard Worker  """
668*b7c941bbSAndroid Build Coastguard Worker  return 1 in props.get('android.statistics.info.availableLensShadingMapModes',
669*b7c941bbSAndroid Build Coastguard Worker                        [])
670*b7c941bbSAndroid Build Coastguard Worker
671*b7c941bbSAndroid Build Coastguard Worker
672*b7c941bbSAndroid Build Coastguard Workerdef lsc_off(props):
673*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports disabling lens shading correction.
674*b7c941bbSAndroid Build Coastguard Worker
675*b7c941bbSAndroid Build Coastguard Worker  Args:
676*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
677*b7c941bbSAndroid Build Coastguard Worker
678*b7c941bbSAndroid Build Coastguard Worker  Returns:
679*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports disabling lens shading correction.
680*b7c941bbSAndroid Build Coastguard Worker  """
681*b7c941bbSAndroid Build Coastguard Worker  return 0 in props.get('android.shading.availableModes', [])
682*b7c941bbSAndroid Build Coastguard Worker
683*b7c941bbSAndroid Build Coastguard Worker
684*b7c941bbSAndroid Build Coastguard Workerdef edge_mode(props, mode):
685*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports the edge mode.
686*b7c941bbSAndroid Build Coastguard Worker
687*b7c941bbSAndroid Build Coastguard Worker  Args:
688*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties objects.
689*b7c941bbSAndroid Build Coastguard Worker    mode: Integer, indicating the edge mode to check for availability.
690*b7c941bbSAndroid Build Coastguard Worker
691*b7c941bbSAndroid Build Coastguard Worker  Returns:
692*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports edge mode(s).
693*b7c941bbSAndroid Build Coastguard Worker  """
694*b7c941bbSAndroid Build Coastguard Worker  return 'android.edge.availableEdgeModes' in props and mode in props[
695*b7c941bbSAndroid Build Coastguard Worker      'android.edge.availableEdgeModes']
696*b7c941bbSAndroid Build Coastguard Worker
697*b7c941bbSAndroid Build Coastguard Worker
698*b7c941bbSAndroid Build Coastguard Workerdef tonemap_mode(props, mode):
699*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports the tonemap mode.
700*b7c941bbSAndroid Build Coastguard Worker
701*b7c941bbSAndroid Build Coastguard Worker  Args:
702*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
703*b7c941bbSAndroid Build Coastguard Worker    mode: Integer, indicating the tonemap mode to check for availability.
704*b7c941bbSAndroid Build Coastguard Worker
705*b7c941bbSAndroid Build Coastguard Worker  Return:
706*b7c941bbSAndroid Build Coastguard Worker    Boolean.
707*b7c941bbSAndroid Build Coastguard Worker  """
708*b7c941bbSAndroid Build Coastguard Worker  return 'android.tonemap.availableToneMapModes' in props and mode in props[
709*b7c941bbSAndroid Build Coastguard Worker      'android.tonemap.availableToneMapModes']
710*b7c941bbSAndroid Build Coastguard Worker
711*b7c941bbSAndroid Build Coastguard Worker
712*b7c941bbSAndroid Build Coastguard Workerdef yuv_reprocess(props):
713*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports YUV reprocessing.
714*b7c941bbSAndroid Build Coastguard Worker
715*b7c941bbSAndroid Build Coastguard Worker  Args:
716*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
717*b7c941bbSAndroid Build Coastguard Worker
718*b7c941bbSAndroid Build Coastguard Worker  Returns:
719*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports YUV reprocessing.
720*b7c941bbSAndroid Build Coastguard Worker  """
721*b7c941bbSAndroid Build Coastguard Worker  return 'android.request.availableCapabilities' in props and 7 in props[
722*b7c941bbSAndroid Build Coastguard Worker      'android.request.availableCapabilities']
723*b7c941bbSAndroid Build Coastguard Worker
724*b7c941bbSAndroid Build Coastguard Worker
725*b7c941bbSAndroid Build Coastguard Workerdef private_reprocess(props):
726*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports PRIVATE reprocessing.
727*b7c941bbSAndroid Build Coastguard Worker
728*b7c941bbSAndroid Build Coastguard Worker  Args:
729*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
730*b7c941bbSAndroid Build Coastguard Worker
731*b7c941bbSAndroid Build Coastguard Worker  Returns:
732*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports PRIVATE reprocessing.
733*b7c941bbSAndroid Build Coastguard Worker  """
734*b7c941bbSAndroid Build Coastguard Worker  return 'android.request.availableCapabilities' in props and 4 in props[
735*b7c941bbSAndroid Build Coastguard Worker      'android.request.availableCapabilities']
736*b7c941bbSAndroid Build Coastguard Worker
737*b7c941bbSAndroid Build Coastguard Worker
738*b7c941bbSAndroid Build Coastguard Workerdef stream_use_case(props):
739*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device has stream use case capability.
740*b7c941bbSAndroid Build Coastguard Worker
741*b7c941bbSAndroid Build Coastguard Worker  Args:
742*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
743*b7c941bbSAndroid Build Coastguard Worker
744*b7c941bbSAndroid Build Coastguard Worker  Returns:
745*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if the device has stream use case capability.
746*b7c941bbSAndroid Build Coastguard Worker  """
747*b7c941bbSAndroid Build Coastguard Worker  return 'android.request.availableCapabilities' in props and 19 in props[
748*b7c941bbSAndroid Build Coastguard Worker      'android.request.availableCapabilities']
749*b7c941bbSAndroid Build Coastguard Worker
750*b7c941bbSAndroid Build Coastguard Worker
751*b7c941bbSAndroid Build Coastguard Workerdef cropped_raw_stream_use_case(props):
752*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports the CROPPED_RAW stream use case.
753*b7c941bbSAndroid Build Coastguard Worker
754*b7c941bbSAndroid Build Coastguard Worker  Args:
755*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
756*b7c941bbSAndroid Build Coastguard Worker
757*b7c941bbSAndroid Build Coastguard Worker  Returns:
758*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if the device supports the CROPPED_RAW stream use case.
759*b7c941bbSAndroid Build Coastguard Worker  """
760*b7c941bbSAndroid Build Coastguard Worker  return stream_use_case(props) and 6 in props[
761*b7c941bbSAndroid Build Coastguard Worker      'android.scaler.availableStreamUseCases']
762*b7c941bbSAndroid Build Coastguard Worker
763*b7c941bbSAndroid Build Coastguard Worker
764*b7c941bbSAndroid Build Coastguard Workerdef dynamic_range_ten_bit(props):
765*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports the DYNAMIC_RANGE_TEN_BIT capability.
766*b7c941bbSAndroid Build Coastguard Worker
767*b7c941bbSAndroid Build Coastguard Worker  Args:
768*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
769*b7c941bbSAndroid Build Coastguard Worker
770*b7c941bbSAndroid Build Coastguard Worker  Returns:
771*b7c941bbSAndroid Build Coastguard Worker     Boolean. True if the device supports the DYNAMIC_RANGE_TEN_BIT capability.
772*b7c941bbSAndroid Build Coastguard Worker  """
773*b7c941bbSAndroid Build Coastguard Worker  return 'android.request.availableCapabilities' in props and 18 in props[
774*b7c941bbSAndroid Build Coastguard Worker      'android.request.availableCapabilities']
775*b7c941bbSAndroid Build Coastguard Worker
776*b7c941bbSAndroid Build Coastguard Worker
777*b7c941bbSAndroid Build Coastguard Workerdef intrinsic_calibration(props):
778*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports android.lens.intrinsicCalibration.
779*b7c941bbSAndroid Build Coastguard Worker
780*b7c941bbSAndroid Build Coastguard Worker  Args:
781*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
782*b7c941bbSAndroid Build Coastguard Worker
783*b7c941bbSAndroid Build Coastguard Worker  Returns:
784*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if device supports android.lens.intrinsicCalibratino.
785*b7c941bbSAndroid Build Coastguard Worker  """
786*b7c941bbSAndroid Build Coastguard Worker  return props.get('android.lens.intrinsicCalibration') is not None
787*b7c941bbSAndroid Build Coastguard Worker
788*b7c941bbSAndroid Build Coastguard Worker
789*b7c941bbSAndroid Build Coastguard Workerdef get_intrinsic_calibration(props, metadata, debug, fd=None):
790*b7c941bbSAndroid Build Coastguard Worker  """Get intrinsicCalibration and create intrisic matrix.
791*b7c941bbSAndroid Build Coastguard Worker
792*b7c941bbSAndroid Build Coastguard Worker  If intrinsic android.lens.intrinsicCalibration does not exist, return None.
793*b7c941bbSAndroid Build Coastguard Worker
794*b7c941bbSAndroid Build Coastguard Worker  Args:
795*b7c941bbSAndroid Build Coastguard Worker    props: camera properties.
796*b7c941bbSAndroid Build Coastguard Worker    metadata: dict; camera capture metadata.
797*b7c941bbSAndroid Build Coastguard Worker    debug: boolean; enable printing more information.
798*b7c941bbSAndroid Build Coastguard Worker    fd: float; focal length from capture metadata.
799*b7c941bbSAndroid Build Coastguard Worker
800*b7c941bbSAndroid Build Coastguard Worker  Returns:
801*b7c941bbSAndroid Build Coastguard Worker    numpy array for intrinsic transformation matrix or None
802*b7c941bbSAndroid Build Coastguard Worker    k = [[f_x, s, c_x],
803*b7c941bbSAndroid Build Coastguard Worker         [0, f_y, c_y],
804*b7c941bbSAndroid Build Coastguard Worker         [0,   0,   1]]
805*b7c941bbSAndroid Build Coastguard Worker  """
806*b7c941bbSAndroid Build Coastguard Worker  if metadata.get('android.lens.intrinsicCalibration'):
807*b7c941bbSAndroid Build Coastguard Worker    ical = np.array(metadata['android.lens.intrinsicCalibration'])
808*b7c941bbSAndroid Build Coastguard Worker    logging.debug('Using capture metadata android.lens.intrinsicCalibration')
809*b7c941bbSAndroid Build Coastguard Worker  elif props.get('android.lens.intrinsicCalibration'):
810*b7c941bbSAndroid Build Coastguard Worker    ical = np.array(props['android.lens.intrinsicCalibration'])
811*b7c941bbSAndroid Build Coastguard Worker    logging.debug('Using camera property android.lens.intrinsicCalibration')
812*b7c941bbSAndroid Build Coastguard Worker  else:
813*b7c941bbSAndroid Build Coastguard Worker    logging.error('Camera does not have android.lens.intrinsicCalibration.')
814*b7c941bbSAndroid Build Coastguard Worker    return None
815*b7c941bbSAndroid Build Coastguard Worker
816*b7c941bbSAndroid Build Coastguard Worker  # basic checks for parameter correctness
817*b7c941bbSAndroid Build Coastguard Worker  ical_len = len(ical)
818*b7c941bbSAndroid Build Coastguard Worker  if ical_len != NUM_INTRINSIC_CAL_PARAMS:
819*b7c941bbSAndroid Build Coastguard Worker    raise ValueError(
820*b7c941bbSAndroid Build Coastguard Worker        f'instrisicCalibration has wrong number of params: {ical_len}.')
821*b7c941bbSAndroid Build Coastguard Worker
822*b7c941bbSAndroid Build Coastguard Worker  if fd is not None:
823*b7c941bbSAndroid Build Coastguard Worker    # detailed checks for parameter correctness
824*b7c941bbSAndroid Build Coastguard Worker    # Intrinsic cal is of format: [f_x, f_y, c_x, c_y, s]
825*b7c941bbSAndroid Build Coastguard Worker    # [f_x, f_y] is the horizontal and vertical focal lengths,
826*b7c941bbSAndroid Build Coastguard Worker    # [c_x, c_y] is the position of the optical axis,
827*b7c941bbSAndroid Build Coastguard Worker    # and s is skew of sensor plane vs lens plane.
828*b7c941bbSAndroid Build Coastguard Worker    sensor_h = props['android.sensor.info.physicalSize']['height']
829*b7c941bbSAndroid Build Coastguard Worker    sensor_w = props['android.sensor.info.physicalSize']['width']
830*b7c941bbSAndroid Build Coastguard Worker    pixel_h = props['android.sensor.info.pixelArraySize']['height']
831*b7c941bbSAndroid Build Coastguard Worker    pixel_w = props['android.sensor.info.pixelArraySize']['width']
832*b7c941bbSAndroid Build Coastguard Worker    fd_w_pix = pixel_w * fd / sensor_w
833*b7c941bbSAndroid Build Coastguard Worker    fd_h_pix = pixel_h * fd / sensor_h
834*b7c941bbSAndroid Build Coastguard Worker
835*b7c941bbSAndroid Build Coastguard Worker    if not math.isclose(fd_w_pix, ical[0], rel_tol=FD_CAL_RTOL):
836*b7c941bbSAndroid Build Coastguard Worker      raise ValueError(f'fd_w(pixels): {fd_w_pix:.2f}\tcal[0](pixels): '
837*b7c941bbSAndroid Build Coastguard Worker                       f'{ical[0]:.2f}\tTOL=20%')
838*b7c941bbSAndroid Build Coastguard Worker    if not math.isclose(fd_h_pix, ical[1], rel_tol=FD_CAL_RTOL):
839*b7c941bbSAndroid Build Coastguard Worker      raise ValueError(f'fd_h(pixels): {fd_h_pix:.2f}\tcal[1](pixels): '
840*b7c941bbSAndroid Build Coastguard Worker                       f'{ical[1]:.2f}\tTOL=20%')
841*b7c941bbSAndroid Build Coastguard Worker
842*b7c941bbSAndroid Build Coastguard Worker  # generate instrinsic matrix
843*b7c941bbSAndroid Build Coastguard Worker  k = np.array([[ical[0], ical[4], ical[2]],
844*b7c941bbSAndroid Build Coastguard Worker                [0, ical[1], ical[3]],
845*b7c941bbSAndroid Build Coastguard Worker                [0, 0, 1]])
846*b7c941bbSAndroid Build Coastguard Worker  if debug:
847*b7c941bbSAndroid Build Coastguard Worker    logging.debug('k: %s', str(k))
848*b7c941bbSAndroid Build Coastguard Worker  return k
849*b7c941bbSAndroid Build Coastguard Worker
850*b7c941bbSAndroid Build Coastguard Worker
851*b7c941bbSAndroid Build Coastguard Workerdef get_translation_matrix(props, debug):
852*b7c941bbSAndroid Build Coastguard Worker  """Get translation matrix.
853*b7c941bbSAndroid Build Coastguard Worker
854*b7c941bbSAndroid Build Coastguard Worker  Args:
855*b7c941bbSAndroid Build Coastguard Worker    props: dict of camera properties
856*b7c941bbSAndroid Build Coastguard Worker    debug: boolean flag to log more info
857*b7c941bbSAndroid Build Coastguard Worker
858*b7c941bbSAndroid Build Coastguard Worker  Returns:
859*b7c941bbSAndroid Build Coastguard Worker    android.lens.poseTranslation matrix if it exists, otherwise None.
860*b7c941bbSAndroid Build Coastguard Worker  """
861*b7c941bbSAndroid Build Coastguard Worker  if props['android.lens.poseTranslation']:
862*b7c941bbSAndroid Build Coastguard Worker    t = np.array(props['android.lens.poseTranslation'])
863*b7c941bbSAndroid Build Coastguard Worker  else:
864*b7c941bbSAndroid Build Coastguard Worker    logging.error('Device does not have android.lens.poseTranslation.')
865*b7c941bbSAndroid Build Coastguard Worker    return None
866*b7c941bbSAndroid Build Coastguard Worker
867*b7c941bbSAndroid Build Coastguard Worker  if debug:
868*b7c941bbSAndroid Build Coastguard Worker    logging.debug('translation: %s', str(t))
869*b7c941bbSAndroid Build Coastguard Worker  t_len = len(t)
870*b7c941bbSAndroid Build Coastguard Worker  if t_len != NUM_POSE_TRANSLATION_PARAMS:
871*b7c941bbSAndroid Build Coastguard Worker    raise ValueError(f'poseTranslation has wrong # of params: {t_len}.')
872*b7c941bbSAndroid Build Coastguard Worker  return t
873*b7c941bbSAndroid Build Coastguard Worker
874*b7c941bbSAndroid Build Coastguard Worker
875*b7c941bbSAndroid Build Coastguard Workerdef get_rotation_matrix(props, debug):
876*b7c941bbSAndroid Build Coastguard Worker  """Convert the rotation parameters to 3-axis data.
877*b7c941bbSAndroid Build Coastguard Worker
878*b7c941bbSAndroid Build Coastguard Worker  Args:
879*b7c941bbSAndroid Build Coastguard Worker    props: camera properties
880*b7c941bbSAndroid Build Coastguard Worker    debug: boolean for more information
881*b7c941bbSAndroid Build Coastguard Worker
882*b7c941bbSAndroid Build Coastguard Worker  Returns:
883*b7c941bbSAndroid Build Coastguard Worker    3x3 matrix w/ rotation parameters if poseRotation exists, otherwise None
884*b7c941bbSAndroid Build Coastguard Worker  """
885*b7c941bbSAndroid Build Coastguard Worker  if props['android.lens.poseRotation']:
886*b7c941bbSAndroid Build Coastguard Worker    rotation = np.array(props['android.lens.poseRotation'])
887*b7c941bbSAndroid Build Coastguard Worker  else:
888*b7c941bbSAndroid Build Coastguard Worker    logging.error('Device does not have android.lens.poseRotation.')
889*b7c941bbSAndroid Build Coastguard Worker    return None
890*b7c941bbSAndroid Build Coastguard Worker
891*b7c941bbSAndroid Build Coastguard Worker  if debug:
892*b7c941bbSAndroid Build Coastguard Worker    logging.debug('rotation: %s', str(rotation))
893*b7c941bbSAndroid Build Coastguard Worker    rotation_len = len(rotation)
894*b7c941bbSAndroid Build Coastguard Worker    if rotation_len != NUM_POSE_ROTATION_PARAMS:
895*b7c941bbSAndroid Build Coastguard Worker      raise ValueError(f'poseRotation has wrong # of params: {rotation_len}.')
896*b7c941bbSAndroid Build Coastguard Worker  x = rotation[0]
897*b7c941bbSAndroid Build Coastguard Worker  y = rotation[1]
898*b7c941bbSAndroid Build Coastguard Worker  z = rotation[2]
899*b7c941bbSAndroid Build Coastguard Worker  w = rotation[3]
900*b7c941bbSAndroid Build Coastguard Worker  return np.array([[1-2*y**2-2*z**2, 2*x*y-2*z*w, 2*x*z+2*y*w],
901*b7c941bbSAndroid Build Coastguard Worker                   [2*x*y+2*z*w, 1-2*x**2-2*z**2, 2*y*z-2*x*w],
902*b7c941bbSAndroid Build Coastguard Worker                   [2*x*z-2*y*w, 2*y*z+2*x*w, 1-2*x**2-2*y**2]])
903*b7c941bbSAndroid Build Coastguard Worker
904*b7c941bbSAndroid Build Coastguard Worker
905*b7c941bbSAndroid Build Coastguard Workerdef get_distortion_matrix(props):
906*b7c941bbSAndroid Build Coastguard Worker  """Get android.lens.distortion matrix and convert to cv2 fmt.
907*b7c941bbSAndroid Build Coastguard Worker
908*b7c941bbSAndroid Build Coastguard Worker  Args:
909*b7c941bbSAndroid Build Coastguard Worker    props: dict of camera properties
910*b7c941bbSAndroid Build Coastguard Worker
911*b7c941bbSAndroid Build Coastguard Worker  Returns:
912*b7c941bbSAndroid Build Coastguard Worker    cv2 reordered android.lens.distortion if it exists, otherwise None.
913*b7c941bbSAndroid Build Coastguard Worker  """
914*b7c941bbSAndroid Build Coastguard Worker  if props['android.lens.distortion']:
915*b7c941bbSAndroid Build Coastguard Worker    dist = np.array(props['android.lens.distortion'])
916*b7c941bbSAndroid Build Coastguard Worker  else:
917*b7c941bbSAndroid Build Coastguard Worker    logging.error('Device does not have android.lens.distortion.')
918*b7c941bbSAndroid Build Coastguard Worker    return None
919*b7c941bbSAndroid Build Coastguard Worker
920*b7c941bbSAndroid Build Coastguard Worker  dist_len = len(dist)
921*b7c941bbSAndroid Build Coastguard Worker  if len(dist) != NUM_DISTORTION_PARAMS:
922*b7c941bbSAndroid Build Coastguard Worker    raise ValueError(f'lens.distortion has wrong # of params: {dist_len}.')
923*b7c941bbSAndroid Build Coastguard Worker  cv2_distort = np.array([dist[0], dist[1], dist[3], dist[4], dist[2]])
924*b7c941bbSAndroid Build Coastguard Worker  logging.debug('cv2 distortion params: %s', str(cv2_distort))
925*b7c941bbSAndroid Build Coastguard Worker  return cv2_distort
926*b7c941bbSAndroid Build Coastguard Worker
927*b7c941bbSAndroid Build Coastguard Worker
928*b7c941bbSAndroid Build Coastguard Workerdef post_raw_sensitivity_boost(props):
929*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports post RAW sensitivity boost.
930*b7c941bbSAndroid Build Coastguard Worker
931*b7c941bbSAndroid Build Coastguard Worker  Args:
932*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
933*b7c941bbSAndroid Build Coastguard Worker
934*b7c941bbSAndroid Build Coastguard Worker  Returns:
935*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.control.postRawSensitivityBoost is supported.
936*b7c941bbSAndroid Build Coastguard Worker  """
937*b7c941bbSAndroid Build Coastguard Worker  return (
938*b7c941bbSAndroid Build Coastguard Worker      'android.control.postRawSensitivityBoostRange' in
939*b7c941bbSAndroid Build Coastguard Worker      props['camera.characteristics.keys'] and
940*b7c941bbSAndroid Build Coastguard Worker      props.get('android.control.postRawSensitivityBoostRange') != [100, 100])
941*b7c941bbSAndroid Build Coastguard Worker
942*b7c941bbSAndroid Build Coastguard Worker
943*b7c941bbSAndroid Build Coastguard Workerdef sensor_fusion_capable(props):
944*b7c941bbSAndroid Build Coastguard Worker  """Determine if test_sensor_fusion is run."""
945*b7c941bbSAndroid Build Coastguard Worker  return all([sensor_fusion(props),
946*b7c941bbSAndroid Build Coastguard Worker              manual_sensor(props),
947*b7c941bbSAndroid Build Coastguard Worker              props['android.lens.facing'] != LENS_FACING['EXTERNAL']])
948*b7c941bbSAndroid Build Coastguard Worker
949*b7c941bbSAndroid Build Coastguard Worker
950*b7c941bbSAndroid Build Coastguard Workerdef continuous_picture(props):
951*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports CONTINUOUS_PICTURE.
952*b7c941bbSAndroid Build Coastguard Worker
953*b7c941bbSAndroid Build Coastguard Worker  Args:
954*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
955*b7c941bbSAndroid Build Coastguard Worker
956*b7c941bbSAndroid Build Coastguard Worker  Returns:
957*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if CONTINUOUS_PICTURE in android.control.afAvailableModes.
958*b7c941bbSAndroid Build Coastguard Worker  """
959*b7c941bbSAndroid Build Coastguard Worker  return 4 in props.get('android.control.afAvailableModes', [])
960*b7c941bbSAndroid Build Coastguard Worker
961*b7c941bbSAndroid Build Coastguard Worker
962*b7c941bbSAndroid Build Coastguard Workerdef af_scene_change(props):
963*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports AF_SCENE_CHANGE.
964*b7c941bbSAndroid Build Coastguard Worker
965*b7c941bbSAndroid Build Coastguard Worker  Args:
966*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
967*b7c941bbSAndroid Build Coastguard Worker
968*b7c941bbSAndroid Build Coastguard Worker  Returns:
969*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.control.afSceneChange supported.
970*b7c941bbSAndroid Build Coastguard Worker  """
971*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.afSceneChange' in props.get(
972*b7c941bbSAndroid Build Coastguard Worker      'camera.characteristics.resultKeys')
973*b7c941bbSAndroid Build Coastguard Worker
974*b7c941bbSAndroid Build Coastguard Worker
975*b7c941bbSAndroid Build Coastguard Workerdef multi_camera_frame_sync_capable(props):
976*b7c941bbSAndroid Build Coastguard Worker  """Determines if test_multi_camera_frame_sync can be run."""
977*b7c941bbSAndroid Build Coastguard Worker  return all([
978*b7c941bbSAndroid Build Coastguard Worker      read_3a(props),
979*b7c941bbSAndroid Build Coastguard Worker      per_frame_control(props),
980*b7c941bbSAndroid Build Coastguard Worker      logical_multi_camera(props),
981*b7c941bbSAndroid Build Coastguard Worker      sensor_fusion(props),
982*b7c941bbSAndroid Build Coastguard Worker  ])
983*b7c941bbSAndroid Build Coastguard Worker
984*b7c941bbSAndroid Build Coastguard Worker
985*b7c941bbSAndroid Build Coastguard Workerdef multi_camera_sync_calibrated(props):
986*b7c941bbSAndroid Build Coastguard Worker  """Determines if multi-camera sync type is CALIBRATED or APPROXIMATE.
987*b7c941bbSAndroid Build Coastguard Worker
988*b7c941bbSAndroid Build Coastguard Worker  Args:
989*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
990*b7c941bbSAndroid Build Coastguard Worker
991*b7c941bbSAndroid Build Coastguard Worker  Returns:
992*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.logicalMultiCamera.sensorSyncType is CALIBRATED.
993*b7c941bbSAndroid Build Coastguard Worker  """
994*b7c941bbSAndroid Build Coastguard Worker  return props.get('android.logicalMultiCamera.sensorSyncType'
995*b7c941bbSAndroid Build Coastguard Worker                  ) == MULTI_CAMERA_SYNC_CALIBRATED
996*b7c941bbSAndroid Build Coastguard Worker
997*b7c941bbSAndroid Build Coastguard Worker
998*b7c941bbSAndroid Build Coastguard Workerdef solid_color_test_pattern(props):
999*b7c941bbSAndroid Build Coastguard Worker  """Determines if camera supports solid color test pattern.
1000*b7c941bbSAndroid Build Coastguard Worker
1001*b7c941bbSAndroid Build Coastguard Worker  Args:
1002*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1003*b7c941bbSAndroid Build Coastguard Worker
1004*b7c941bbSAndroid Build Coastguard Worker  Returns:
1005*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.sensor.availableTestPatternModes has
1006*b7c941bbSAndroid Build Coastguard Worker             SOLID_COLOR_TEST_PATTERN.
1007*b7c941bbSAndroid Build Coastguard Worker  """
1008*b7c941bbSAndroid Build Coastguard Worker  return SOLID_COLOR_TEST_PATTERN in props.get(
1009*b7c941bbSAndroid Build Coastguard Worker      'android.sensor.availableTestPatternModes')
1010*b7c941bbSAndroid Build Coastguard Worker
1011*b7c941bbSAndroid Build Coastguard Worker
1012*b7c941bbSAndroid Build Coastguard Workerdef color_bars_test_pattern(props):
1013*b7c941bbSAndroid Build Coastguard Worker  """Determines if camera supports color bars test pattern.
1014*b7c941bbSAndroid Build Coastguard Worker
1015*b7c941bbSAndroid Build Coastguard Worker  Args:
1016*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1017*b7c941bbSAndroid Build Coastguard Worker
1018*b7c941bbSAndroid Build Coastguard Worker  Returns:
1019*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.sensor.availableTestPatternModes has
1020*b7c941bbSAndroid Build Coastguard Worker             COLOR_BARS_TEST_PATTERN.
1021*b7c941bbSAndroid Build Coastguard Worker  """
1022*b7c941bbSAndroid Build Coastguard Worker  return COLOR_BARS_TEST_PATTERN in props.get(
1023*b7c941bbSAndroid Build Coastguard Worker      'android.sensor.availableTestPatternModes')
1024*b7c941bbSAndroid Build Coastguard Worker
1025*b7c941bbSAndroid Build Coastguard Worker
1026*b7c941bbSAndroid Build Coastguard Workerdef linear_tonemap(props):
1027*b7c941bbSAndroid Build Coastguard Worker  """Determines if camera supports CONTRAST_CURVE or GAMMA_VALUE in tonemap.
1028*b7c941bbSAndroid Build Coastguard Worker
1029*b7c941bbSAndroid Build Coastguard Worker  Args:
1030*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1031*b7c941bbSAndroid Build Coastguard Worker
1032*b7c941bbSAndroid Build Coastguard Worker  Returns:
1033*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.tonemap.availableToneMapModes has
1034*b7c941bbSAndroid Build Coastguard Worker             CONTRAST_CURVE (0) or GAMMA_VALUE (3).
1035*b7c941bbSAndroid Build Coastguard Worker  """
1036*b7c941bbSAndroid Build Coastguard Worker  return ('android.tonemap.availableToneMapModes' in props and
1037*b7c941bbSAndroid Build Coastguard Worker          (0 in props.get('android.tonemap.availableToneMapModes') or
1038*b7c941bbSAndroid Build Coastguard Worker           3 in props.get('android.tonemap.availableToneMapModes')))
1039*b7c941bbSAndroid Build Coastguard Worker
1040*b7c941bbSAndroid Build Coastguard Worker
1041*b7c941bbSAndroid Build Coastguard Workerdef get_reprocess_formats(props):
1042*b7c941bbSAndroid Build Coastguard Worker  """Retrieve the list of supported reprocess formats.
1043*b7c941bbSAndroid Build Coastguard Worker
1044*b7c941bbSAndroid Build Coastguard Worker  Args:
1045*b7c941bbSAndroid Build Coastguard Worker    props: The camera properties.
1046*b7c941bbSAndroid Build Coastguard Worker
1047*b7c941bbSAndroid Build Coastguard Worker  Returns:
1048*b7c941bbSAndroid Build Coastguard Worker    A list of supported reprocess formats.
1049*b7c941bbSAndroid Build Coastguard Worker  """
1050*b7c941bbSAndroid Build Coastguard Worker  reprocess_formats = []
1051*b7c941bbSAndroid Build Coastguard Worker  if yuv_reprocess(props):
1052*b7c941bbSAndroid Build Coastguard Worker    reprocess_formats.append('yuv')
1053*b7c941bbSAndroid Build Coastguard Worker  if private_reprocess(props):
1054*b7c941bbSAndroid Build Coastguard Worker    reprocess_formats.append('private')
1055*b7c941bbSAndroid Build Coastguard Worker  return reprocess_formats
1056*b7c941bbSAndroid Build Coastguard Worker
1057*b7c941bbSAndroid Build Coastguard Worker
1058*b7c941bbSAndroid Build Coastguard Workerdef color_space_to_int(color_space):
1059*b7c941bbSAndroid Build Coastguard Worker  """Returns the integer ordinal of a named color space.
1060*b7c941bbSAndroid Build Coastguard Worker
1061*b7c941bbSAndroid Build Coastguard Worker  Args:
1062*b7c941bbSAndroid Build Coastguard Worker    color_space: The color space string.
1063*b7c941bbSAndroid Build Coastguard Worker
1064*b7c941bbSAndroid Build Coastguard Worker  Returns:
1065*b7c941bbSAndroid Build Coastguard Worker    Int. Ordinal of the color space.
1066*b7c941bbSAndroid Build Coastguard Worker  """
1067*b7c941bbSAndroid Build Coastguard Worker  if color_space == 'UNSPECIFIED':
1068*b7c941bbSAndroid Build Coastguard Worker    return -1
1069*b7c941bbSAndroid Build Coastguard Worker
1070*b7c941bbSAndroid Build Coastguard Worker  return COLOR_SPACES.index(color_space)
1071*b7c941bbSAndroid Build Coastguard Worker
1072*b7c941bbSAndroid Build Coastguard Worker
1073*b7c941bbSAndroid Build Coastguard Workerdef autoframing(props):
1074*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports autoframing.
1075*b7c941bbSAndroid Build Coastguard Worker
1076*b7c941bbSAndroid Build Coastguard Worker  Args:
1077*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1078*b7c941bbSAndroid Build Coastguard Worker
1079*b7c941bbSAndroid Build Coastguard Worker  Returns:
1080*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.control.autoframing is supported.
1081*b7c941bbSAndroid Build Coastguard Worker  """
1082*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.autoframingAvailable' in props and props[
1083*b7c941bbSAndroid Build Coastguard Worker      'android.control.autoframingAvailable'] == 1
1084*b7c941bbSAndroid Build Coastguard Worker
1085*b7c941bbSAndroid Build Coastguard Worker
1086*b7c941bbSAndroid Build Coastguard Workerdef ae_regions(props):
1087*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports CONTROL_AE_REGIONS.
1088*b7c941bbSAndroid Build Coastguard Worker
1089*b7c941bbSAndroid Build Coastguard Worker  Args:
1090*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1091*b7c941bbSAndroid Build Coastguard Worker
1092*b7c941bbSAndroid Build Coastguard Worker  Returns:
1093*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.control.aeRegions is supported.
1094*b7c941bbSAndroid Build Coastguard Worker  """
1095*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.maxRegionsAe' in props and props[
1096*b7c941bbSAndroid Build Coastguard Worker      'android.control.maxRegionsAe'] != 0
1097*b7c941bbSAndroid Build Coastguard Worker
1098*b7c941bbSAndroid Build Coastguard Worker
1099*b7c941bbSAndroid Build Coastguard Workerdef awb_regions(props):
1100*b7c941bbSAndroid Build Coastguard Worker  """Returns whether a device supports CONTROL_AWB_REGIONS.
1101*b7c941bbSAndroid Build Coastguard Worker
1102*b7c941bbSAndroid Build Coastguard Worker  Args:
1103*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1104*b7c941bbSAndroid Build Coastguard Worker
1105*b7c941bbSAndroid Build Coastguard Worker  Returns:
1106*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if android.control.awbRegions is supported.
1107*b7c941bbSAndroid Build Coastguard Worker  """
1108*b7c941bbSAndroid Build Coastguard Worker  return 'android.control.maxRegionsAwb' in props and props[
1109*b7c941bbSAndroid Build Coastguard Worker      'android.control.maxRegionsAwb'] != 0
1110*b7c941bbSAndroid Build Coastguard Worker
1111*b7c941bbSAndroid Build Coastguard Worker
1112*b7c941bbSAndroid Build Coastguard Workerdef preview_stabilization_supported(props):
1113*b7c941bbSAndroid Build Coastguard Worker  """Returns whether preview stabilization is supported.
1114*b7c941bbSAndroid Build Coastguard Worker
1115*b7c941bbSAndroid Build Coastguard Worker  Args:
1116*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1117*b7c941bbSAndroid Build Coastguard Worker
1118*b7c941bbSAndroid Build Coastguard Worker  Returns:
1119*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if preview stabilization is supported.
1120*b7c941bbSAndroid Build Coastguard Worker  """
1121*b7c941bbSAndroid Build Coastguard Worker  supported_stabilization_modes = props[
1122*b7c941bbSAndroid Build Coastguard Worker      'android.control.availableVideoStabilizationModes'
1123*b7c941bbSAndroid Build Coastguard Worker  ]
1124*b7c941bbSAndroid Build Coastguard Worker  supported = (
1125*b7c941bbSAndroid Build Coastguard Worker      supported_stabilization_modes is not None and
1126*b7c941bbSAndroid Build Coastguard Worker      STABILIZATION_MODE_PREVIEW in supported_stabilization_modes
1127*b7c941bbSAndroid Build Coastguard Worker  )
1128*b7c941bbSAndroid Build Coastguard Worker  return supported
1129*b7c941bbSAndroid Build Coastguard Worker
1130*b7c941bbSAndroid Build Coastguard Worker
1131*b7c941bbSAndroid Build Coastguard Workerdef optical_stabilization_supported(props):
1132*b7c941bbSAndroid Build Coastguard Worker  """Returns whether optical image stabilization is supported.
1133*b7c941bbSAndroid Build Coastguard Worker
1134*b7c941bbSAndroid Build Coastguard Worker  Args:
1135*b7c941bbSAndroid Build Coastguard Worker    props: Camera properties object.
1136*b7c941bbSAndroid Build Coastguard Worker
1137*b7c941bbSAndroid Build Coastguard Worker  Returns:
1138*b7c941bbSAndroid Build Coastguard Worker    Boolean. True if optical image stabilization is supported.
1139*b7c941bbSAndroid Build Coastguard Worker  """
1140*b7c941bbSAndroid Build Coastguard Worker  optical_stabilization_modes = props[
1141*b7c941bbSAndroid Build Coastguard Worker      'android.lens.info.availableOpticalStabilization'
1142*b7c941bbSAndroid Build Coastguard Worker    ]
1143*b7c941bbSAndroid Build Coastguard Worker  logging.debug('optical_stabilization_modes = %s',
1144*b7c941bbSAndroid Build Coastguard Worker                str(optical_stabilization_modes))
1145*b7c941bbSAndroid Build Coastguard Worker
1146*b7c941bbSAndroid Build Coastguard Worker  # Check if OIS supported
1147*b7c941bbSAndroid Build Coastguard Worker  ois_supported = (optical_stabilization_modes is not None and
1148*b7c941bbSAndroid Build Coastguard Worker                   LENS_OPTICAL_STABILIZATION_MODE_ON in
1149*b7c941bbSAndroid Build Coastguard Worker                   optical_stabilization_modes)
1150*b7c941bbSAndroid Build Coastguard Worker  return ois_supported
1151