diff --git a/.gitignore b/.gitignore index bf937369ae..2104635e82 100644 --- a/.gitignore +++ b/.gitignore @@ -55,7 +55,6 @@ /tools_webrtc/audio_quality/win/*.exe /tools_webrtc/audio_quality/win/*.dll /tools_webrtc/video_quality_toolchain/linux/ffmpeg -/tools_webrtc/video_quality_toolchain/linux/frame_analyzer /tools_webrtc/video_quality_toolchain/linux/zxing /tools_webrtc/video_quality_toolchain/mac/ffmpeg /tools_webrtc/video_quality_toolchain/mac/zxing diff --git a/examples/BUILD.gn b/examples/BUILD.gn index 05ddef876a..efd4e798c6 100644 --- a/examples/BUILD.gn +++ b/examples/BUILD.gn @@ -154,6 +154,31 @@ if (is_android) { ] } + group("video_quality_loopback_test") { + testonly = true + + deps = [ + ":AppRTCMobile_stubbed_video_io_test_apk", + "../rtc_tools:frame_analyzer_host", + ] + + data = [ + "../build/android/adb_reverse_forwarder.py", + "../examples/androidtests/video_quality_loopback_test.py", + "../resources/reference_video_640x360_30fps.y4m", + "../rtc_tools/barcode_tools/barcode_decoder.py", + "../rtc_tools/barcode_tools/helper_functions.py", + "../rtc_tools/compare_videos.py", + "../rtc_tools/testing/prebuilt_apprtc.zip", + "../rtc_tools/testing/golang/linux/go.tar.gz", + "../rtc_tools/testing/build_apprtc.py", + "../rtc_tools/testing/utils.py", + "../tools_webrtc/video_quality_toolchain/linux/ffmpeg", + "../tools_webrtc/video_quality_toolchain/linux/zxing", + "${root_out_dir}/frame_analyzer_host", + ] + } + rtc_instrumentation_test_apk("AppRTCMobile_stubbed_video_io_test_apk") { apk_name = "AppRTCMobileTestStubbedVideoIO" android_manifest = "androidtests/AndroidManifest.xml" @@ -171,22 +196,6 @@ if (is_android) { "//third_party/hamcrest:hamcrest_java", "//third_party/junit", ] - - data = [ - "../build/android/adb_reverse_forwarder.py", - "../examples/androidtests/video_quality_loopback_test.py", - "../resources/reference_video_640x360_30fps.y4m", - "../rtc_tools/barcode_tools/barcode_decoder.py", - "../rtc_tools/barcode_tools/helper_functions.py", - "../rtc_tools/compare_videos.py", - "../rtc_tools/testing/prebuilt_apprtc.zip", - "../rtc_tools/testing/golang/linux/go.tar.gz", - "../rtc_tools/testing/build_apprtc.py", - "../rtc_tools/testing/utils.py", - "../tools_webrtc/video_quality_toolchain/linux/ffmpeg", - "../tools_webrtc/video_quality_toolchain/linux/frame_analyzer", - "../tools_webrtc/video_quality_toolchain/linux/zxing", - ] } } diff --git a/examples/androidtests/video_quality_loopback_test.py b/examples/androidtests/video_quality_loopback_test.py index 225f885273..a74acf177a 100755 --- a/examples/androidtests/video_quality_loopback_test.py +++ b/examples/androidtests/video_quality_loopback_test.py @@ -81,8 +81,6 @@ def _ParseArgs(): parser = argparse.ArgumentParser(description='Start loopback video analysis.') parser.add_argument('build_dir_android', help='The path to the build directory for Android.') - parser.add_argument('--build_dir_x86', - 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') @@ -192,7 +190,7 @@ def RunTest(android_device, adb_path, build_dir, temp_dir, num_retries, # Run comparison script. compare_script = os.path.join(SRC_DIR, 'rtc_tools', 'compare_videos.py') - frame_analyzer = os.path.join(TOOLCHAIN_DIR, 'frame_analyzer') + frame_analyzer = os.path.join(build_dir, 'frame_analyzer_host') zxing_path = os.path.join(TOOLCHAIN_DIR, 'zxing') stats_file_ref = os.path.join(temp_dir, 'stats_ref.txt') stats_file_test = os.path.join(temp_dir, 'stats_test.txt') @@ -241,4 +239,3 @@ def main(): if __name__ == '__main__': sys.exit(main()) - diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn index e84d0030d5..dcee868856 100644 --- a/rtc_tools/BUILD.gn +++ b/rtc_tools/BUILD.gn @@ -107,6 +107,17 @@ rtc_executable("frame_analyzer") { ] } +action("frame_analyzer_host") { + script = "//tools_webrtc/executable_host_build.py" + outputs = [ + "${root_out_dir}/frame_analyzer_host", + ] + args = [ + "--executable_name", + "frame_analyzer", + ] +} + # Only expose the targets needed by Chromium (e.g. frame_analyzer) to avoid # building a lot of redundant code as part of Chromium builds. if (!build_with_chromium) { diff --git a/tools_webrtc/executable_host_build.py b/tools_webrtc/executable_host_build.py new file mode 100644 index 0000000000..cc1e7ee59e --- /dev/null +++ b/tools_webrtc/executable_host_build.py @@ -0,0 +1,101 @@ +#!/usr/bin/env/python + +# Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. +# +# Use of this source code is governed by a BSD-style license +# that can be found in the LICENSE file in the root of the source +# tree. An additional intellectual property rights grant can be found +# in the file PATENTS. All contributing project authors may +# be found in the AUTHORS file in the root of the source tree. +""" +This script builds a GN executable targeting the host machine. + +It is useful, for example, for mobile devices performance testing where +it makes sense to build WebRTC for a mobile platform (e.g. Android) but +part of the test is performed on the host machine (e.g. running an +executable to analyze a video downloaded from a device). + +The script has only one (mandatory) option: --executable_name, which is +the output name of the GN executable. For example, if you have the +following executable in your out folder: + + out/Debug/random_exec + +You will be able to compile the same executable targeting your host machine +by running: + + $ python tools_webrtc/executable_host_build.py --executable_name random_exec + +The generated executable will have the same name as the input executable with +suffix '_host'. + +This script should not be used standalone but from GN, through an action: + + action("random_exec_host") { + script = "//tools_webrtc/executable_host_build.py" + outputs = [ + "${root_out_dir}/random_exec_host", + ] + args = [ + "--executable_name", + "random_exec", + ] + } + +The executable for the host machine will be generated in the GN out directory +(e.g. out/Debug in the previous example). +""" + +from contextlib import contextmanager + +import argparse +import os +import shutil +import subprocess +import sys +import tempfile + + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir)) +sys.path.append(os.path.join(SRC_DIR, 'build')) +import find_depot_tools + + +def _ParseArgs(): + desc = 'Generates a GN executable targeting the host machine.' + parser = argparse.ArgumentParser(description=desc) + parser.add_argument('--executable_name', + required=True, + help='Name of the executable to build') + args = parser.parse_args() + return args + + +@contextmanager +def HostBuildDir(): + temp_dir = tempfile.mkdtemp() + try: + yield temp_dir + finally: + shutil.rmtree(temp_dir) + + +def _RunCommand(argv, cwd=SRC_DIR, **kwargs): + with open(os.devnull, 'w') as devnull: + subprocess.check_call(argv, cwd=cwd, stdout=devnull, **kwargs) + + +def DepotToolPath(*args): + return os.path.join(find_depot_tools.DEPOT_TOOLS_PATH, *args) + + +if __name__ == '__main__': + ARGS = _ParseArgs() + EXECUTABLE_TO_BUILD = ARGS.executable_name + EXECUTABLE_FINAL_NAME = ARGS.executable_name + '_host' + with HostBuildDir() as build_dir: + _RunCommand([sys.executable, DepotToolPath('gn.py'), 'gen', build_dir]) + _RunCommand([DepotToolPath('ninja'), '-C', build_dir, EXECUTABLE_TO_BUILD]) + shutil.copy(os.path.join(build_dir, EXECUTABLE_TO_BUILD), + EXECUTABLE_FINAL_NAME) diff --git a/tools_webrtc/mb/gn_isolate_map.pyl b/tools_webrtc/mb/gn_isolate_map.pyl index 479c5eae79..fecc56c38e 100644 --- a/tools_webrtc/mb/gn_isolate_map.pyl +++ b/tools_webrtc/mb/gn_isolate_map.pyl @@ -129,7 +129,7 @@ "type": "console_test_launcher", }, "video_quality_loopback_test": { - "label": "//examples:AppRTCMobile_stubbed_video_io_test_apk", + "label": "//examples:video_quality_loopback_test", "type": "script", "script": "//examples/androidtests/video_quality_loopback_test.py", "args": ["."], diff --git a/tools_webrtc/video_quality_toolchain/linux/frame_analyzer.sha1 b/tools_webrtc/video_quality_toolchain/linux/frame_analyzer.sha1 deleted file mode 100644 index 9f7d4e9f74..0000000000 --- a/tools_webrtc/video_quality_toolchain/linux/frame_analyzer.sha1 +++ /dev/null @@ -1 +0,0 @@ -fe3e1e5253a1a49277e3ec9c0699ccf059cd8601 \ No newline at end of file