Home | History | Annotate | Download | only in scene1
      1 # Copyright 2015 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.caps
     16 import its.device
     17 import its.image
     18 import its.objects
     19 import matplotlib
     20 import numpy
     21 import os
     22 import os.path
     23 import pylab
     24 
     25 def main():
     26     """Test that the android.shading.mode param is applied.
     27 
     28     Switching shading modes and checks that the lens shading maps are
     29     modified as expected.
     30     """
     31     NAME = os.path.basename(__file__).split(".")[0]
     32 
     33     NUM_SHADING_MODE_SWITCH_LOOPS = 3
     34     THRESHOLD_DIFF_RATIO = 0.15
     35 
     36     with its.device.ItsSession() as cam:
     37         props = cam.get_camera_properties()
     38 
     39         its.caps.skip_unless(its.caps.per_frame_control(props) and
     40                              its.caps.lsc_map(props) and
     41                              its.caps.lsc_off(props))
     42 
     43         assert(props.has_key("android.lens.info.shadingMapSize") and
     44                props["android.lens.info.shadingMapSize"] != None)
     45 
     46         # lsc_off devices should always support OFF(0), FAST(1), and HQ(2)
     47         assert(props.has_key("android.shading.availableModes") and
     48                set(props["android.shading.availableModes"]) == set([0, 1, 2]))
     49 
     50         num_map_gains = props["android.lens.info.shadingMapSize"]["width"] * \
     51                         props["android.lens.info.shadingMapSize"]["height"] * 4
     52 
     53         # Test 1: Switching shading modes several times and verify:
     54         #   1. Lens shading maps with mode OFF are all 1.0
     55         #   2. Lens shading maps with mode FAST are similar after switching
     56         #      shading modes.
     57         #   3. Lens shading maps with mode HIGH_QUALITY are similar after
     58         #      switching shading modes.
     59         cam.do_3a();
     60 
     61         # Get the reference lens shading maps for OFF, FAST, and HIGH_QUALITY
     62         # in different sessions.
     63         # reference_maps[mode]
     64         reference_maps = [[] for mode in range(3)]
     65         reference_maps[0] = [1.0] * num_map_gains
     66         for mode in range(1, 3):
     67             req = its.objects.auto_capture_request();
     68             req["android.statistics.lensShadingMapMode"] = 1
     69             req["android.shading.mode"] = mode
     70             reference_maps[mode] = cam.do_capture(req)["metadata"] \
     71                     ["android.statistics.lensShadingMap"]
     72 
     73         # Get the lens shading maps while switching modes in one session.
     74         reqs = []
     75         for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
     76             for mode in range(3):
     77                 req = its.objects.auto_capture_request();
     78                 req["android.statistics.lensShadingMapMode"] = 1
     79                 req["android.shading.mode"] = mode
     80                 reqs.append(req);
     81 
     82         caps = cam.do_capture(reqs)
     83 
     84         # shading_maps[mode][loop]
     85         shading_maps = [[[] for loop in range(NUM_SHADING_MODE_SWITCH_LOOPS)]
     86                 for mode in range(3)]
     87 
     88         # Get the shading maps out of capture results
     89         for i in range(len(caps)):
     90             shading_maps[i % 3][i / 3] = \
     91                     caps[i]["metadata"]["android.statistics.lensShadingMap"]
     92 
     93         # Draw the maps
     94         for mode in range(3):
     95             for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
     96                 pylab.clf()
     97                 pylab.plot(range(num_map_gains), shading_maps[mode][i], 'r')
     98                 pylab.plot(range(num_map_gains), reference_maps[mode], 'g')
     99                 pylab.xlim([0, num_map_gains])
    100                 pylab.ylim([0.9, 4.0])
    101                 matplotlib.pyplot.savefig("%s_ls_maps_mode_%d_loop_%d.png" %
    102                                           (NAME, mode, i))
    103 
    104         print "Verifying lens shading maps with mode OFF are all 1.0"
    105         for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
    106             assert(numpy.allclose(shading_maps[0][i], reference_maps[0]))
    107 
    108         for mode in range(1, 3):
    109             print "Verifying lens shading maps with mode", mode, "are similar"
    110             for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
    111                 assert(numpy.allclose(shading_maps[mode][i],
    112                                       reference_maps[mode],
    113                                       THRESHOLD_DIFF_RATIO))
    114 
    115 if __name__ == '__main__':
    116     main()
    117