From 6d305baa04da51ab4229d22e05b27722b10d7bd0 Mon Sep 17 00:00:00 2001 From: oprypin Date: Thu, 30 Mar 2017 04:01:30 -0700 Subject: [PATCH] Add Windows, Mac, Android support to low bandwidth audio test BUG=webrtc:7229 Review-Url: https://codereview.webrtc.org/2767383005 Cr-Commit-Position: refs/heads/master@{#17470} --- tools-webrtc/download_tools.py | 4 +- webrtc/BUILD.gn | 5 +- webrtc/audio/BUILD.gn | 6 +- webrtc/audio/test/low_bandwidth_audio_test.cc | 3 +- webrtc/audio/test/low_bandwidth_audio_test.py | 68 +++++++++++++------ 5 files changed, 56 insertions(+), 30 deletions(-) diff --git a/tools-webrtc/download_tools.py b/tools-webrtc/download_tools.py index dc64ebf8b8..123fd3a4a5 100755 --- a/tools-webrtc/download_tools.py +++ b/tools-webrtc/download_tools.py @@ -20,6 +20,8 @@ import sys SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +# Needed to properly resolve PATH and executable extensions on Windows. +USE_SHELL = sys.platform == 'win32' def main(directories): @@ -37,7 +39,7 @@ def main(directories): path, ] print 'Downloading precompiled tools...' - subprocess.check_call(cmd) + subprocess.check_call(cmd, shell=USE_SHELL) if __name__ == '__main__': diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn index 0bc2eb321b..1e8508ac63 100644 --- a/webrtc/BUILD.gn +++ b/webrtc/BUILD.gn @@ -321,7 +321,10 @@ if (!build_with_chromium) { ] } if (rtc_enable_protobuf) { - deps += [ "logging:rtc_event_log2rtp_dump" ] + deps += [ + "audio:low_bandwidth_audio_test", + "logging:rtc_event_log2rtp_dump", + ] } } } diff --git a/webrtc/audio/BUILD.gn b/webrtc/audio/BUILD.gn index 4858c46571..0b4b580207 100644 --- a/webrtc/audio/BUILD.gn +++ b/webrtc/audio/BUILD.gn @@ -78,9 +78,6 @@ if (rtc_include_tests) { "//testing/gmock", "//testing/gtest", ] - if (rtc_enable_protobuf) { - deps += [ ":low_bandwidth_audio_test" ] - } if (!build_with_chromium && is_clang) { # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163). @@ -89,7 +86,7 @@ if (rtc_include_tests) { } if (rtc_enable_protobuf) { - rtc_executable("low_bandwidth_audio_test") { + rtc_test("low_bandwidth_audio_test") { testonly = true sources = [ @@ -101,7 +98,6 @@ if (rtc_include_tests) { "../common_audio", "../system_wrappers", "../test:fake_audio_device", - "../test:run_test", "../test:test_common", "../test:test_main", ] diff --git a/webrtc/audio/test/low_bandwidth_audio_test.cc b/webrtc/audio/test/low_bandwidth_audio_test.cc index 50d7e674e8..de955f75e1 100644 --- a/webrtc/audio/test/low_bandwidth_audio_test.cc +++ b/webrtc/audio/test/low_bandwidth_audio_test.cc @@ -13,7 +13,6 @@ #include "webrtc/audio/test/low_bandwidth_audio_test.h" #include "webrtc/common_audio/wav_file.h" #include "webrtc/test/gtest.h" -#include "webrtc/test/run_test.h" #include "webrtc/system_wrappers/include/sleep.h" #include "webrtc/test/testsupport/fileutils.h" @@ -109,7 +108,7 @@ void AudioQualityTest::OnTestFinished() { // Output information about the input and output audio files so that further // processing can be done by an external process. - printf("TEST %s %s:%s\n", test_info->name(), + printf("TEST %s %s %s\n", test_info->name(), AudioInputFile().c_str(), AudioOutputFile().c_str()); } diff --git a/webrtc/audio/test/low_bandwidth_audio_test.py b/webrtc/audio/test/low_bandwidth_audio_test.py index 6482d3d020..58243b1c98 100755 --- a/webrtc/audio/test/low_bandwidth_audio_test.py +++ b/webrtc/audio/test/low_bandwidth_audio_test.py @@ -18,6 +18,7 @@ import argparse import logging import os import re +import shutil import subprocess import sys @@ -38,6 +39,9 @@ def _ParseArgs(): help='Path to the build directory (e.g. out/Release).') parser.add_argument('--remove', action='store_true', help='Remove output audio files after testing.') + parser.add_argument('--android', action='store_true', + help='Perform the test on a connected Android device instead.') + parser.add_argument('--adb-path', help='Path to adb binary.', default='adb') args = parser.parse_args() return args @@ -51,13 +55,6 @@ def _GetPlatform(): return 'linux' -def _GetExecutableExtension(): - if sys.platform == 'win32': - return '.exe' - else: - return '' - - def _DownloadTools(): tools_dir = os.path.join(SRC_DIR, 'tools-webrtc') toolchain_dir = os.path.join(tools_dir, 'audio_quality') @@ -67,11 +64,24 @@ def _DownloadTools(): command = [sys.executable, download_script, toolchain_dir] subprocess.check_call(_LogCommand(command)) - pesq_path = os.path.join(toolchain_dir, _GetPlatform(), - 'pesq' + _GetExecutableExtension()) + pesq_path = os.path.join(toolchain_dir, _GetPlatform(), 'pesq') return pesq_path +def _GetFile(file_path, out_dir, android=False, adb_path=None): + out_file_name = os.path.basename(file_path) + out_file_path = os.path.join(out_dir, out_file_name) + + if android: + # Pull the file from the connected Android device + adb_command = [adb_path, 'pull', file_path, out_dir] + subprocess.check_call(_LogCommand(adb_command)) + elif os.path.abspath(file_path) != os.path.abspath(out_file_path): + shutil.copy(file_path, out_file_path) + + return out_file_path + + def main(): # pylint: disable=W0101 logging.basicConfig(level=logging.INFO) @@ -80,29 +90,41 @@ def main(): pesq_path = _DownloadTools() - test_executable_path = os.path.join(args.build_dir, - 'low_bandwidth_audio_test' + _GetExecutableExtension()) + out_dir = os.path.join(args.build_dir, '..') + if args.android: + test_command = [os.path.join(args.build_dir, 'bin', + 'run_low_bandwidth_audio_test'), '-v'] + else: + test_command = [os.path.join(args.build_dir, 'low_bandwidth_audio_test')] # Start the test executable that produces audio files. - command = [test_executable_path] - test_process = subprocess.Popen(_LogCommand(command), stdout=subprocess.PIPE) + test_process = subprocess.Popen(_LogCommand(test_command), + stdout=subprocess.PIPE) for line in iter(test_process.stdout.readline, ''): # Echo the output to screen. sys.stdout.write(line) # Extract specific lines that contain information about produced files. - match = re.search(r'^TEST (\w+) ([^:]+?):([^:]+?)\n?$', line) + # Output from Android has a prefix, need to skip it. + match = re.search(r'^(?:I\b.+\b)?TEST (\w+) ([^ ]+?) ([^ ]+?)\s*$', line) if not match: continue - test_name, reference_file, degraded_file = match.groups() + test_name = match.group(1) + reference_file = _GetFile(match.group(2), out_dir, + args.android, args.adb_path) + degraded_file = _GetFile(match.group(3), out_dir, + args.android, args.adb_path) - # Analyze audio - command = [pesq_path, '+16000', reference_file, degraded_file] - pesq_output = subprocess.check_output(_LogCommand(command)) - - if args.remove: - os.remove(degraded_file) + # Analyze audio. + pesq_command = [pesq_path, '+16000', + os.path.basename(reference_file), + os.path.basename(degraded_file)] + # Need to provide paths in the current directory due to a bug in PESQ: + # On Mac, for some 'path/to/file.wav', if 'file.wav' is longer than + # 'path/to', PESQ crashes. + pesq_output = subprocess.check_output(_LogCommand(pesq_command), + cwd=out_dir) # Find the scores in stdout of pesq. match = re.search( @@ -116,6 +138,10 @@ def main(): else: logging.error('PESQ: %s', pesq_output.splitlines()[-1]) + if args.remove: + os.remove(reference_file) + os.remove(degraded_file) + return test_process.wait()