Home | History | Annotate | Download | only in scene0
      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.image
     16 import its.caps
     17 import its.device
     18 import its.objects
     19 import os.path
     20 from matplotlib import pylab
     21 import matplotlib
     22 import matplotlib.pyplot
     23 
     24 def main():
     25     """Measure jitter in camera timestamps.
     26     """
     27     NAME = os.path.basename(__file__).split(".")[0]
     28 
     29     # Pass/fail thresholds
     30     MIN_AVG_FRAME_DELTA = 30 # at least 30ms delta between frames
     31     MAX_VAR_FRAME_DELTA = 0.01 # variance of frame deltas
     32     MAX_FRAME_DELTA_JITTER = 0.3 # max ms gap from the average frame delta
     33 
     34     with its.device.ItsSession() as cam:
     35         props = cam.get_camera_properties()
     36         its.caps.skip_unless(its.caps.manual_sensor(props) and
     37                              its.caps.sensor_fusion(props))
     38 
     39         req, fmt = its.objects.get_fastest_manual_capture_settings(props)
     40         caps = cam.do_capture([req]*50, [fmt])
     41 
     42         # Print out the millisecond delta between the start of each exposure
     43         tstamps = [c['metadata']['android.sensor.timestamp'] for c in caps]
     44         deltas = [tstamps[i]-tstamps[i-1] for i in range(1,len(tstamps))]
     45         deltas_ms = [d/1000000.0 for d in deltas]
     46         avg = sum(deltas_ms) / len(deltas_ms)
     47         var = sum([d*d for d in deltas_ms]) / len(deltas_ms) - avg * avg
     48         range0 = min(deltas_ms) - avg
     49         range1 = max(deltas_ms) - avg
     50         print "Average:", avg
     51         print "Variance:", var
     52         print "Jitter range:", range0, "to", range1
     53 
     54         # Draw a plot.
     55         pylab.plot(range(len(deltas_ms)), deltas_ms)
     56         matplotlib.pyplot.savefig("%s_deltas.png" % (NAME))
     57 
     58         # Test for pass/fail.
     59         assert(avg > MIN_AVG_FRAME_DELTA)
     60         assert(var < MAX_VAR_FRAME_DELTA)
     61         assert(abs(range0) < MAX_FRAME_DELTA_JITTER)
     62         assert(abs(range1) < MAX_FRAME_DELTA_JITTER)
     63 
     64 if __name__ == '__main__':
     65     main()
     66 
     67