# Copyright (c) 2017 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 (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

rtc_static_library("ortc") {
  defines = []
  sources = [
    "ortcfactory.cc",
    "ortcfactory.h",
    "ortcrtpreceiveradapter.cc",
    "ortcrtpreceiveradapter.h",
    "ortcrtpsenderadapter.cc",
    "ortcrtpsenderadapter.h",
    "rtpparametersconversion.cc",
    "rtpparametersconversion.h",
    "rtptransportadapter.cc",
    "rtptransportadapter.h",
    "rtptransportcontrolleradapter.cc",
    "rtptransportcontrolleradapter.h",
  ]

  # TODO(deadbeef): Create a separate target for the common things ORTC and
  # PeerConnection code shares, so that ortc can depend on that instead of
  # libjingle_peerconnection.
  deps = [
    "../api:optional",
    "../api:ortc_api",
    "../call:call_interfaces",
    "../call:rtp_sender",
    "../logging:rtc_event_log_api",
    "../media:rtc_media",
    "../media:rtc_media_base",
    "../modules/audio_processing:audio_processing",
    "../p2p:rtc_p2p",
    "../pc:libjingle_peerconnection",
    "../pc:rtc_pc",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
  ]

  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" ]
  }
}

if (rtc_include_tests) {
  rtc_test("ortc_unittests") {
    testonly = true

    sources = [
      "ortcfactory_integrationtest.cc",
      "ortcfactory_unittest.cc",
      "ortcrtpreceiver_unittest.cc",
      "ortcrtpsender_unittest.cc",
      "rtpparametersconversion_unittest.cc",
      "rtptransport_unittest.cc",
      "rtptransportcontroller_unittest.cc",
      "srtptransport_unittest.cc",
      "testrtpparameters.cc",
      "testrtpparameters.h",
    ]

    deps = [
      ":ortc",
      "../api:libjingle_peerconnection_api",
      "../api:ortc_api",
      "../api/audio_codecs:builtin_audio_decoder_factory",
      "../api/audio_codecs:builtin_audio_encoder_factory",
      "../media:rtc_media_tests_utils",
      "../p2p:p2p_test_utils",
      "../p2p:rtc_p2p",
      "../pc:pc_test_utils",
      "../rtc_base:rtc_base",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_main",
      "../rtc_base:rtc_base_tests_utils",
      "../system_wrappers:metrics_default",
    ]

    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" ]
    }

    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]
    }
  }
}
