Home | History | Annotate | Download | only in scene1
      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 
     15 import its.device
     16 import its.caps
     17 import its.objects
     18 import its.target
     19 
     20 AE_FRAMES_PER_ITERATION = 8
     21 AE_CONVERGE_ITERATIONS = 3
     22 # AE must converge within this number of auto requests under scene1
     23 THRESH_AE_CONVERGE = AE_FRAMES_PER_ITERATION * AE_CONVERGE_ITERATIONS
     24 
     25 def 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 
     84 if __name__ == '__main__':
     85     main()
     86