blob: a5d267b0b29a3a306ce696b5dce7bfa964808ecd [file] [log] [blame]
jansson1b0e3b82017-03-13 09:15:511#!/usr/bin/env python
2# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3#
4# Use of this source code is governed by a BSD-style license
5# that can be found in the LICENSE file in the root of the source
6# tree. An additional intellectual property rights grant can be found
7# in the file PATENTS. All contributing project authors may
8# be found in the AUTHORS file in the root of the source tree.
9
jansson80ff00c2017-04-11 14:40:2610import glob
jansson1b0e3b82017-03-13 09:15:5111import optparse
12import os
jansson80ff00c2017-04-11 14:40:2613import shutil
jansson1b0e3b82017-03-13 09:15:5114import subprocess
15import sys
16import time
jansson80ff00c2017-04-11 14:40:2617
jansson1b0e3b82017-03-13 09:15:5118
19# Used to time-stamp output files and directories
20CURRENT_TIME = time.strftime("%d_%m_%Y-%H:%M:%S")
21
jansson5c7a6232017-03-15 15:27:3122
23class Error(Exception):
24 pass
25
26
27class FfmpegError(Error):
28 pass
29
30
31class MagewellError(Error):
32 pass
33
34
35class CompareVideosError(Error):
36 pass
37
38
jansson1b0e3b82017-03-13 09:15:5139def _ParseArgs():
40 """Registers the command-line options."""
41 usage = 'usage: %prog [options]'
42 parser = optparse.OptionParser(usage=usage)
43
jansson9b932032017-06-02 09:16:2744 parser.add_option('--frame_width', type='int', default=1280,
jansson1b0e3b82017-03-13 09:15:5145 help='Width of the recording. Default: %default')
jansson9b932032017-06-02 09:16:2746 parser.add_option('--frame_height', type='int', default=720,
jansson1b0e3b82017-03-13 09:15:5147 help='Height of the recording. Default: %default')
jansson9b932032017-06-02 09:16:2748 parser.add_option('--framerate', type='int', default=60,
jansson1b0e3b82017-03-13 09:15:5149 help='Recording framerate. Default: %default')
jansson9b932032017-06-02 09:16:2750 parser.add_option('--ref_duration', type='int', default=20,
jansson1b0e3b82017-03-13 09:15:5151 help='Reference recording duration. Default: %default')
jansson9b932032017-06-02 09:16:2752 parser.add_option('--test_duration', type='int', default=10,
jansson1b0e3b82017-03-13 09:15:5153 help='Test recording duration. Default: %default')
jansson9b932032017-06-02 09:16:2754 parser.add_option('--time_between_recordings', type='int', default=5,
jansson1b0e3b82017-03-13 09:15:5155 help='Time between starting test recording after ref.'
56 'Default: %default')
57 parser.add_option('--ref_video_device', type='string', default='/dev/video0',
58 help='Reference recording device. Default: %default')
59 parser.add_option('--test_video_device', type='string', default='/dev/video1',
60 help='Test recording device. Default: %default')
61 parser.add_option('--app_name', type='string',
62 help='Name of the app under test.')
63 parser.add_option('--recording_api', type='string', default='Video4Linux2',
64 help='Recording API to use. Default: %default')
65 parser.add_option('--pixel_format', type='string', default='yuv420p',
66 help='Recording pixel format Default: %default')
67 parser.add_option('--ffmpeg', type='string',
68 help='Path to the ffmpeg executable for the reference '
69 'device.')
70 parser.add_option('--video_container', type='string', default='yuv',
71 help='Video container for the recordings.'
72 'Default: %default')
73 parser.add_option('--compare_videos_script', type='string',
74 default='compare_videos.py',
75 help='Path to script used to compare and generate metrics.'
76 'Default: %default')
77 parser.add_option('--frame_analyzer', type='string',
78 default='../../out/Default/frame_analyzer',
79 help='Path to the frame analyzer executable.'
80 'Default: %default')
81 parser.add_option('--zxing_path', type='string',
Magnus Jedvert3e169ac2018-08-24 12:44:5982 help='Path to the zebra xing barcode analyzer.')
jansson1b0e3b82017-03-13 09:15:5183 parser.add_option('--ref_rec_dir', type='string', default='ref',
84 help='Path to where reference recordings will be created.'
85 'Ideally keep the ref and test directories on separate'
86 'drives. Default: %default')
87 parser.add_option('--test_rec_dir', type='string', default='test',
88 help='Path to where test recordings will be created.'
89 'Ideally keep the ref and test directories on separate '
90 'drives. Default: %default')
91 parser.add_option('--test_crop_parameters', type='string',
92 help='ffmpeg processing parameters for the test video.')
93 parser.add_option('--ref_crop_parameters', type='string',
94 help='ffmpeg processing parameters for the ref video.')
95
96 options, _ = parser.parse_args()
97
98 if not options.app_name:
99 parser.error('You must provide an application name!')
100
101 if not options.test_crop_parameters or not options.ref_crop_parameters:
102 parser.error('You must provide ref and test crop parameters!')
103
104 # Ensure the crop filter is included in the crop parameters used for ffmpeg.
105 if 'crop' not in options.ref_crop_parameters:
106 parser.error('You must provide a reference crop filter for ffmpeg.')
107 if 'crop' not in options.test_crop_parameters:
108 parser.error('You must provide a test crop filter for ffmpeg.')
109
110 if not options.ffmpeg:
111 parser.error('You most provide location for the ffmpeg executable.')
112 if not os.path.isfile(options.ffmpeg):
113 parser.error('Cannot find the ffmpeg executable.')
114
115 # compare_videos.py dependencies.
116 if not os.path.isfile(options.compare_videos_script):
117 parser.warning('Cannot find compare_videos.py script, no metrics will be '
118 'generated!')
119 if not os.path.isfile(options.frame_analyzer):
120 parser.warning('Cannot find frame_analyzer, no metrics will be generated!')
Magnus Jedvert3e169ac2018-08-24 12:44:59121 if not os.path.isfile(options.zxing_path):
122 parser.warning('Cannot find Zebra Xing, no metrics will be generated!')
jansson1b0e3b82017-03-13 09:15:51123
124 return options
125
126
127def CreateRecordingDirs(options):
128 """Create root + sub directories for reference and test recordings.
129
130 Args:
131 options(object): Contains all the provided command line options.
jansson5c7a6232017-03-15 15:27:31132
133 Returns:
jansson1b0e3b82017-03-13 09:15:51134 record_paths(dict): key: value pair with reference and test file
135 absolute paths.
136 """
137
138 # Create root directories for the video recordings.
139 if not os.path.isdir(options.ref_rec_dir):
140 os.makedirs(options.ref_rec_dir)
141 if not os.path.isdir(options.test_rec_dir):
142 os.makedirs(options.test_rec_dir)
143
144 # Create and time-stamp directories for all the output files.
145 ref_rec_dir = os.path.join(options.ref_rec_dir, options.app_name + '_' + \
146 CURRENT_TIME)
147 test_rec_dir = os.path.join(options.test_rec_dir, options.app_name + '_' + \
148 CURRENT_TIME)
149
150 os.makedirs(ref_rec_dir)
151 os.makedirs(test_rec_dir)
152
153 record_paths = {
154 'ref_rec_location' : os.path.abspath(ref_rec_dir),
155 'test_rec_location' : os.path.abspath(test_rec_dir)
156 }
157
158 return record_paths
159
160
jansson80ff00c2017-04-11 14:40:26161def FindUsbPortForV4lDevices(ref_video_device, test_video_device):
162 """Tries to find the usb port for ref_video_device and test_video_device.
jansson1b0e3b82017-03-13 09:15:51163
164 Tries to find the provided ref_video_device and test_video_device devices
165 which use video4linux and then do a soft reset by using USB unbind and bind.
jansson80ff00c2017-04-11 14:40:26166
167 Args:
168 ref_device(string): reference recording device path.
169 test_device(string): test recording device path
170
171 Returns:
172 usb_ports(list): USB ports(string) for the devices found.
173 """
174
175 # Find the device location including USB and USB Bus ID's. Use the usb1
176 # in the path since the driver folder is a symlink which contains all the
177 # usb device port mappings and it's the same in all usbN folders. Tested
178 # on Ubuntu 14.04.
179 v4l_device_path = '/sys/bus/usb/devices/usb1/1-1/driver/**/**/video4linux/'
180 v4l_ref_device = glob.glob('%s%s' % (v4l_device_path, ref_video_device))
181 v4l_test_device = glob.glob('%s%s' % (v4l_device_path, test_video_device))
182 usb_ports = []
183 paths = []
184
185 # Split on the driver folder first since we are only interested in the
186 # folders thereafter.
jansson07e20db2017-04-12 08:36:02187 try:
188 ref_path = str(v4l_ref_device).split('driver')[1].split('/')
189 test_path = str(v4l_test_device).split('driver')[1].split('/')
190 except IndexError:
191 print 'Could not find one or both of the specified recording devices.'
192 else:
193 paths.append(ref_path)
194 paths.append(test_path)
jansson80ff00c2017-04-11 14:40:26195
jansson07e20db2017-04-12 08:36:02196 for path in paths:
197 for usb_id in path:
198 # Look for : separator and then use the first element in the list.
199 # E.g 3-3.1:1.0 split on : and [0] becomes 3-3.1 which can be used
200 # for bind/unbind.
201 if ':' in usb_id:
202 usb_ports.append(usb_id.split(':')[0])
203
jansson80ff00c2017-04-11 14:40:26204 return usb_ports
205
206
207def RestartMagewellDevices(ref_video_device_path, test_video_device_path):
208 """Reset the USB ports where Magewell capture devices are connected to.
209
210 Performs a soft reset by using USB unbind and bind.
jansson1b0e3b82017-03-13 09:15:51211 This is due to Magewell capture devices have proven to be unstable after the
212 first recording attempt.
213
jansson80ff00c2017-04-11 14:40:26214 Args:
215 ref_video_device_path(string): reference recording device path.
216 test_video_device_path(string): test recording device path
jansson5c7a6232017-03-15 15:27:31217
218 Raises:
219 MagewellError: If no magewell devices are found.
jansson1b0e3b82017-03-13 09:15:51220 """
221
222 # Get the dev/videoN device name from the command line arguments.
jansson80ff00c2017-04-11 14:40:26223 ref_magewell_path = ref_video_device_path.split('/')[2]
224 test_magewell_path = test_video_device_path.split('/')[2]
225 magewell_usb_ports = FindUsbPortForV4lDevices(ref_magewell_path,
226 test_magewell_path)
jansson1b0e3b82017-03-13 09:15:51227
jansson5c7a6232017-03-15 15:27:31228 # Abort early if no devices are found.
229 if len(magewell_usb_ports) == 0:
230 raise MagewellError('No magewell devices found.')
231 else:
232 print '\nResetting USB ports where magewell devices are connected...'
233 # Use the USB bus and port ID (e.g. 4-3) to unbind and bind the USB devices
234 # (i.e. soft eject and insert).
jansson1b0e3b82017-03-13 09:15:51235 for usb_port in magewell_usb_ports:
236 echo_cmd = ['echo', usb_port]
237 unbind_cmd = ['sudo', 'tee', '/sys/bus/usb/drivers/usb/unbind']
238 bind_cmd = ['sudo', 'tee', '/sys/bus/usb/drivers/usb/bind']
239
240 # TODO(jansson) Figure out a way to call on echo once for bind & unbind
241 # if possible.
242 echo_unbind = subprocess.Popen(echo_cmd, stdout=subprocess.PIPE)
243 unbind = subprocess.Popen(unbind_cmd, stdin=echo_unbind.stdout)
244 echo_unbind.stdout.close()
jansson1b0e3b82017-03-13 09:15:51245 unbind.wait()
246
247 echo_bind = subprocess.Popen(echo_cmd, stdout=subprocess.PIPE)
248 bind = subprocess.Popen(bind_cmd, stdin=echo_bind.stdout)
249 echo_bind.stdout.close()
jansson1b0e3b82017-03-13 09:15:51250 bind.wait()
jansson5c7a6232017-03-15 15:27:31251 if bind.returncode == 0:
252 print 'Reset done!\n'
jansson1b0e3b82017-03-13 09:15:51253
254
jansson5c7a6232017-03-15 15:27:31255def StartRecording(options, ref_file_location, test_file_location):
jansson1b0e3b82017-03-13 09:15:51256 """Starts recording from the two specified video devices.
257
258 Args:
259 options(object): Contains all the provided command line options.
260 record_paths(dict): key: value pair with reference and test file
261 absolute paths.
jansson5c7a6232017-03-15 15:27:31262
263 Returns:
264 recording_files_and_time(dict): key: value pair with the path to cropped
265 test and reference video files.
266
267 Raises:
268 FfmpegError: If the ffmpeg command fails.
jansson1b0e3b82017-03-13 09:15:51269 """
270 ref_file_name = '%s_%s_ref.%s' % (options.app_name, CURRENT_TIME,
271 options.video_container)
jansson5c7a6232017-03-15 15:27:31272 ref_file = os.path.join(ref_file_location, ref_file_name)
jansson1b0e3b82017-03-13 09:15:51273
274 test_file_name = '%s_%s_test.%s' % (options.app_name, CURRENT_TIME,
275 options.video_container)
jansson5c7a6232017-03-15 15:27:31276 test_file = os.path.join(test_file_location, test_file_name)
jansson1b0e3b82017-03-13 09:15:51277
278 # Reference video recorder command line.
279 ref_cmd = [
280 options.ffmpeg,
281 '-v', 'error',
jansson9b932032017-06-02 09:16:27282 '-s', '%dx%d' % (options.frame_width, options.frame_height),
283 '-r', '%d' % options.framerate,
284 '-f', '%s' % options.recording_api,
285 '-i', '%s' % options.ref_video_device,
286 '-pix_fmt', '%s' % options.pixel_format,
287 '-s', '%dx%d' % (options.frame_width, options.frame_height),
288 '-t', '%d' % options.ref_duration,
289 '-r', '%d' % options.framerate,
jansson5c7a6232017-03-15 15:27:31290 ref_file
jansson1b0e3b82017-03-13 09:15:51291 ]
292
293 # Test video recorder command line.
294 test_cmd = [
295 options.ffmpeg,
296 '-v', 'error',
jansson9b932032017-06-02 09:16:27297 '-s', '%dx%d' % (options.frame_width, options.frame_height),
298 '-r', '%d' % options.framerate,
299 '-f', '%s' % options.recording_api,
300 '-i', '%s' % options.test_video_device,
301 '-pix_fmt', '%s' % options.pixel_format,
302 '-s', '%dx%d' % (options.frame_width, options.frame_height),
303 '-t', '%d' % options.test_duration,
304 '-r', '%d' % options.framerate,
jansson5c7a6232017-03-15 15:27:31305 test_file
jansson1b0e3b82017-03-13 09:15:51306 ]
307 print 'Trying to record from reference recorder...'
jansson9b932032017-06-02 09:16:27308 ref_recorder = subprocess.Popen(ref_cmd)
jansson1b0e3b82017-03-13 09:15:51309
310 # Start the 2nd recording a little later to ensure the 1st one has started.
311 # TODO(jansson) Check that the ref_recorder output file exists rather than
312 # using sleep.
313 time.sleep(options.time_between_recordings)
314 print 'Trying to record from test recorder...'
jansson9b932032017-06-02 09:16:27315 test_recorder = subprocess.Popen(test_cmd)
jansson1b0e3b82017-03-13 09:15:51316 test_recorder.wait()
317 ref_recorder.wait()
318
319 # ffmpeg does not abort when it fails, need to check return code.
jansson5c7a6232017-03-15 15:27:31320 if ref_recorder.returncode != 0 or test_recorder.returncode != 0:
321 # Cleanup recording directories.
322 shutil.rmtree(ref_file_location)
323 shutil.rmtree(test_file_location)
324 raise FfmpegError('Recording failed, check ffmpeg output.')
325 else:
326 print 'Ref file recorded to: ' + os.path.abspath(ref_file)
327 print 'Test file recorded to: ' + os.path.abspath(test_file)
328 print 'Recording done!\n'
329 return FlipAndCropRecordings(options, test_file_name, test_file_location,
330 ref_file_name, ref_file_location)
jansson1b0e3b82017-03-13 09:15:51331
332
333def FlipAndCropRecordings(options, test_file_name, test_file_location,
334 ref_file_name, ref_file_location):
335 """Performs a horizontal flip of the reference video to match the test video.
336
337 This is done to the match orientation and then crops the ref and test videos
338 using the options.test_crop_parameters and options.ref_crop_parameters.
339
340 Args:
341 options(object): Contains all the provided command line options.
342 test_file_name(string): Name of the test video file recording.
343 test_file_location(string): Path to the test video file recording.
344 ref_file_name(string): Name of the reference video file recording.
345 ref_file_location(string): Path to the reference video file recording.
jansson5c7a6232017-03-15 15:27:31346
347 Returns:
jansson1b0e3b82017-03-13 09:15:51348 recording_files_and_time(dict): key: value pair with the path to cropped
349 test and reference video files.
jansson5c7a6232017-03-15 15:27:31350
351 Raises:
352 FfmpegError: If the ffmpeg command fails.
jansson1b0e3b82017-03-13 09:15:51353 """
354 print 'Trying to crop videos...'
355
356 # Ref file cropping.
357 cropped_ref_file_name = 'cropped_' + ref_file_name
358 cropped_ref_file = os.path.abspath(
359 os.path.join(ref_file_location, cropped_ref_file_name))
360
361 ref_video_crop_cmd = [
362 options.ffmpeg,
363 '-v', 'error',
jansson9b932032017-06-02 09:16:27364 '-s', '%dx%d' % (options.frame_width, options.frame_height),
365 '-i', '%s' % os.path.join(ref_file_location, ref_file_name),
366 '-vf', '%s' % options.ref_crop_parameters,
jansson1b0e3b82017-03-13 09:15:51367 '-c:a', 'copy',
368 cropped_ref_file
369 ]
370
371 # Test file cropping.
372 cropped_test_file_name = 'cropped_' + test_file_name
373 cropped_test_file = os.path.abspath(
374 os.path.join(test_file_location, cropped_test_file_name))
375
376 test_video_crop_cmd = [
377 options.ffmpeg,
378 '-v', 'error',
jansson9b932032017-06-02 09:16:27379 '-s', '%dx%d' % (options.frame_width, options.frame_height),
380 '-i', '%s' % os.path.join(test_file_location, test_file_name),
381 '-vf', '%s' % options.test_crop_parameters,
jansson1b0e3b82017-03-13 09:15:51382 '-c:a', 'copy',
383 cropped_test_file
384 ]
385
386 ref_crop = subprocess.Popen(ref_video_crop_cmd)
387 ref_crop.wait()
jansson5c7a6232017-03-15 15:27:31388 test_crop = subprocess.Popen(test_video_crop_cmd)
389 test_crop.wait()
jansson1b0e3b82017-03-13 09:15:51390
jansson5c7a6232017-03-15 15:27:31391 # ffmpeg does not abort when it fails, need to check return code.
392 if ref_crop.returncode != 0 or test_crop.returncode != 0:
393 # Cleanup recording directories.
394 shutil.rmtree(ref_file_location)
395 shutil.rmtree(test_file_location)
396 raise FfmpegError('Cropping failed, check ffmpeg output.')
397 else:
398 print 'Ref file cropped to: ' + cropped_ref_file
jansson1b0e3b82017-03-13 09:15:51399 print 'Test file cropped to: ' + cropped_test_file
400 print 'Cropping done!\n'
401
402 # Need to return these so they can be used by other parts.
403 cropped_recordings = {
404 'cropped_test_file' : cropped_test_file,
405 'cropped_ref_file' : cropped_ref_file
406 }
jansson1b0e3b82017-03-13 09:15:51407 return cropped_recordings
jansson1b0e3b82017-03-13 09:15:51408
409
jansson5c7a6232017-03-15 15:27:31410def CompareVideos(options, cropped_ref_file, cropped_test_file):
Mirko Bonadei92ea95e2017-09-15 04:47:31411 """Runs the compare_video.py script from src/rtc_tools using path.
jansson1b0e3b82017-03-13 09:15:51412
413 Uses the path from recording_result and writes the output to a file named
414 <options.app_name + '_' + CURRENT_TIME + '_result.txt> in the reference video
415 recording folder taken from recording_result.
416
417 Args:
418 options(object): Contains all the provided command line options.
jansson5c7a6232017-03-15 15:27:31419 cropped_ref_file(string): Path to cropped reference video file.
420 cropped_test_file(string): Path to cropped test video file.
421
422 Raises:
423 CompareVideosError: If compare_videos.py fails.
jansson1b0e3b82017-03-13 09:15:51424 """
425 print 'Starting comparison...'
426 print 'Grab a coffee, this might take a few minutes...'
jansson1b0e3b82017-03-13 09:15:51427 compare_videos_script = os.path.abspath(options.compare_videos_script)
428 rec_path = os.path.abspath(os.path.join(
jansson5c7a6232017-03-15 15:27:31429 os.path.dirname(cropped_test_file)))
jansson1b0e3b82017-03-13 09:15:51430 result_file_name = os.path.join(rec_path, '%s_%s_result.txt') % (
431 options.app_name, CURRENT_TIME)
432
Magnus Jedvert3e169ac2018-08-24 12:44:59433 # Find the crop dimensions (e.g. 950 and 420) in the ref crop parameter
434 # string: 'hflip, crop=950:420:130:56'
435 for param in options.ref_crop_parameters.split('crop'):
436 if param[0] == '=':
437 crop_width = int(param.split(':')[0].split('=')[1])
438 crop_height = int(param.split(':')[1])
439
jansson1b0e3b82017-03-13 09:15:51440 compare_cmd = [
jansson1b0e3b82017-03-13 09:15:51441 compare_videos_script,
jansson9b932032017-06-02 09:16:27442 '--ref_video=%s' % cropped_ref_file,
443 '--test_video=%s' % cropped_test_file,
444 '--frame_analyzer=%s' % os.path.abspath(options.frame_analyzer),
Magnus Jedvert3e169ac2018-08-24 12:44:59445 '--zxing_path=%s' % options.zxing_path,
446 '--ffmpeg_path=%s' % options.ffmpeg,
447 '--stats_file_ref=%s_stats.txt' %
448 os.path.join(os.path.dirname(cropped_ref_file), cropped_ref_file),
449 '--stats_file_test=%s_stats.txt' %
450 os.path.join(os.path.dirname(cropped_test_file), cropped_test_file),
451 '--yuv_frame_height=%d' % crop_height,
452 '--yuv_frame_width=%d' % crop_width
jansson1b0e3b82017-03-13 09:15:51453 ]
454
jansson5c7a6232017-03-15 15:27:31455 with open(result_file_name, 'w') as f:
jansson07e20db2017-04-12 08:36:02456 try:
457 compare_video_recordings = subprocess.check_output(compare_cmd)
458 f.write(compare_video_recordings)
459 except subprocess.CalledProcessError as error:
460 raise CompareVideosError('Failed to perform comparison: %s' % error)
461 else:
462 print 'Result recorded to: %s' % os.path.abspath(result_file_name)
463 print 'Comparison done!'
464 return compare_video_recordings
jansson1b0e3b82017-03-13 09:15:51465
466
467def main():
468 """The main function.
469
470 A simple invocation is:
471 ./run_video_analysis.py \
472 --app_name AppRTCMobile \
473 --ffmpeg ./ffmpeg --ref_video_device=/dev/video0 \
474 --test_video_device=/dev/video1 \
Magnus Jedvert3e169ac2018-08-24 12:44:59475 --zxing_path ./zxing \
jansson1b0e3b82017-03-13 09:15:51476 --test_crop_parameters 'crop=950:420:130:56' \
477 --ref_crop_parameters 'hflip, crop=950:420:130:56' \
478 --ref_rec_dir /tmp/ref \
479 --test_rec_dir /tmp/test
480
481 This will produce the following files if successful:
482 # Original video recordings.
483 /tmp/ref/AppRTCMobile_<recording date and time>_ref.yuv
484 /tmp/test/AppRTCMobile_<recording date and time>_test.yuv
485
486 # Cropped video recordings according to the crop parameters.
487 /tmp/ref/cropped_AppRTCMobile_<recording date and time>_ref.yuv
488 /tmp/test/cropped_AppRTCMobile_<recording date and time>_ref.yuv
489
490 # Comparison metrics from cropped test and ref videos.
491 /tmp/test/AppRTCMobile_<recording date and time>_result.text
492
493 """
494 options = _ParseArgs()
495 RestartMagewellDevices(options.ref_video_device, options.test_video_device)
496 record_paths = CreateRecordingDirs(options)
jansson5c7a6232017-03-15 15:27:31497 recording_result = StartRecording(options, record_paths['ref_rec_location'],
498 record_paths['test_rec_location'])
jansson1b0e3b82017-03-13 09:15:51499
500 # Do not require compare_video.py script to run, no metrics will be generated.
501 if options.compare_videos_script:
jansson5c7a6232017-03-15 15:27:31502 CompareVideos(options, recording_result['cropped_ref_file'],
503 recording_result['cropped_test_file'])
jansson1b0e3b82017-03-13 09:15:51504 else:
505 print ('Skipping compare videos step due to compare_videos flag were not '
506 'passed.')
507
508
509if __name__ == '__main__':
510 sys.exit(main())