Sebastian Jansson 1175ae0d80 Add log based GoogCC simulation to visualizer.
This CL adds  a mode to simulate roughly what GoogCC could have been
doing during the recording of an rtc event log by using the logged
events as input to GoogCC and visualizing the resulting target rate.

This is similar to the existing simulated_sendside_bwe mode, but uses
the new NetworkControllerInterface to ensure more reliable GoogCC
simulation.

Bug: None
Change-Id: I57894aa666151efc8405407d928b5257fb9b7d61
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/123924
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27095}
2019-03-13 09:39:14 +00:00

490 lines
13 KiB
Plaintext

# Copyright (c) 2014 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.
import("../webrtc.gni")
if (rtc_enable_protobuf) {
import("//third_party/protobuf/proto_library.gni")
}
group("rtc_tools") {
# This target shall build all targets in tools/.
testonly = true
deps = [
":command_line_parser",
":frame_analyzer",
":video_file_reader",
":video_quality_analysis",
]
if (!build_with_chromium) {
deps += [
":frame_editor",
":psnr_ssim_analyzer",
":rgba_to_i420_converter",
]
if (rtc_enable_protobuf) {
deps += [ ":chart_proto" ]
}
}
if (rtc_include_tests) {
deps += [
":activity_metric",
":tools_unittests",
]
if (rtc_enable_protobuf) {
if (!build_with_chromium) {
deps += [ ":event_log_visualizer" ]
}
deps += [
":rtp_analyzer",
":unpack_aecdump",
"network_tester",
]
}
}
}
rtc_static_library("command_line_parser") {
sources = [
"simple_command_line_parser.cc",
"simple_command_line_parser.h",
]
deps = [
"../rtc_base:gtest_prod",
"../rtc_base:rtc_base_approved",
]
}
rtc_static_library("video_file_reader") {
sources = [
"video_file_reader.cc",
"video_file_reader.h",
]
deps = [
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../rtc_base:checks",
"../rtc_base:rtc_base_approved",
"//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/types:optional",
]
}
rtc_static_library("video_file_writer") {
sources = [
"video_file_writer.cc",
"video_file_writer.h",
]
deps = [
":video_file_reader",
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../rtc_base:rtc_base_approved",
"//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/types:optional",
]
}
rtc_static_library("video_quality_analysis") {
sources = [
"frame_analyzer/linear_least_squares.cc",
"frame_analyzer/linear_least_squares.h",
"frame_analyzer/video_color_aligner.cc",
"frame_analyzer/video_color_aligner.h",
"frame_analyzer/video_geometry_aligner.cc",
"frame_analyzer/video_geometry_aligner.h",
"frame_analyzer/video_quality_analysis.cc",
"frame_analyzer/video_quality_analysis.h",
"frame_analyzer/video_temporal_aligner.cc",
"frame_analyzer/video_temporal_aligner.h",
]
deps = [
":video_file_reader",
"../api:array_view",
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../common_video",
"../rtc_base:checks",
"../rtc_base:rtc_base_approved",
"../test:perf_test",
"//third_party/abseil-cpp/absl/types:optional",
"//third_party/libyuv",
]
}
rtc_executable("frame_analyzer") {
visibility = [ "*" ]
sources = [
"frame_analyzer/frame_analyzer.cc",
]
deps = [
":command_line_parser",
":video_file_reader",
":video_file_writer",
":video_quality_analysis",
"../api:scoped_refptr",
"../rtc_base:stringutils",
"../test:perf_test",
"//third_party/abseil-cpp/absl/strings",
]
}
if (!build_with_chromium && !build_with_mozilla) {
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) {
rtc_executable("rtp_generator") {
visibility = [ "*" ]
testonly = true
sources = [
"rtp_generator/main.cc",
"rtp_generator/rtp_generator.cc",
"rtp_generator/rtp_generator.h",
]
deps = [
":command_line_parser",
"../api:libjingle_peerconnection_api",
"../api:transport_api",
"../api/video:builtin_video_bitrate_allocator_factory",
"../api/video_codecs:builtin_video_decoder_factory",
"../api/video_codecs:builtin_video_encoder_factory",
"../api/video_codecs:video_codecs_api",
"../call",
"../call:call_interfaces",
"../call:fake_network",
"../call:rtp_interfaces",
"../call:rtp_sender",
"../call:simulated_network",
"../call:simulated_packet_receiver",
"../call:video_stream_api",
"../logging:rtc_event_log_api",
"../logging:rtc_event_log_impl_base",
"../media:rtc_audio_video",
"../media:rtc_media_base",
"../rtc_base:rtc_base",
"../rtc_base:rtc_base_approved",
"../rtc_base:rtc_json",
"../rtc_base/system:file_wrapper",
"../test:fileutils",
"../test:rtp_test_utils",
"../test:video_test_common",
"//third_party/abseil-cpp/absl/strings",
]
}
rtc_executable("psnr_ssim_analyzer") {
sources = [
"psnr_ssim_analyzer/psnr_ssim_analyzer.cc",
]
deps = [
":command_line_parser",
":video_file_reader",
":video_quality_analysis",
"../api:scoped_refptr",
"../api/video:video_frame",
]
}
rtc_static_library("reference_less_video_analysis_lib") {
sources = [
"frame_analyzer/reference_less_video_analysis_lib.cc",
"frame_analyzer/reference_less_video_analysis_lib.h",
]
deps = [
":video_file_reader",
":video_quality_analysis",
"../api:scoped_refptr",
"../api/video:video_frame",
]
}
rtc_executable("reference_less_video_analysis") {
sources = [
"frame_analyzer/reference_less_video_analysis.cc",
]
deps = [
":command_line_parser",
":reference_less_video_analysis_lib",
]
}
rtc_executable("rgba_to_i420_converter") {
visibility = [ "*" ]
sources = [
"converter/converter.cc",
"converter/converter.h",
"converter/rgba_to_i420_converter.cc",
]
deps = [
":command_line_parser",
"../common_video",
"//third_party/libyuv",
]
}
rtc_static_library("frame_editing_lib") {
sources = [
"frame_editing/frame_editing_lib.cc",
"frame_editing/frame_editing_lib.h",
]
deps = [
"..:webrtc_common",
"../common_video",
]
}
rtc_executable("frame_editor") {
sources = [
"frame_editing/frame_editing.cc",
]
deps = [
":command_line_parser",
":frame_editing_lib",
]
}
if (rtc_enable_protobuf) {
proto_library("chart_proto") {
sources = [
"event_log_visualizer/proto/chart.proto",
"event_log_visualizer/proto/chart_enums.proto",
]
proto_out_dir = "rtc_tools/event_log_visualizer/proto"
}
rtc_static_library("event_log_visualizer_utils") {
visibility = [ "*" ]
sources = [
"event_log_visualizer/analyzer.cc",
"event_log_visualizer/analyzer.h",
"event_log_visualizer/log_simulation.cc",
"event_log_visualizer/log_simulation.h",
"event_log_visualizer/plot_base.cc",
"event_log_visualizer/plot_base.h",
"event_log_visualizer/plot_protobuf.cc",
"event_log_visualizer/plot_protobuf.h",
"event_log_visualizer/plot_python.cc",
"event_log_visualizer/plot_python.h",
"event_log_visualizer/triage_notifications.h",
]
defines = [ "ENABLE_RTC_EVENT_LOG" ]
deps = [
":chart_proto",
"../:webrtc_common",
# TODO(kwiberg): Remove this dependency.
"../api/audio_codecs:audio_codecs_api",
"../api/transport:field_trial_based_config",
"../api/transport:goog_cc",
"../api/transport:network_control",
"../call:call_interfaces",
"../call:video_stream_api",
"../logging:rtc_event_log_api",
"../logging:rtc_event_log_impl_base",
"../logging:rtc_event_log_parser",
"../logging:rtc_stream_config",
"../modules/audio_coding:ana_debug_dump_proto",
"../modules/audio_coding:audio_network_adaptor",
"../modules/audio_coding:neteq_tools",
"../modules/congestion_controller",
"../modules/congestion_controller/goog_cc:delay_based_bwe",
"../modules/congestion_controller/goog_cc:estimators",
"../modules/congestion_controller/rtp:transport_feedback",
"../modules/pacing",
"../modules/remote_bitrate_estimator",
"../modules/rtp_rtcp",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../rtc_base:checks",
"../rtc_base:rtc_base_approved",
"../rtc_base:rtc_numerics",
"../rtc_base:stringutils",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings",
]
}
}
}
if (rtc_include_tests) {
if (rtc_enable_protobuf && !build_with_chromium) {
rtc_executable("event_log_visualizer") {
testonly = true
sources = [
"event_log_visualizer/main.cc",
]
defines = [ "ENABLE_RTC_EVENT_LOG" ]
deps = [
":event_log_visualizer_utils",
"../logging:rtc_event_log_api",
"../logging:rtc_event_log_parser",
"../modules/audio_coding:neteq",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../rtc_base:checks",
"../rtc_base:protobuf_utils",
"../rtc_base:rtc_base_approved",
"../system_wrappers:field_trial",
"../test:field_trial",
"../test:fileutils",
"../test:test_support",
]
}
}
rtc_executable("activity_metric") {
testonly = true
sources = [
"agc/activity_metric.cc",
]
deps = [
"../api/audio:audio_frame_api",
"../modules/audio_processing/agc:level_estimation",
"../modules/audio_processing/vad",
"../rtc_base:rtc_base_approved",
"../rtc_base:safe_minmax",
"../test:test_support",
"//testing/gtest",
]
}
tools_unittests_resources = [
"../resources/foreman_128x96.yuv",
"../resources/foreman_cif.yuv",
"../resources/reference_less_video_test_file.y4m",
]
if (is_ios) {
bundle_data("tools_unittests_bundle_data") {
testonly = true
sources = tools_unittests_resources
outputs = [
"{{bundle_resources_dir}}/{{source_file_part}}",
]
}
}
rtc_test("tools_unittests") {
testonly = true
sources = [
"frame_analyzer/linear_least_squares_unittest.cc",
"frame_analyzer/reference_less_video_analysis_unittest.cc",
"frame_analyzer/video_color_aligner_unittest.cc",
"frame_analyzer/video_geometry_aligner_unittest.cc",
"frame_analyzer/video_quality_analysis_unittest.cc",
"frame_analyzer/video_temporal_aligner_unittest.cc",
"frame_editing/frame_editing_unittest.cc",
"sanitizers_unittest.cc",
"simple_command_line_parser_unittest.cc",
"video_file_reader_unittest.cc",
"video_file_writer_unittest.cc",
]
deps = [
":command_line_parser",
":video_file_reader",
":video_file_writer",
":video_quality_analysis",
"../:webrtc_common",
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../common_video:common_video",
"../rtc_base",
"../rtc_base:checks",
"../test:fileutils",
"../test:test_main",
"../test:test_support",
"//testing/gtest",
"//third_party/abseil-cpp/absl/memory",
"//third_party/libyuv",
]
if (!build_with_chromium) {
deps += [
":frame_editing_lib",
":reference_less_video_analysis_lib",
]
}
if (rtc_enable_protobuf) {
deps += [ "network_tester:network_tester_unittests" ]
}
data = tools_unittests_resources
if (is_android) {
deps += [ "//testing/android/native_test:native_test_support" ]
shard_timeout = 900
}
if (is_ios) {
deps += [ ":tools_unittests_bundle_data" ]
}
}
if (rtc_enable_protobuf) {
copy("rtp_analyzer") {
sources = [
"py_event_log_analyzer/misc.py",
"py_event_log_analyzer/pb_parse.py",
"py_event_log_analyzer/rtp_analyzer.py",
"py_event_log_analyzer/rtp_analyzer.sh",
]
outputs = [
"$root_build_dir/{{source_file_part}}",
]
deps = [
"../logging:rtc_event_log_proto",
]
} # rtp_analyzer
rtc_executable("unpack_aecdump") {
visibility = [ "*" ]
testonly = true
sources = [
"unpack_aecdump/unpack.cc",
]
deps = [
"..:webrtc_common",
"../common_audio",
"../modules/audio_processing",
"../modules/audio_processing:audioproc_debug_proto",
"../modules/audio_processing:audioproc_debug_proto",
"../modules/audio_processing:audioproc_protobuf_utils",
"../modules/audio_processing:audioproc_test_utils",
"../rtc_base:protobuf_utils",
"../rtc_base:rtc_base_approved",
]
} # unpack_aecdump
}
}