# Copyright (c) 2015 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_source_set("call_interfaces") {
  sources = [
    "audio_receive_stream.h",
    "audio_send_stream.cc",
    "audio_send_stream.h",
    "audio_state.h",
    "call.h",
    "callfactoryinterface.h",
    "flexfec_receive_stream.h",
    "syncable.cc",
    "syncable.h",
  ]
  deps = [
    ":rtp_interfaces",
    ":video_stream_api",
    "..:webrtc_common",
    "../api:audio_mixer_api",
    "../api:libjingle_peerconnection_api",
    "../api:optional",
    "../api:transport_api",
    "../api/audio_codecs:audio_codecs_api",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
  ]
}

# TODO(nisse): These RTP targets should be moved elsewhere
# when interfaces have stabilized. See also TODO for |mock_rtp_interfaces|.
rtc_source_set("rtp_interfaces") {
  sources = [
    "rtcp_packet_sink_interface.h",
    "rtp_config.cc",
    "rtp_config.h",
    "rtp_packet_sink_interface.h",
    "rtp_stream_receiver_controller_interface.h",
    "rtp_transport_controller_send_interface.h",
  ]
  deps = [
    "../api:array_view",
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_source_set("rtp_receiver") {
  sources = [
    "rtcp_demuxer.cc",
    "rtcp_demuxer.h",
    "rtp_demuxer.cc",
    "rtp_demuxer.h",
    "rtp_rtcp_demuxer_helper.cc",
    "rtp_rtcp_demuxer_helper.h",
    "rtp_stream_receiver_controller.cc",
    "rtp_stream_receiver_controller.h",
    "rtx_receive_stream.cc",
    "rtx_receive_stream.h",
    "ssrc_binding_observer.h",
  ]
  deps = [
    ":rtp_interfaces",
    "..:webrtc_common",
    "../api:array_view",
    "../api:optional",
    "../modules/rtp_rtcp",
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_source_set("rtp_sender") {
  sources = [
    "rtp_transport_controller_send.cc",
    "rtp_transport_controller_send.h",
  ]
  deps = [
    ":rtp_interfaces",
    "..:webrtc_common",
    "../modules/congestion_controller",
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_static_library("call") {
  sources = [
    "bitrate_allocator.cc",
    "call.cc",
    "callfactory.cc",
    "callfactory.h",
    "flexfec_receive_stream_impl.cc",
    "flexfec_receive_stream_impl.h",
  ]

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  public_deps = [
    ":call_interfaces",
    "../api:call_api",
    "../api:libjingle_peerconnection_api",
  ]

  deps = [
    ":call_interfaces",
    ":rtp_interfaces",
    ":rtp_receiver",
    ":rtp_sender",
    ":video_stream_api",
    "..:webrtc_common",
    "../api:optional",
    "../api:transport_api",
    "../audio",
    "../logging:rtc_event_log_api",
    "../logging:rtc_event_log_impl",
    "../modules/bitrate_controller",
    "../modules/congestion_controller",
    "../modules/pacing",
    "../modules/rtp_rtcp",
    "../modules/utility",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:rtc_task_queue",
    "../rtc_base:sequenced_task_checker",
    "../system_wrappers",
    "../video",
  ]
}

rtc_source_set("video_stream_api") {
  sources = [
    "video_config.cc",
    "video_config.h",
    "video_receive_stream.cc",
    "video_receive_stream.h",
    "video_send_stream.cc",
    "video_send_stream.h",
  ]
  deps = [
    ":rtp_interfaces",
    "../:webrtc_common",
    "../api:libjingle_peerconnection_api",
    "../api:optional",
    "../api:transport_api",
    "../common_video:common_video",
    "../rtc_base:rtc_base_approved",
  ]
}

if (rtc_include_tests) {
  rtc_source_set("call_tests") {
    testonly = true

    # Skip restricting visibility on mobile platforms since the tests on those
    # gets additional generated targets which would require many lines here to
    # cover (which would be confusing to read and hard to maintain).
    if (!is_android && !is_ios) {
      visibility = [ "..:video_engine_tests" ]
    }
    sources = [
      "bitrate_allocator_unittest.cc",
      "bitrate_estimator_tests.cc",
      "call_unittest.cc",
      "flexfec_receive_stream_unittest.cc",
      "rtcp_demuxer_unittest.cc",
      "rtp_demuxer_unittest.cc",
      "rtp_rtcp_demuxer_helper_unittest.cc",
      "rtx_receive_stream_unittest.cc",
    ]
    deps = [
      ":call",
      ":mock_rtp_interfaces",
      ":rtp_interfaces",
      ":rtp_receiver",
      ":rtp_sender",
      "..:webrtc_common",
      "../api:array_view",
      "../api:mock_audio_mixer",
      "../logging:rtc_event_log_api",
      "../modules/audio_device:mock_audio_device",
      "../modules/audio_mixer",
      "../modules/bitrate_controller",
      "../modules/congestion_controller:mock_congestion_controller",
      "../modules/pacing",
      "../modules/pacing:mock_paced_sender",
      "../modules/rtp_rtcp",
      "../modules/rtp_rtcp:mock_rtp_rtcp",
      "../modules/utility:mock_process_thread",
      "../rtc_base:rtc_base_approved",
      "../system_wrappers",
      "../test:audio_codec_mocks",
      "../test:direct_transport",
      "../test:test_common",
      "../test:test_support",
      "../test:video_test_common",
      "//testing/gmock",
      "//testing/gtest",
    ]
    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  rtc_source_set("call_perf_tests") {
    testonly = true

    # Skip restricting visibility on mobile platforms since the tests on those
    # gets additional generated targets which would require many lines here to
    # cover (which would be confusing to read and hard to maintain).
    if (!is_android && !is_ios) {
      visibility = [ "..:webrtc_perf_tests" ]
    }
    sources = [
      "call_perf_tests.cc",
      "rampup_tests.cc",
      "rampup_tests.h",
    ]
    deps = [
      ":call_interfaces",
      ":video_stream_api",
      "..:webrtc_common",
      "../api/audio_codecs:builtin_audio_encoder_factory",
      "../logging:rtc_event_log_api",
      "../modules/audio_coding",
      "../modules/audio_mixer:audio_mixer_impl",
      "../modules/rtp_rtcp",
      "../rtc_base:rtc_base_approved",
      "../system_wrappers",
      "../system_wrappers:metrics_default",
      "../test:direct_transport",
      "../test:fake_audio_device",
      "../test:field_trial",
      "../test:test_common",
      "../test:test_support",
      "../test:video_test_common",
      "../video",
      "../voice_engine",
      "//testing/gtest",
    ]
    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  # TODO(eladalon): This should be moved, as with the TODO for |rtp_interfaces|.
  rtc_source_set("mock_rtp_interfaces") {
    testonly = true

    sources = [
      "test/mock_rtp_packet_sink_interface.h",
    ]
    deps = [
      ":rtp_interfaces",
      "../test:test_support",
      "//testing/gmock",
    ]
  }
}
