# 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")

rtc_library("pacing") {
  # Client code SHOULD NOT USE THIS TARGET, but for now it needs to be public
  # because there exists client code that uses it.
  # TODO(bugs.webrtc.org/9808): Move to private visibility as soon as that
  # client code gets updated.
  visibility = [ "*" ]
  sources = [
    "bitrate_prober.cc",
    "bitrate_prober.h",
    "pacing_controller.cc",
    "pacing_controller.h",
    "packet_router.cc",
    "packet_router.h",
    "prioritized_packet_queue.cc",
    "prioritized_packet_queue.h",
    "round_robin_packet_queue.cc",
    "round_robin_packet_queue.h",
    "rtp_packet_pacer.h",
    "task_queue_paced_sender.cc",
    "task_queue_paced_sender.h",
  ]

  deps = [
    ":interval_budget",
    "../../api:field_trials_view",
    "../../api:field_trials_view",
    "../../api:function_view",
    "../../api:sequence_checker",
    "../../api/rtc_event_log",
    "../../api/task_queue:task_queue",
    "../../api/transport:field_trial_based_config",
    "../../api/transport:network_control",
    "../../api/units:data_rate",
    "../../api/units:data_size",
    "../../api/units:time_delta",
    "../../api/units:timestamp",
    "../../logging:rtc_event_bwe",
    "../../logging:rtc_event_pacing",
    "../../rtc_base:checks",
    "../../rtc_base:event_tracer",
    "../../rtc_base:location",
    "../../rtc_base:logging",
    "../../rtc_base:macromagic",
    "../../rtc_base:rtc_numerics",
    "../../rtc_base:rtc_task_queue",
    "../../rtc_base:timeutils",
    "../../rtc_base/experiments:field_trial_parser",
    "../../rtc_base/synchronization:mutex",
    "../../rtc_base/system:unused",
    "../../system_wrappers",
    "../../system_wrappers:metrics",
    "../rtp_rtcp",
    "../rtp_rtcp:rtp_rtcp_format",
  ]
  absl_deps = [
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_library("interval_budget") {
  sources = [
    "interval_budget.cc",
    "interval_budget.h",
  ]

  deps = [
    "../../rtc_base:checks",
    "../../rtc_base:safe_conversions",
  ]
}

if (rtc_include_tests) {
  rtc_library("pacing_unittests") {
    testonly = true

    sources = [
      "bitrate_prober_unittest.cc",
      "interval_budget_unittest.cc",
      "pacing_controller_unittest.cc",
      "packet_router_unittest.cc",
      "prioritized_packet_queue_unittest.cc",
      "round_robin_packet_queue_unittest.cc",
      "task_queue_paced_sender_unittest.cc",
    ]
    deps = [
      ":interval_budget",
      ":pacing",
      "../../api/task_queue:task_queue",
      "../../api/transport:network_control",
      "../../api/units:data_rate",
      "../../api/units:time_delta",
      "../../api/units:timestamp",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_tests_utils",
      "../../rtc_base/experiments:alr_experiment",
      "../../system_wrappers",
      "../../test:explicit_key_value_config",
      "../../test:scoped_key_value_config",
      "../../test:test_support",
      "../../test/time_controller:time_controller",
      "../rtp_rtcp",
      "../rtp_rtcp:mock_rtp_rtcp",
      "../rtp_rtcp:rtp_rtcp_format",
    ]
    absl_deps = [ "//third_party/abseil-cpp/absl/functional:any_invocable" ]
  }
}
