1dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org#!/usr/bin/env python 2dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org# Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org# 4dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org# Use of this source code is governed by a BSD-style license 5dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org# that can be found in the LICENSE file in the root of the source 6dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org# tree. An additional intellectual property rights grant can be found 7dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org# in the file PATENTS. All contributing project authors may 8dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org# be found in the AUTHORS file in the root of the source tree. 9dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 10dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgimport optparse 11dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgimport os 12d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.orgimport shutil 13dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgimport subprocess 14dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgimport sys 15d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.orgimport tempfile 16dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 17dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 18dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgSCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) 19dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 203081f6d15fd27161b9f1f2addeb392220c47d971phoglund@webrtc.org# Chrome browsertests will throw away stderr; avoid that output gets lost. 213081f6d15fd27161b9f1f2addeb392220c47d971phoglund@webrtc.orgsys.stderr = sys.stdout 223081f6d15fd27161b9f1f2addeb392220c47d971phoglund@webrtc.org 23dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 24dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgdef _ParseArgs(): 25dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org """Registers the command-line options.""" 26dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org usage = 'usage: %prog [options]' 27dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser = optparse.OptionParser(usage=usage) 28dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 29d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org parser.add_option('--label', type='string', default='MY_TEST', 303524adea7db77f23c959a87847fd318a55986aa8kjellander@webrtc.org help=('Label of the test, used to identify different ' 313524adea7db77f23c959a87847fd318a55986aa8kjellander@webrtc.org 'tests. Default: %default')) 32dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.add_option('--ref_video', type='string', 33dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org help='Reference video to compare with (YUV).') 34dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.add_option('--test_video', type='string', 353524adea7db77f23c959a87847fd318a55986aa8kjellander@webrtc.org help=('Test video to be compared with the reference ' 36dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 'video (YUV).')) 37dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.add_option('--frame_analyzer', type='string', 38dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org help='Path to the frame analyzer executable.') 39d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org parser.add_option('--barcode_decoder', type='string', 40d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org help=('Path to the barcode decoder script. By default, we ' 41d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 'will assume we can find it in barcode_tools/' 42d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 'relative to this directory.')) 43d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org parser.add_option('--ffmpeg_path', type='string', 44d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org help=('The path to where the ffmpeg executable is located. ' 45d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 'If omitted, it will be assumed to be present in the ' 46d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 'PATH with the name ffmpeg[.exe].')) 47d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org parser.add_option('--zxing_path', type='string', 48d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org help=('The path to where the zxing executable is located. ' 49d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 'If omitted, it will be assumed to be present in the ' 50d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 'PATH with the name zxing[.exe].')) 51dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.add_option('--stats_file', type='string', default='stats.txt', 52dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org help=('Path to the temporary stats file to be created and ' 53dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 'used. Default: %default')) 54dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.add_option('--yuv_frame_width', type='int', default=640, 55dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org help='Width of the YUV file\'s frames. Default: %default') 56dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.add_option('--yuv_frame_height', type='int', default=480, 57dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org help='Height of the YUV file\'s frames. Default: %default') 58dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org options, _args = parser.parse_args() 59dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 60dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if not options.ref_video: 61dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.error('You must provide a path to the reference video!') 62dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if not os.path.exists(options.ref_video): 63dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.error('Cannot find the reference video at %s' % options.ref_video) 64dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 65dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if not options.test_video: 66dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.error('You must provide a path to the test video!') 67dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if not os.path.exists(options.test_video): 68dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.error('Cannot find the test video at %s' % options.test_video) 69dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 70dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if not options.frame_analyzer: 71dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.error('You must provide the path to the frame analyzer executable!') 72dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if not os.path.exists(options.frame_analyzer): 73dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org parser.error('Cannot find frame analyzer executable at %s!' % 74dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org options.frame_analyzer) 75dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org return options 76dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 77dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 78dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgdef main(): 79dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org """The main function. 80dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 81dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org A simple invocation is: 82dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org ./webrtc/tools/barcode_tools/compare_videos.py 83dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org --ref_video=<path_and_name_of_reference_video> 84dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org --test_video=<path_and_name_of_test_video> 85dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org --frame_analyzer=<path_and_name_of_the_frame_analyzer_executable> 86dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 87dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org Notice that the prerequisites for barcode_decoder.py also applies to this 88dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org script. The means the following executables have to be available in the PATH: 89dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org * zxing 90dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org * ffmpeg 91dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org """ 92dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org options = _ParseArgs() 93dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 94d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org if options.barcode_decoder: 95d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org path_to_decoder = options.barcode_decoder 96d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org else: 97d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org path_to_decoder = os.path.join(SCRIPT_DIR, 'barcode_tools', 98d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 'barcode_decoder.py') 99369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org 100369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org # On Windows, sometimes the inherited stdin handle from the parent process 101369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org # fails. Work around this by passing null to stdin to the subprocesses. 102369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org null_filehandle = open(os.devnull, 'r') 103369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org 104d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org # Run barcode decoder on the test video to identify frame numbers. 105d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org png_working_directory = tempfile.mkdtemp() 106dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org cmd = [ 107dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org sys.executable, 108dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org path_to_decoder, 109dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--yuv_file=%s' % options.test_video, 110dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--yuv_frame_width=%d' % options.yuv_frame_width, 111dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--yuv_frame_height=%d' % options.yuv_frame_height, 112dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--stats_file=%s' % options.stats_file, 113d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org '--png_working_dir=%s' % png_working_directory, 114dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org ] 115d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org if options.zxing_path: 116d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org cmd.append('--zxing_path=%s' % options.zxing_path) 117d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org if options.ffmpeg_path: 118d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org cmd.append('--ffmpeg_path=%s' % options.ffmpeg_path) 119369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org barcode_decoder = subprocess.Popen(cmd, stdin=null_filehandle, 120369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org stdout=sys.stdout, stderr=sys.stderr) 121dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org barcode_decoder.wait() 122d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org 123d95137e75f3d06b796120c590ef020d014a6981ephoglund@webrtc.org shutil.rmtree(png_working_directory) 124dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if barcode_decoder.returncode != 0: 1253081f6d15fd27161b9f1f2addeb392220c47d971phoglund@webrtc.org print 'Failed to run barcode decoder script.' 126dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org return 1 127dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 128dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org # Run frame analyzer to compare the videos and print output. 129dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org cmd = [ 130dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org options.frame_analyzer, 1313524adea7db77f23c959a87847fd318a55986aa8kjellander@webrtc.org '--label=%s' % options.label, 132dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--reference_file=%s' % options.ref_video, 133c10fc53efbf93f5cb8a1ab63ae064b45759ab72cphoglund@webrtc.org '--test_file=%s' % options.test_video, 134dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--stats_file=%s' % options.stats_file, 135dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--width=%d' % options.yuv_frame_width, 136dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org '--height=%d' % options.yuv_frame_height, 137dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org ] 138369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org frame_analyzer = subprocess.Popen(cmd, stdin=null_filehandle, 139369da50e034d8319442819bbd4b2cfc66bd113aakjellander@webrtc.org stdout=sys.stdout, stderr=sys.stderr) 140dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org frame_analyzer.wait() 141dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org if frame_analyzer.returncode != 0: 1423081f6d15fd27161b9f1f2addeb392220c47d971phoglund@webrtc.org print 'Failed to run frame analyzer.' 143dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org return 1 144dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 145dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org return 0 146dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org 147dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.orgif __name__ == '__main__': 148dc2b152a4e91c6e27693e42abbd8ffbe1558e9ddkjellander@webrtc.org sys.exit(main()) 149