# Copyright 2014 The Android Open Source Project
|
#
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
# you may not use this file except in compliance with the License.
|
# You may obtain a copy of the License at
|
#
|
# http://www.apache.org/licenses/LICENSE-2.0
|
#
|
# Unless required by applicable law or agreed to in writing, software
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# See the License for the specific language governing permissions and
|
# limitations under the License.
|
|
import sys
|
import unittest
|
|
import its.objects
|
|
|
def skip_unless(cond):
|
"""Skips the test if the condition is false.
|
|
If a test is skipped, then it is exited and returns the special code
|
of 101 to the calling shell, which can be used by an external test
|
harness to differentiate a skip from a pass or fail.
|
|
Args:
|
cond: Boolean, which must be true for the test to not skip.
|
|
Returns:
|
Nothing.
|
"""
|
SKIP_RET_CODE = 101
|
|
if not cond:
|
print "Test skipped"
|
sys.exit(SKIP_RET_CODE)
|
|
def full_or_better(props):
|
"""Returns whether a device is a FULL or better camera2 device.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.info.supportedHardwareLevel") and \
|
props["android.info.supportedHardwareLevel"] != 2 and \
|
props["android.info.supportedHardwareLevel"] >= 1
|
|
def level3(props):
|
"""Returns whether a device is a LEVEL3 capability camera2 device.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.info.supportedHardwareLevel") and \
|
props["android.info.supportedHardwareLevel"] == 3
|
|
def full(props):
|
"""Returns whether a device is a FULL capability camera2 device.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.info.supportedHardwareLevel") and \
|
props["android.info.supportedHardwareLevel"] == 1
|
|
def limited(props):
|
"""Returns whether a device is a LIMITED capability camera2 device.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.info.supportedHardwareLevel") and \
|
props["android.info.supportedHardwareLevel"] == 0
|
|
def legacy(props):
|
"""Returns whether a device is a LEGACY capability camera2 device.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.info.supportedHardwareLevel") and \
|
props["android.info.supportedHardwareLevel"] == 2
|
|
def distortion_correction(props):
|
"""Returns whether a device supports DISTORTION_CORRECTION
|
capabilities.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.lens.distortion") and \
|
props["android.lens.distortion"] is not None
|
|
def manual_sensor(props):
|
"""Returns whether a device supports MANUAL_SENSOR capabilities.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
1 in props["android.request.availableCapabilities"]
|
|
def manual_post_proc(props):
|
"""Returns whether a device supports MANUAL_POST_PROCESSING capabilities.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
2 in props["android.request.availableCapabilities"]
|
|
def raw(props):
|
"""Returns whether a device supports RAW capabilities.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
3 in props["android.request.availableCapabilities"]
|
|
def raw16(props):
|
"""Returns whether a device supports RAW16 output.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return len(its.objects.get_available_output_sizes("raw", props)) > 0
|
|
def raw10(props):
|
"""Returns whether a device supports RAW10 output.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return len(its.objects.get_available_output_sizes("raw10", props)) > 0
|
|
def raw12(props):
|
"""Returns whether a device supports RAW12 output.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return len(its.objects.get_available_output_sizes("raw12", props)) > 0
|
|
def raw_output(props):
|
"""Returns whether a device supports any of RAW output format.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return raw16(props) or raw10(props) or raw12(props)
|
|
def y8(props):
|
"""Returns whether a device supports Y8 output.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return len(its.objects.get_available_output_sizes("y8", props)) > 0
|
|
def post_raw_sensitivity_boost(props):
|
"""Returns whether a device supports post RAW sensitivity boost..
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.control.postRawSensitivityBoostRange") and \
|
props["android.control.postRawSensitivityBoostRange"] != [100, 100]
|
|
def sensor_fusion(props):
|
"""Returns whether the camera and motion sensor timestamps for the device
|
are in the same time domain and can be compared directly.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.sensor.info.timestampSource") and \
|
props["android.sensor.info.timestampSource"] == 1
|
|
def read_3a(props):
|
"""Return whether a device supports reading out the following 3A settings:
|
sensitivity
|
exposure time
|
awb gain
|
awb cct
|
focus distance
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
# TODO: check available result keys explicitly
|
return manual_sensor(props) and manual_post_proc(props)
|
|
def compute_target_exposure(props):
|
"""Return whether a device supports target exposure computation in its.target module.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return manual_sensor(props) and manual_post_proc(props)
|
|
def freeform_crop(props):
|
"""Returns whether a device supports freefrom cropping.
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.scaler.croppingType") and \
|
props["android.scaler.croppingType"] == 1
|
|
def flash(props):
|
"""Returns whether a device supports flash control.
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.flash.info.available") and \
|
props["android.flash.info.available"] == 1
|
|
def per_frame_control(props):
|
"""Returns whether a device supports per frame control
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.sync.maxLatency") and \
|
props["android.sync.maxLatency"] == 0
|
|
def ev_compensation(props):
|
"""Returns whether a device supports ev compensation
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.control.aeCompensationRange") and \
|
props["android.control.aeCompensationRange"] != [0, 0]
|
|
def ae_lock(props):
|
"""Returns whether a device supports AE lock
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.control.aeLockAvailable") and \
|
props["android.control.aeLockAvailable"] == 1
|
|
def awb_lock(props):
|
"""Returns whether a device supports AWB lock
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.control.awbLockAvailable") and \
|
props["android.control.awbLockAvailable"] == 1
|
|
def lsc_map(props):
|
"""Returns whether a device supports lens shading map output
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key(
|
"android.statistics.info.availableLensShadingMapModes") and \
|
1 in props["android.statistics.info.availableLensShadingMapModes"]
|
|
def lsc_off(props):
|
"""Returns whether a device supports disabling lens shading correction
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key(
|
"android.shading.availableModes") and \
|
0 in props["android.shading.availableModes"]
|
|
def yuv_reprocess(props):
|
"""Returns whether a device supports YUV reprocessing.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
7 in props["android.request.availableCapabilities"]
|
|
def private_reprocess(props):
|
"""Returns whether a device supports PRIVATE reprocessing.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
4 in props["android.request.availableCapabilities"]
|
|
def noise_reduction_mode(props, mode):
|
"""Returns whether a device supports the noise reduction mode.
|
|
Args:
|
props: Camera properties objects.
|
mode: Integer, indicating the noise reduction mode to check for
|
availability.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key(
|
"android.noiseReduction.availableNoiseReductionModes") and mode \
|
in props["android.noiseReduction.availableNoiseReductionModes"];
|
|
def edge_mode(props, mode):
|
"""Returns whether a device supports the edge mode.
|
|
Args:
|
props: Camera properties objects.
|
mode: Integer, indicating the edge mode to check for availability.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key(
|
"android.edge.availableEdgeModes") and mode \
|
in props["android.edge.availableEdgeModes"];
|
|
|
def lens_calibrated(props):
|
"""Returns whether lens position is calibrated or not.
|
|
android.lens.info.focusDistanceCalibration has 3 modes.
|
0: Uncalibrated
|
1: Approximate
|
2: Calibrated
|
|
Args:
|
props: Camera properties objects.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.lens.info.focusDistanceCalibration") and \
|
props["android.lens.info.focusDistanceCalibration"] == 2
|
|
|
def lens_approx_calibrated(props):
|
"""Returns whether lens position is calibrated or not.
|
|
android.lens.info.focusDistanceCalibration has 3 modes.
|
0: Uncalibrated
|
1: Approximate
|
2: Calibrated
|
|
Args:
|
props: Camera properties objects.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.lens.info.focusDistanceCalibration") and \
|
(props["android.lens.info.focusDistanceCalibration"] == 1 or
|
props["android.lens.info.focusDistanceCalibration"] == 2)
|
|
|
def fixed_focus(props):
|
"""Returns whether a device is fixed focus.
|
|
props[android.lens.info.minimumFocusDistance] == 0 is fixed focus
|
|
Args:
|
props: Camera properties objects.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.lens.info.minimumFocusDistance") and \
|
props["android.lens.info.minimumFocusDistance"] == 0
|
|
def logical_multi_camera(props):
|
"""Returns whether a device is a logical multi-camera.
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
11 in props["android.request.availableCapabilities"]
|
|
def logical_multi_camera_physical_ids(props):
|
"""Returns a logical multi-camera's underlying physical cameras.
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
list of physical cameras backing the logical multi-camera.
|
"""
|
physicalIdsList = []
|
if logical_multi_camera(props):
|
physicalIdsList = props['camera.characteristics.physicalCamIds'];
|
return physicalIdsList
|
|
def mono_camera(props):
|
"""Returns whether a device is monochromatic.
|
|
Args:
|
props: Camera properties object.
|
|
Return:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
12 in props["android.request.availableCapabilities"]
|
|
|
def face_detect(props):
|
"""Returns whether a device has face detection mode.
|
|
props['android.statistics.info.availableFaceDetectModes'] != 0 is face det
|
|
Args:
|
props: Camera properties objects.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.statistics.info.availableFaceDetectModes") and \
|
props["android.statistics.info.availableFaceDetectModes"] != [0]
|
|
|
def debug_mode():
|
"""Returns True/False for whether test is run in debug mode.
|
|
Returns:
|
Boolean.
|
"""
|
for s in sys.argv[1:]:
|
if s[:6] == "debug=" and s[6:] == "True":
|
return True
|
return False
|
|
|
def sync_latency(props):
|
"""Returns sync latency in number of frames.
|
|
If undefined, 8 frames.
|
|
Returns:
|
integer number of frames
|
"""
|
sync_latency = props['android.sync.maxLatency']
|
if sync_latency < 0:
|
sync_latency = 8
|
return sync_latency
|
|
|
def backward_compatible(props):
|
"""Returns whether a device supports BACKWARD_COMPATIBLE.
|
|
Args:
|
props: Camera properties object.
|
|
Returns:
|
Boolean.
|
"""
|
return props.has_key("android.request.availableCapabilities") and \
|
0 in props["android.request.availableCapabilities"]
|
|
|
class __UnitTest(unittest.TestCase):
|
"""Run a suite of unit tests on this module.
|
"""
|
# TODO: Add more unit tests.
|
|
if __name__ == '__main__':
|
unittest.main()
|