Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(644)

Side by Side Diff: webrtc/audio/test/low_bandwidth_audio_test.py

Issue 2694203002: Low-bandwidth audio testing (Closed)
Patch Set: Move call_test dependency where it belongs Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. 2 # Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 # 3 #
4 # Use of this source code is governed by a BSD-style license 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 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 6 # tree. An additional intellectual property rights grant can be found
7 # in the file PATENTS. All contributing project authors may 7 # in the file PATENTS. All contributing project authors may
8 # be found in the AUTHORS file in the root of the source tree. 8 # be found in the AUTHORS file in the root of the source tree.
9 9
10 """ 10 """
11 This script is the wrapper that runs the low-bandwidth audio test. 11 This script is the wrapper that runs the low-bandwidth audio test.
12 12
13 After running the test, post-process steps for calculating audio quality of the 13 After running the test, post-process steps for calculating audio quality of the
14 output files will be performed. 14 output files will be performed.
15 """ 15 """
16 16
17 import argparse 17 import argparse
18 import logging 18 import logging
19 import os 19 import os
20 import re
20 import subprocess 21 import subprocess
21 import sys 22 import sys
22 23
23 24
24 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) 25 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
25 SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir, 26 SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir,
26 os.pardir)) 27 os.pardir))
27 28
28 29
29 def _RunCommand(argv, cwd=SRC_DIR, **kwargs): 30 def _LogCommand(command):
30 logging.info('Running %r', argv) 31 logging.info('Running %r', command)
31 subprocess.check_call(argv, cwd=cwd, **kwargs) 32 return command
32 33
33 34
34 def _ParseArgs(): 35 def _ParseArgs():
35 parser = argparse.ArgumentParser(description='Run low-bandwidth audio tests.') 36 parser = argparse.ArgumentParser(description='Run low-bandwidth audio tests.')
36 parser.add_argument('build_dir', 37 parser.add_argument('build_dir',
37 help='Path to the build directory (e.g. out/Release).') 38 help='Path to the build directory (e.g. out/Release).')
39 parser.add_argument('--remove', action='store_true',
40 help='Remove output audio files after testing.')
38 args = parser.parse_args() 41 args = parser.parse_args()
39 return args 42 return args
40 43
41 44
45 def _GetPlatform():
46 if sys.platform == 'win32':
47 return 'win'
48 elif sys.platform == 'darwin':
49 return 'mac'
50 elif sys.platform.startswith('linux'):
51 return 'linux'
52
53
54 def _GetExecutableExtension():
55 if sys.platform == 'win32':
56 return '.exe'
57 else:
58 return ''
59
60
61 def _DownloadTools():
62 tools_dir = os.path.join(SRC_DIR, 'tools-webrtc')
63 toolchain_dir = os.path.join(tools_dir, 'audio_quality')
64
65 # Download pesq.
66 download_script = os.path.join(tools_dir, 'download_tools.py')
67 command = [sys.executable, download_script, toolchain_dir]
68 subprocess.check_call(_LogCommand(command))
69
70 pesq_path = os.path.join(toolchain_dir, _GetPlatform(),
71 'pesq' + _GetExecutableExtension())
72 return pesq_path
73
74
42 def main(): 75 def main():
43 # pylint: disable=W0101 76 # pylint: disable=W0101
44 logging.basicConfig(level=logging.INFO) 77 logging.basicConfig(level=logging.INFO)
45 78
46 args = _ParseArgs() 79 args = _ParseArgs()
47 80
48 test_executable = os.path.join(args.build_dir, 'low_bandwidth_audio_test') 81 pesq_path = _DownloadTools()
49 if sys.platform == 'win32':
50 test_executable += '.exe'
51 82
52 _RunCommand([test_executable]) 83 test_executable_path = os.path.join(args.build_dir,
84 'low_bandwidth_audio_test' + _GetExecutableExtension())
85
86 # Start the test executable that produces audio files.
87 command = [test_executable_path]
88 test_process = subprocess.Popen(_LogCommand(command), stdout=subprocess.PIPE)
89
90 for line in iter(test_process.stdout.readline, ''):
91 # Echo the output to screen.
92 sys.stdout.write(line)
93
94 # Extract specific lines that contain information about produced files.
95 match = re.search(r'^TEST (\w+) ([^:]+?):([^:]+?)\n?$', line)
96 if not match:
97 continue
98 test_name, reference_file, degraded_file = match.groups()
99
100 # Analyze audio
101 command = [pesq_path, '+16000', reference_file, degraded_file]
102 pesq_output = subprocess.check_output(_LogCommand(command))
103
104 if args.remove:
105 os.remove(degraded_file)
106
107 # Find the scores in stdout of pesq.
108 match = re.search(
109 r'Prediction \(Raw MOS, MOS-LQO\):\s+=\s+([\d.]+)\s+([\d.]+)',
110 pesq_output)
111 if match:
112 raw_mos, _ = match.groups()
113
114 # Output a result for the perf dashboard.
115 print 'RESULT pesq_mos: %s= %s score' % (test_name, raw_mos)
116 else:
117 logging.error('PESQ: %s', pesq_output.splitlines()[-1])
118
119 return test_process.wait()
53 120
54 121
55 if __name__ == '__main__': 122 if __name__ == '__main__':
56 sys.exit(main()) 123 sys.exit(main())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698