# 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.

import("../../../webrtc.gni")

config("bwe_test_logging") {
  if (rtc_enable_bwe_test_logging) {
    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=1" ]
  } else {
    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0" ]
  }
}

rtc_static_library("goog_cc") {
  configs += [ ":bwe_test_logging" ]
  sources = [
    "goog_cc_network_control.cc",
    "goog_cc_network_control.h",
  ]

  deps = [
    ":alr_detector",
    ":delay_based_bwe",
    ":estimators",
    ":probe_controller",
    ":pushback_controller",
    "../..:module_api",
    "../../..:webrtc_common",
    "../../../api/transport:network_control",
    "../../../logging:rtc_event_log_api",
    "../../../logging:rtc_event_pacing",
    "../../../rtc_base:checks",
    "../../../rtc_base:rtc_base_approved",
    "../../../rtc_base/experiments:alr_experiment",
    "../../../rtc_base/experiments:field_trial_parser",
    "../../../system_wrappers",
    "../../../system_wrappers:field_trial",
    "../../bitrate_controller",
    "../../remote_bitrate_estimator",
    "../../rtp_rtcp:rtp_rtcp_format",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_source_set("pushback_controller") {
  sources = [
    "congestion_window_pushback_controller.cc",
    "congestion_window_pushback_controller.h",
  ]
  deps = [
    "../../../api/transport:network_control",
    "../../../rtc_base:checks",
    "../../../rtc_base:rtc_base_approved",
    "../../../system_wrappers:field_trial",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_source_set("alr_detector") {
  sources = [
    "alr_detector.cc",
    "alr_detector.h",
  ]
  deps = [
    "../../..:webrtc_common",
    "../../../logging:rtc_event_log_api",
    "../../../logging:rtc_event_pacing",
    "../../../rtc_base:checks",
    "../../../rtc_base:rtc_base_approved",
    "../../../rtc_base/experiments:alr_experiment",
    "../../../system_wrappers:field_trial",
    "../../pacing:interval_budget",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}
rtc_source_set("estimators") {
  configs += [ ":bwe_test_logging" ]
  sources = [
    "acknowledged_bitrate_estimator.cc",
    "acknowledged_bitrate_estimator.h",
    "bitrate_estimator.cc",
    "bitrate_estimator.h",
    "delay_increase_detector_interface.h",
    "median_slope_estimator.cc",
    "median_slope_estimator.h",
    "probe_bitrate_estimator.cc",
    "probe_bitrate_estimator.h",
    "trendline_estimator.cc",
    "trendline_estimator.h",
  ]

  deps = [
    "../../../logging:rtc_event_bwe",
    "../../../logging:rtc_event_log_api",
    "../../../rtc_base:checks",
    "../../../rtc_base:rtc_base_approved",
    "../../../rtc_base:rtc_numerics",
    "../../../rtc_base:safe_minmax",
    "../../../system_wrappers:field_trial",
    "../../remote_bitrate_estimator",
    "../../rtp_rtcp:rtp_rtcp_format",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_source_set("delay_based_bwe") {
  configs += [ ":bwe_test_logging" ]
  sources = [
    "delay_based_bwe.cc",
    "delay_based_bwe.h",
  ]

  deps = [
    ":estimators",
    "../../../api/transport:network_control",
    "../../../logging:rtc_event_bwe",
    "../../../logging:rtc_event_log_api",
    "../../../rtc_base:checks",
    "../../../rtc_base:rtc_base_approved",
    "../../../system_wrappers:field_trial",
    "../../../system_wrappers:metrics",
    "../../pacing",
    "../../remote_bitrate_estimator",
    "../../rtp_rtcp:rtp_rtcp_format",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_source_set("probe_controller") {
  sources = [
    "probe_controller.cc",
    "probe_controller.h",
  ]

  deps = [
    "../../../api/transport:network_control",
    "../../../logging:rtc_event_log_api",
    "../../../logging:rtc_event_pacing",
    "../../../rtc_base:checks",
    "../../../rtc_base:rtc_base_approved",
    "../../../rtc_base/system:unused",
    "../../../system_wrappers:field_trial",
    "../../../system_wrappers:metrics",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

if (rtc_include_tests) {
  rtc_source_set("test_goog_cc_printer") {
    testonly = true
    sources = [
      "test/goog_cc_printer.cc",
      "test/goog_cc_printer.h",
    ]
    deps = [
      ":estimators",
      ":goog_cc",
      "..:test_controller_printer",
      "../../../api/transport:goog_cc",
    ]
  }
  rtc_source_set("goog_cc_unittests") {
    testonly = true

    sources = [
      "acknowledged_bitrate_estimator_unittest.cc",
      "alr_detector_unittest.cc",
      "congestion_window_pushback_controller_unittest.cc",
      "delay_based_bwe_unittest.cc",
      "delay_based_bwe_unittest_helper.cc",
      "delay_based_bwe_unittest_helper.h",
      "goog_cc_network_control_unittest.cc",
      "median_slope_estimator_unittest.cc",
      "probe_bitrate_estimator_unittest.cc",
      "probe_controller_unittest.cc",
      "trendline_estimator_unittest.cc",
    ]
    if (!build_with_chromium && is_clang) {
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    deps = [
      ":alr_detector",
      ":delay_based_bwe",
      ":estimators",
      ":goog_cc",
      ":probe_controller",
      ":pushback_controller",
      "../../../api/transport:goog_cc",
      "../../../api/transport:network_control",
      "../../../api/transport:network_control_test",
      "../../../logging:mocks",
      "../../../rtc_base:checks",
      "../../../rtc_base:rtc_base_approved",
      "../../../rtc_base:rtc_base_tests_utils",
      "../../../rtc_base/experiments:alr_experiment",
      "../../../system_wrappers",
      "../../../system_wrappers:field_trial",
      "../../../test:field_trial",
      "../../../test:test_support",
      "../../../test/scenario",
      "../../pacing",
      "../../remote_bitrate_estimator",
      "../../rtp_rtcp:rtp_rtcp_format",
      "//testing/gmock",
      "//third_party/abseil-cpp/absl/memory",
    ]
  }
  rtc_source_set("goog_cc_slow_tests") {
    testonly = true

    sources = [
      "goog_cc_network_control_slowtest.cc",
    ]
    if (!build_with_chromium && is_clang) {
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    deps = [
      ":alr_detector",
      ":delay_based_bwe",
      ":estimators",
      ":goog_cc",
      ":probe_controller",
      ":pushback_controller",
      "../../../api/transport:goog_cc",
      "../../../api/transport:network_control",
      "../../../api/transport:network_control_test",
      "../../../logging:mocks",
      "../../../rtc_base:checks",
      "../../../rtc_base:rtc_base_approved",
      "../../../rtc_base:rtc_base_tests_utils",
      "../../../rtc_base/experiments:alr_experiment",
      "../../../system_wrappers",
      "../../../system_wrappers:field_trial",
      "../../../test:field_trial",
      "../../../test:test_support",
      "../../../test/scenario",
      "../../pacing",
      "../../remote_bitrate_estimator",
      "../../rtp_rtcp:rtp_rtcp_format",
      "//testing/gmock",
      "//third_party/abseil-cpp/absl/memory",
    ]
  }
}
