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

group("api") {
  visibility = [ "*" ]
  deps = []

  if (!build_with_mozilla) {
    deps += [ ":libjingle_peerconnection_api" ]
  }
}

rtc_source_set("call_api") {
  visibility = [ "*" ]
  sources = [
    "call/audio_sink.h",
  ]

  deps = [
    # TODO(kjellander): Add remaining dependencies when webrtc:4243 is done.
    ":transport_api",
    "..:webrtc_common",
    "../rtc_base:rtc_base_approved",
    "audio:audio_mixer_api",
    "audio_codecs:audio_codecs_api",
  ]
}

rtc_source_set("callfactory_api") {
  visibility = [ "*" ]
  sources = [
    "call/callfactoryinterface.h",
  ]
}

rtc_static_library("libjingle_peerconnection_api") {
  visibility = [ "*" ]
  cflags = []
  sources = [
    "bitrate_constraints.h",
    "candidate.cc",
    "candidate.h",
    "cryptoparams.h",
    "datachannelinterface.h",
    "dtmfsenderinterface.h",
    "jsep.cc",
    "jsep.h",
    "jsepicecandidate.h",
    "jsepsessiondescription.h",
    "mediaconstraintsinterface.cc",
    "mediaconstraintsinterface.h",
    "mediastreaminterface.cc",
    "mediastreaminterface.h",
    "mediastreamproxy.h",
    "mediastreamtrackproxy.h",
    "mediatypes.cc",
    "mediatypes.h",
    "notifier.h",
    "peerconnectionfactoryproxy.h",
    "peerconnectioninterface.h",
    "peerconnectionproxy.h",
    "proxy.cc",
    "proxy.h",
    "rtcerror.cc",
    "rtcerror.h",
    "rtp_headers.cc",
    "rtp_headers.h",
    "rtpparameters.cc",
    "rtpparameters.h",
    "rtpreceiverinterface.cc",
    "rtpreceiverinterface.h",
    "rtpsenderinterface.h",
    "rtptransceiverinterface.h",
    "setremotedescriptionobserverinterface.h",
    "statstypes.cc",
    "statstypes.h",
    "turncustomizer.h",
    "umametrics.h",
    "videosourceproxy.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" ]
  }

  deps = [
    ":array_view",
    ":audio_options_api",
    ":callfactory_api",
    ":fec_controller_api",
    ":libjingle_logging_api",
    ":rtc_stats_api",
    "audio:audio_mixer_api",
    "audio_codecs:audio_codecs_api",
    "transport:bitrate_settings",
    "transport:network_control",
    "video:video_frame",
    "//third_party/abseil-cpp/absl/types:optional",

    # Basically, don't add stuff here. You might break sensitive downstream
    # targets like pnacl. API should not depend on anything outside of this
    # file, really. All these should arguably go away in time.
    "..:typedefs",
    "..:webrtc_common",
    "../logging:rtc_event_log_api",
    "../media:rtc_media_config",
    "../modules/audio_processing:audio_processing_statistics",
    "../rtc_base:checks",
    "../rtc_base:deprecation",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:stringutils",
  ]

  if (is_nacl) {
    # This is needed by .h files included from rtc_base.
    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
  }
}

