blob: a5d267b0b29a3a306ce696b5dce7bfa964808ecd [file] [log] [blame]
jansson1b0e3b82017-03-13 02:15:51 -07001#!/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 07:40:26 -070010import glob
jansson1b0e3b82017-03-13 02:15:51 -070011import optparse
12import os
jansson80ff00c2017-04-11 07:40:26 -070013import shutil
jansson1b0e3b82017-03-13 02:15:51 -070014import subprocess
15import sys
16import time
jansson80ff00c2017-04-11 07:40:26 -070017
jansson1b0e3b82017-03-13 02:15:51 -070018
19# Used to time-stamp output files and directories
20CURRENT_TIME = time.strftime("%d_%m_%Y-%H:%M:%S")
21
jansson5c7a6232017-03-15 08:27:31 -070022
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 02:15:51 -070039def _ParseArgs():
40 """Registers the command-line options."""
41 usage = 'usage: %prog [options]'
42 parser = optparse.OptionParser(usage=usage)
43
jansson9b932032017-06-02 02:16:27 -070044 parser.add_option('--frame_width', type='int', default=1280,
jansson1b0e3b82017-03-13 02:15:51 -070045 help='Width of the recording. Default: %default')
jansson9b932032017-06-02 02:16:27 -070046 parser.add_option('--frame_height', type='int', default=720,
jansson1b0e3b82017-03-13 02:15:51 -070047 help='Height of the recording. Default: %default')
jansson9b932032017-06-02 02:16:27 -070048 parser.add_option('--framerate', type='int', default=60,
jansson1b0e3b82017-03-13 02:15:51 -070049 help='Recording framerate. Default: %default')
jansson9b932032017-06-02 02:16:27 -070050 parser.add_option('--ref_duration', type='int', default=20,
jansson1b0e3b82017-03-13 02:15:51 -070051 help='Reference recording duration. Default: %default')
jansson9b932032017-06-02 02:16:27 -070052 parser.add_option('--test_duration', type='int', default=10,
jansson1b0e3b82017-03-13 02:15:51 -070053 help='Test recording duration. Default: %default')
jansson9b932032017-06-02 02:16:27 -070054 parser.add_option('--time_between_recordings', type='int', default=5,
jansson1b0e3b82017-03-13 02:15:51 -070055 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',
82 help='Path to the zebra xing barcode analyzer.')
83 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!')
121 if not os.path.isfile(options.zxing_path):
122 parser.warning('Cannot find Zebra Xing, no metrics will be generated!')
123
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 08:27:31 -0700132
133 Returns:
jansson1b0e3b82017-03-13 02:15:51 -0700134 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 07:40:26 -0700161def 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 02:15:51 -0700163
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 07:40:26 -0700166
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 01:36:02 -0700187 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 07:40:26 -0700195
jansson07e20db2017-04-12 01:36:02 -0700196 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 07:40:26 -0700204 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 02:15:51 -0700211 This is due to Magewell capture devices have proven to be unstable after the
212 first recording attempt.
213
jansson80ff00c2017-04-11 07:40:26 -0700214 Args:
215 ref_video_device_path(string): reference recording device path.
216 test_video_device_path(string): test recording device path
jansson5c7a6232017-03-15 08:27:31 -0700217
218 Raises:
219 MagewellError: If no magewell devices are found.
jansson1b0e3b82017-03-13 02:15:51 -0700220 """
221
222 # Get the dev/videoN device name from the command line arguments.
jansson80ff00c2017-04-11 07:40:26 -0700223 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 02:15:51 -0700227
jansson5c7a6232017-03-15 08:27:31 -0700228 # 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 02:15:51 -0700235 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 02:15:51 -0700245 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 02:15:51 -0700250 bind.wait()
jansson5c7a6232017-03-15 08:27:31 -0700251 if bind.returncode == 0:
252 print 'Reset done!\n'
jansson1b0e3b82017-03-13 02:15:51 -0700253
254
jansson5c7a6232017-03-15 08:27:31 -0700255def StartRecording(options, ref_file_location, test_file_location):
jansson1b0e3b82017-03-13 02:15:51 -0700256 """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 08:27:31 -0700262
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 02:15:51 -0700269 """
270 ref_file_name = '%s_%s_ref.%s' % (options.app_name, CURRENT_TIME,
271 options.video_container)
jansson5c7a6232017-03-15 08:27:31 -0700272 ref_file = os.path.join(ref_file_location, ref_file_name)
jansson1b0e3b82017-03-13 02:15:51 -0700273
274 test_file_name = '%s_%s_test.%s' % (options.app_name, CURRENT_TIME,
275 options.video_container)
jansson5c7a6232017-03-15 08:27:31 -0700276 test_file = os.path.join(test_file_location, test_file_name)
jansson1b0e3b82017-03-13 02:15:51 -0700277
278 # Reference video recorder command line.
279 ref_cmd = [
280 options.ffmpeg,
281 '-v', 'error',
jansson9b932032017-06-02 02:16:27 -0700282 '-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 08:27:31 -0700290 ref_file
jansson1b0e3b82017-03-13 02:15:51 -0700291 ]
292
293 # Test video recorder command line.
294 test_cmd = [
295 options.ffmpeg,
296 '-v', 'error',
jansson9b932032017-06-02 02:16:27 -0700297 '-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 08:27:31 -0700305 test_file
jansson1b0e3b82017-03-13 02:15:51 -0700306 ]
307 print 'Trying to record from reference recorder...'
jansson9b932032017-06-02 02:16:27 -0700308 ref_recorder = subprocess.Popen(ref_cmd)
jansson1b0e3b82017-03-13 02:15:51 -0700309
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 02:16:27 -0700315 test_recorder = subprocess.Popen(test_cmd)
jansson1b0e3b82017-03-13 02:15:51 -0700316 test_recorder.wait()
317 ref_recorder.wait()
318
319 # ffmpeg does not abort when it fails, need to check return code.
jansson5c7a6232017-03-15 08:27:31 -0700320 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 02:15:51 -0700331
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 08:27:31 -0700346
347 Returns:
jansson1b0e3b82017-03-13 02:15:51 -0700348 recording_files_and_time(dict): key: value pair with the path to cropped
349 test and reference video files.
jansson5c7a6232017-03-15 08:27:31 -0700350
351 Raises:
352 FfmpegError: If the ffmpeg command fails.
jansson1b0e3b82017-03-13 02:15:51 -0700353 """
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 02:16:27 -0700364 '-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 02:15:51 -0700367 '-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 02:16:27 -0700379 '-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 02:15:51 -0700382 '-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 08:27:31 -0700388 test_crop = subprocess.Popen(test_video_crop_cmd)
389 test_crop.wait()
jansson1b0e3b82017-03-13 02:15:51 -0700390
jansson5c7a6232017-03-15 08:27:31 -0700391 # 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 02:15:51 -0700399 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 02:15:51 -0700407 return cropped_recordings
jansson1b0e3b82017-03-13 02:15:51 -0700408
409
jansson5c7a6232017-03-15 08:27:31 -0700410def CompareVideos(options, cropped_ref_file, cropped_test_file):
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200411 """Runs the compare_video.py script from src/rtc_tools using path.
jansson1b0e3b82017-03-13 02:15:51 -0700412
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 08:27:31 -0700419 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 02:15:51 -0700424 """
425 print 'Starting comparison...'
426 print 'Grab a coffee, this might take a few minutes...'
jansson1b0e3b82017-03-13 02:15:51 -0700427 compare_videos_script = os.path.abspath(options.compare_videos_script)
428 rec_path = os.path.abspath(os.path.join(
jansson5c7a6232017-03-15 08:27:31 -0700429 os.path.dirname(cropped_test_file)))
jansson1b0e3b82017-03-13 02:15:51 -0700430 result_file_name = os.path.join(rec_path, '%s_%s_result.txt') % (
431 options.app_name, CURRENT_TIME)
432
jansson5c7a6232017-03-15 08:27:31 -0700433 # Find the crop dimensions (e.g. 950 and 420) in the ref crop parameter
434 # string: 'hflip, crop=950:420:130:56'
jansson1b0e3b82017-03-13 02:15:51 -0700435 for param in options.ref_crop_parameters.split('crop'):
436 if param[0] == '=':
jansson9b932032017-06-02 02:16:27 -0700437 crop_width = int(param.split(':')[0].split('=')[1])
438 crop_height = int(param.split(':')[1])
jansson1b0e3b82017-03-13 02:15:51 -0700439
440 compare_cmd = [
jansson1b0e3b82017-03-13 02:15:51 -0700441 compare_videos_script,
jansson9b932032017-06-02 02:16:27 -0700442 '--ref_video=%s' % cropped_ref_file,
443 '--test_video=%s' % cropped_test_file,
444 '--frame_analyzer=%s' % os.path.abspath(options.frame_analyzer),
445 '--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 02:15:51 -0700453 ]
454
jansson5c7a6232017-03-15 08:27:31 -0700455 with open(result_file_name, 'w') as f:
jansson07e20db2017-04-12 01:36:02 -0700456 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 02:15:51 -0700465
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 \
475 --zxing_path ./zxing \
476 --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 08:27:31 -0700497 recording_result = StartRecording(options, record_paths['ref_rec_location'],
498 record_paths['test_rec_location'])
jansson1b0e3b82017-03-13 02:15:51 -0700499
500 # Do not require compare_video.py script to run, no metrics will be generated.
501 if options.compare_videos_script:
jansson5c7a6232017-03-15 08:27:31 -0700502 CompareVideos(options, recording_result['cropped_ref_file'],
503 recording_result['cropped_test_file'])
jansson1b0e3b82017-03-13 02:15:51 -0700504 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())