Index: webrtc/examples/androidtests/video_quality_loopback_test.py |
diff --git a/webrtc/examples/androidtests/video_quality_loopback_test.py b/webrtc/examples/androidtests/video_quality_loopback_test.py |
index 7c7ef313f9259de111cdbce488030c272d411d91..a62d31c8b893ef8357e987792515038ee2a3dece 100755 |
--- a/webrtc/examples/androidtests/video_quality_loopback_test.py |
+++ b/webrtc/examples/androidtests/video_quality_loopback_test.py |
@@ -19,17 +19,34 @@ It assumes you have a Android device plugged in. |
""" |
import argparse |
+import atexit |
import logging |
import os |
import shutil |
import subprocess |
import sys |
import tempfile |
+import time |
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir, |
os.pardir)) |
+WEBRTC_DEPS_INSTRUCTIONS = """Please add a solution to your .gclient file like |
+this and run gclient sync: |
+{ |
+ "name": "webrtc.DEPS", |
+ "url": "https://chromium.googlesource.com/chromium/deps/webrtc/webrtc.DEPS", |
+}, |
+""" |
+ |
+ |
+class Error(Exception): |
+ pass |
+ |
+ |
+class VideoQualityTestError(Error): |
+ pass |
def _RunCommand(argv, cwd=SRC_DIR, **kwargs): |
@@ -37,6 +54,22 @@ def _RunCommand(argv, cwd=SRC_DIR, **kwargs): |
subprocess.check_call(argv, cwd=cwd, **kwargs) |
+def _RunCommandWithOutput(argv, cwd=SRC_DIR, **kwargs): |
+ logging.info('Running %r', argv) |
+ return subprocess.check_output(argv, cwd=cwd, **kwargs) |
+ |
+ |
+def _RunBackgroundCommand(argv, cwd=SRC_DIR): |
+ logging.info('Running %r', argv) |
+ process = subprocess.Popen(argv, cwd=cwd) |
+ atexit.register(process.terminate) |
+ time.sleep(0.5) |
+ status = process.poll() |
+ if status: # is not None or 0 |
+ raise subprocess.CalledProcessError(status, argv) |
+ return process |
+ |
+ |
def _ParseArgs(): |
parser = argparse.ArgumentParser(description='Start loopback video analysis.') |
parser.add_argument('build_dir_android', |
@@ -45,6 +78,7 @@ def _ParseArgs(): |
help='The path to the build directory for building locally.') |
parser.add_argument('--temp_dir', |
help='A temporary directory to put the output.') |
+ parser.add_argument('--adb-path', help='Path to adb binary.', default='adb') |
args = parser.parse_args() |
return args |
@@ -58,6 +92,7 @@ def main(): |
build_dir_android = args.build_dir_android |
build_dir_x86 = args.build_dir_x86 |
temp_dir = args.temp_dir |
+ adb_path = args.adb_path |
if not temp_dir: |
temp_dir = tempfile.mkdtemp() |
else: |
@@ -76,14 +111,49 @@ def main(): |
download_script = os.path.join(tools_dir, 'download_tools.py') |
_RunCommand([sys.executable, download_script, toolchain_dir]) |
+ # Select an Android device in case multiple are connected |
+ for line in _RunCommandWithOutput([adb_path, 'devices']).splitlines(): |
+ if line.endswith('\tdevice'): |
+ android_device = line.split('\t')[0] |
+ break |
+ else: |
+ raise VideoQualityTestError('Cannot find any connected Android device.') |
+ |
+ # Start AppRTC Server |
+ dev_appserver = os.path.join(SRC_DIR, 'out', 'apprtc', 'google_appengine', |
+ 'dev_appserver.py') |
+ if not os.path.isfile(dev_appserver): |
+ raise VideoQualityTestError('Cannot find %s.\n%s' % |
+ (dev_appserver, WEBRTC_DEPS_INSTRUCTIONS)) |
+ appengine_dir = os.path.join(SRC_DIR, 'out', 'apprtc', 'out', 'app_engine') |
+ _RunBackgroundCommand(['python', dev_appserver, appengine_dir, |
+ '--port=9999', '--admin_port=9998', |
+ '--skip_sdk_update_check', '--clear_datastore=yes']) |
+ |
+ # Start Collider |
+ collider_path = os.path.join(SRC_DIR, 'out', 'go-workspace', 'bin', |
+ 'collidermain') |
+ if not os.path.isfile(collider_path): |
+ raise VideoQualityTestError('Cannot find %s.\n%s' % |
+ (collider_path, WEBRTC_DEPS_INSTRUCTIONS)) |
+ _RunBackgroundCommand([collider_path, '-tls=false', |
+ '-port=8089', '-room-server=http://localhost:9999']) |
+ |
+ # Start adb reverse forwarder |
+ reverseforwarder_path = os.path.join( |
+ SRC_DIR, 'build', 'android', 'adb_reverse_forwarder.py') |
+ _RunBackgroundCommand([reverseforwarder_path, '--device', android_device, |
+ '9999', '9999', '8089', '8089']) |
+ |
# Run the Espresso code. |
test_script = os.path.join(build_dir_android, |
'bin', 'run_AppRTCMobileTestStubbedVideoIO') |
- _RunCommand([sys.executable, test_script]) |
+ _RunCommand([test_script, '--device', android_device]) |
# Pull the output video. |
test_video = os.path.join(temp_dir, 'test_video.y4m') |
- _RunCommand(['adb', 'pull', '/sdcard/output.y4m', test_video]) |
+ _RunCommand([adb_path, '-s', android_device, |
+ 'pull', '/sdcard/output.y4m', test_video]) |
test_video_yuv = os.path.join(temp_dir, 'test_video.yuv') |
@@ -103,8 +173,7 @@ def main(): |
ConvertVideo(reference_video, reference_video_yuv) |
# Run compare script. |
- compare_script = os.path.join(SRC_DIR, 'webrtc', 'tools', |
- 'compare_videos.py') |
+ compare_script = os.path.join(SRC_DIR, 'webrtc', 'tools', 'compare_videos.py') |
zxing_path = os.path.join(toolchain_dir, 'linux', 'zxing') |
# The frame_analyzer binary should be built for local computer and not for |