rtc_source_set("video_quality_test_fixture_api") {
  visibility = [ "*" ]
  testonly = true
  sources = [
    "test/video_quality_test_fixture.h",
  ]
  deps = [
    ":libjingle_peerconnection_api",
    ":simulated_network_api",
    "../call:fake_network",
    "../call:rtp_interfaces",
    "../test:test_common",
    "../test:video_test_common",
    "video_codecs:video_codecs_api",
  ]
  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_source_set("create_video_quality_test_fixture_api") {
    visibility = [ "*" ]
    testonly = true
    sources = [
      "test/create_video_quality_test_fixture.cc",
      "test/create_video_quality_test_fixture.h",
    ]
    deps = [
      ":fec_controller_api",
      ":video_quality_test_fixture_api",
      "../rtc_base:ptr_util",
      "../video:video_quality_test",
      "//third_party/abseil-cpp/absl/memory",
    ]
    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("libjingle_logging_api") {
  visibility = [ "*" ]
  sources = [
    "rtceventlogoutput.h",
  ]
}

rtc_source_set("ortc_api") {
  visibility = [ "*" ]
  sources = [
    "ortc/mediadescription.cc",
    "ortc/mediadescription.h",
    "ortc/ortcfactoryinterface.h",
    "ortc/ortcrtpreceiverinterface.h",
    "ortc/ortcrtpsenderinterface.h",
    "ortc/packettransportinterface.h",
    "ortc/rtptransportcontrollerinterface.h",
    "ortc/rtptransportinterface.h",
    "ortc/sessiondescription.cc",
    "ortc/sessiondescription.h",
    "ortc/srtptransportinterface.h",
    "ortc/udptransportinterface.h",
  ]

  # For mediastreaminterface.h, etc.
  # TODO(deadbeef): Create a separate target for the common things ORTC and
  # PeerConnection code shares, so that ortc_api can depend on that instead of
  # libjingle_peerconnection_api.
  deps = [
    ":libjingle_peerconnection_api",
    "..:webrtc_common",
    "../rtc_base:rtc_base",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
  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("rtc_stats_api") {
  visibility = [ "*" ]
  cflags = []
  sources = [
    "stats/rtcstats.h",
    "stats/rtcstats_objects.h",
    "stats/rtcstatscollectorcallback.h",
    "stats/rtcstatsreport.h",
  ]

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

rtc_source_set("audio_options_api") {
  visibility = [ "*" ]
  sources = [
    "audio_options.cc",
    "audio_options.h",
  ]

  deps = [
    "../rtc_base:rtc_base_approved",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_source_set("transport_api") {
  visibility = [ "*" ]
  sources = [
    "call/transport.cc",
    "call/transport.h",
  ]
}

rtc_source_set("simulated_network_api") {
  visibility = [ "*" ]
  sources = [
    "test/simulated_network.h",
  ]
  deps = [
    "../rtc_base:criticalsection",
    "../rtc_base:rtc_base",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}

rtc_source_set("fec_controller_api") {
  visibility = [ "*" ]
  sources = [
    "fec_controller.h",
  ]

  deps = [
    "..:webrtc_common",
    "../modules:module_fec_api",
  ]
}

rtc_source_set("array_view") {
  visibility = [ "*" ]
  sources = [
    "array_view.h",
  ]
  deps = [
    "../rtc_base:checks",
    "../rtc_base:type_traits",
  ]
}

rtc_source_set("refcountedbase") {
  visibility = [ "*" ]
  sources = [
    "refcountedbase.h",
  ]
  deps = [
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_source_set("libjingle_peerconnection_test_api") {
  visibility = [ "*" ]
  testonly = true
  sources = [
    "test/fakeconstraints.h",
  ]

  deps = [
    ":libjingle_peerconnection_api",
    "../rtc_base:rtc_base_approved",
  ]
}

if (rtc_include_tests) {
  if (rtc_enable_protobuf) {
    rtc_source_set("audioproc_f_api") {
      visibility = [ "*" ]
      testonly = true
      sources = [
        "test/audioproc_float.cc",
        "test/audioproc_float.h",
      ]

      deps = [
        "../modules/audio_processing:audio_processing",
        "../modules/audio_processing:audioproc_f_impl",
      ]
    }
  }

  rtc_source_set("simulcast_test_fixture_api") {
    visibility = [ "*" ]
    testonly = true
    sources = [
      "test/simulcast_test_fixture.h",
    ]
  }

  rtc_source_set("create_simulcast_test_fixture_api") {
    visibility = [ "*" ]
    testonly = true
    sources = [
      "test/create_simulcast_test_fixture.cc",
      "test/create_simulcast_test_fixture.h",
    ]
    deps = [
      ":simulcast_test_fixture_api",
      "../modules/video_coding:simulcast_test_fixture_impl",
      "../rtc_base:rtc_base_approved",
      "video_codecs:video_codecs_api",
      "//third_party/abseil-cpp/absl/memory",
    ]
    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("videocodec_test_fixture_api") {
    visibility = [ "*" ]
    testonly = true
    sources = [
      "test/videocodec_test_fixture.h",
      "test/videocodec_test_stats.cc",
      "test/videocodec_test_stats.h",
    ]
    deps = [
      "..:webrtc_common",
      "../modules/video_coding:video_codec_interface",
      "video_codecs:video_codecs_api",
    ]
  }

  rtc_source_set("create_videocodec_test_fixture_api") {
    visibility = [ "*" ]
    testonly = true
    sources = [
      "test/create_videocodec_test_fixture.cc",
      "test/create_videocodec_test_fixture.h",
    ]
    deps = [
      ":videocodec_test_fixture_api",
      "../modules/video_coding:video_codecs_test_framework",
      "../modules/video_coding:videocodec_test_impl",
      "../rtc_base:rtc_base_approved",
      "video_codecs:video_codecs_api",
      "//third_party/abseil-cpp/absl/memory",
    ]
    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("mock_audio_mixer") {
    testonly = true
    sources = [
      "test/mock_audio_mixer.h",
    ]

    deps = [
      "../test:test_support",
      "audio:audio_mixer_api",
    ]
  }

  rtc_source_set("mock_peerconnectioninterface") {
    testonly = true
    sources = [
      "test/mock_peerconnectioninterface.h",
    ]

    deps = [
      ":libjingle_peerconnection_api",
      "../test:test_support",
    ]
  }

  rtc_source_set("mock_rtp") {
    testonly = true
    sources = [
      "test/mock_rtpreceiver.h",
      "test/mock_rtpsender.h",
    ]

    deps = [
      ":libjingle_peerconnection_api",
      "../test:test_support",
    ]
  }

  rtc_source_set("mock_video_codec_factory") {
    testonly = true
    sources = [
      "test/mock_video_decoder_factory.h",
      "test/mock_video_encoder_factory.h",
    ]

    deps = [
      "../api/video_codecs:video_codecs_api",
      "../test:test_support",
    ]
  }

  rtc_source_set("rtc_api_unittests") {
    testonly = true

    sources = [
      "array_view_unittest.cc",
      "ortc/mediadescription_unittest.cc",
      "ortc/sessiondescription_unittest.cc",
      "rtcerror_unittest.cc",
      "rtpparameters_unittest.cc",
    ]

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

    deps = [
      ":array_view",
      ":libjingle_peerconnection_api",
      ":libjingle_peerconnection_test_api",
      ":ortc_api",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../test:test_support",
      "units:units_unittests",
    ]
  }
}
