1# Copyright 2014 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15import its.device 16import its.caps 17import its.objects 18import its.target 19 20AE_FRAMES_PER_ITERATION = 8 21AE_CONVERGE_ITERATIONS = 3 22# AE must converge within this number of auto requests under scene1 23THRESH_AE_CONVERGE = AE_FRAMES_PER_ITERATION * AE_CONVERGE_ITERATIONS 24 25def main(): 26 """Test the AE state machine when using the precapture trigger. 27 """ 28 29 INACTIVE = 0 30 SEARCHING = 1 31 CONVERGED = 2 32 LOCKED = 3 33 FLASHREQUIRED = 4 34 PRECAPTURE = 5 35 36 with its.device.ItsSession() as cam: 37 props = cam.get_camera_properties() 38 its.caps.skip_unless(its.caps.compute_target_exposure(props) and 39 its.caps.per_frame_control(props)) 40 41 _,fmt = its.objects.get_fastest_manual_capture_settings(props) 42 43 # Capture 5 manual requests, with AE disabled, and the last request 44 # has an AE precapture trigger (which should be ignored since AE is 45 # disabled). 46 manual_reqs = [] 47 e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"] 48 manual_req = its.objects.manual_capture_request(s,e) 49 manual_req['android.control.aeMode'] = 0 # Off 50 manual_reqs += [manual_req]*4 51 precap_req = its.objects.manual_capture_request(s,e) 52 precap_req['android.control.aeMode'] = 0 # Off 53 precap_req['android.control.aePrecaptureTrigger'] = 1 # Start 54 manual_reqs.append(precap_req) 55 caps = cam.do_capture(manual_reqs, fmt) 56 for cap in caps: 57 assert(cap['metadata']['android.control.aeState'] == INACTIVE) 58 59 # Capture an auto request and verify the AE state; no trigger. 60 auto_req = its.objects.auto_capture_request() 61 auto_req['android.control.aeMode'] = 1 # On 62 cap = cam.do_capture(auto_req, fmt) 63 state = cap['metadata']['android.control.aeState'] 64 print "AE state after auto request:", state 65 assert(state in [SEARCHING, CONVERGED]) 66 67 # Capture with auto request with a precapture trigger. 68 auto_req['android.control.aePrecaptureTrigger'] = 1 # Start 69 cap = cam.do_capture(auto_req, fmt) 70 state = cap['metadata']['android.control.aeState'] 71 print "AE state after auto request with precapture trigger:", state 72 assert(state in [SEARCHING, CONVERGED, PRECAPTURE]) 73 74 # Capture some more auto requests, and AE should converge. 75 auto_req['android.control.aePrecaptureTrigger'] = 0 76 for i in range(AE_CONVERGE_ITERATIONS): 77 caps = cam.do_capture([auto_req] * AE_FRAMES_PER_ITERATION, fmt) 78 state = caps[-1]['metadata']['android.control.aeState'] 79 print "AE state after auto request:", state 80 if state == CONVERGED: 81 return 82 assert(state == CONVERGED) 83 84if __name__ == '__main__': 85 main() 86