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