# Copyright (c) 2016 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 (!build_with_mozilla) {
  import("//third_party/protobuf/proto_library.gni")
}
if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

group("logging") {
  deps = [
    ":rtc_event_audio",
    ":rtc_event_bwe",
    ":rtc_event_log_impl_base",
    ":rtc_event_log_impl_encoder",
    ":rtc_event_log_impl_output",
    ":rtc_event_pacing",
    ":rtc_event_rtp_rtcp",
    ":rtc_event_video",
  ]
}

rtc_source_set("rtc_event_log_api") {
  sources = [
    "rtc_event_log/encoder/rtc_event_log_encoder.h",
    "rtc_event_log/events/rtc_event.h",
    "rtc_event_log/rtc_event_log.cc",
    "rtc_event_log/rtc_event_log.h",
    "rtc_event_log/rtc_event_log_factory_interface.h",
  ]

  deps = [
    "../api:libjingle_logging_api",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:rtc_task_queue",
  ]
}

rtc_source_set("rtc_stream_config") {
  sources = [
    "rtc_event_log/rtc_stream_config.cc",
    "rtc_event_log/rtc_stream_config.h",
  ]

  deps = [
    ":rtc_event_log_api",
    "..:webrtc_common",
    "../api:libjingle_peerconnection_api",
  ]
}

rtc_source_set("rtc_event_pacing") {
  sources = [
    "rtc_event_log/events/rtc_event_alr_state.cc",
    "rtc_event_log/events/rtc_event_alr_state.h",
  ]

  deps = [
    ":rtc_event_log_api",
    "../:typedefs",
  ]
}

rtc_source_set("rtc_event_audio") {
  sources = [
    "rtc_event_log/events/rtc_event_audio_network_adaptation.cc",
    "rtc_event_log/events/rtc_event_audio_network_adaptation.h",
    "rtc_event_log/events/rtc_event_audio_playout.cc",
    "rtc_event_log/events/rtc_event_audio_playout.h",
    "rtc_event_log/events/rtc_event_audio_receive_stream_config.cc",
    "rtc_event_log/events/rtc_event_audio_receive_stream_config.h",
    "rtc_event_log/events/rtc_event_audio_send_stream_config.cc",
    "rtc_event_log/events/rtc_event_audio_send_stream_config.h",
  ]

  deps = [
    ":rtc_event_log_api",
    ":rtc_stream_config",
    "../modules/audio_coding:audio_network_adaptor_config",
  ]
}

rtc_source_set("rtc_event_bwe") {
  sources = [
    "rtc_event_log/events/rtc_event_bwe_update_delay_based.cc",
    "rtc_event_log/events/rtc_event_bwe_update_delay_based.h",
    "rtc_event_log/events/rtc_event_bwe_update_loss_based.cc",
    "rtc_event_log/events/rtc_event_bwe_update_loss_based.h",
    "rtc_event_log/events/rtc_event_probe_cluster_created.cc",
    "rtc_event_log/events/rtc_event_probe_cluster_created.h",
    "rtc_event_log/events/rtc_event_probe_result_failure.cc",
    "rtc_event_log/events/rtc_event_probe_result_failure.h",
    "rtc_event_log/events/rtc_event_probe_result_success.cc",
    "rtc_event_log/events/rtc_event_probe_result_success.h",
  ]

  deps = [
    ":rtc_event_log_api",
    "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
  ]
}

rtc_source_set("rtc_event_rtp_rtcp") {
  sources = [
    "rtc_event_log/events/rtc_event_rtcp_packet_incoming.cc",
    "rtc_event_log/events/rtc_event_rtcp_packet_incoming.h",
    "rtc_event_log/events/rtc_event_rtcp_packet_outgoing.cc",
    "rtc_event_log/events/rtc_event_rtcp_packet_outgoing.h",
    "rtc_event_log/events/rtc_event_rtp_packet_incoming.cc",
    "rtc_event_log/events/rtc_event_rtp_packet_incoming.h",
    "rtc_event_log/events/rtc_event_rtp_packet_outgoing.cc",
    "rtc_event_log/events/rtc_event_rtp_packet_outgoing.h",
  ]

  deps = [
    ":rtc_event_log_api",
    "../api:array_view",
    "../modules/rtp_rtcp:rtp_rtcp_format",
    "../rtc_base:rtc_base_approved",
  ]
}

rtc_source_set("rtc_event_video") {
  sources = [
    "rtc_event_log/events/rtc_event_video_receive_stream_config.cc",
    "rtc_event_log/events/rtc_event_video_receive_stream_config.h",
    "rtc_event_log/events/rtc_event_video_send_stream_config.cc",
    "rtc_event_log/events/rtc_event_video_send_stream_config.h",
  ]

  deps = [
    ":rtc_event_log_api",
    ":rtc_stream_config",
  ]
}

rtc_static_library("rtc_event_log_impl_encoder") {
  visibility = [ "*" ]
  sources = [
    "rtc_event_log/encoder/rtc_event_log_encoder_legacy.cc",
    "rtc_event_log/encoder/rtc_event_log_encoder_legacy.h",
  ]

  defines = []

  deps = [
    ":ice_log",
    ":rtc_event_audio",
    ":rtc_event_bwe",
    ":rtc_event_log_api",
    ":rtc_event_log_impl_output",
    ":rtc_event_pacing",
    ":rtc_event_rtp_rtcp",
    ":rtc_event_video",
    ":rtc_stream_config",
    "../modules/audio_coding:audio_network_adaptor",
    "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
    "../modules/rtp_rtcp:rtp_rtcp_format",
    "../rtc_base:checks",
    "../rtc_base:rtc_base_approved",
  ]

  if (rtc_enable_protobuf) {
    defines += [ "ENABLE_RTC_EVENT_LOG" ]
    deps += [ ":rtc_event_log_proto" ]
  }

  # TODO(eladalon): Remove this.
  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_event_log_impl_output") {
  sources = [
    "rtc_event_log/output/rtc_event_log_output_file.cc",
    "rtc_event_log/output/rtc_event_log_output_file.h",
  ]

  deps = [
    ":rtc_event_log_api",
    "../api:libjingle_logging_api",
    "../rtc_base:checks",
    "../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" ]
  }
}

rtc_static_library("rtc_event_log_impl_base") {
  visibility = [ "*" ]
  sources = [
    "rtc_event_log/rtc_event_log_factory.cc",
    "rtc_event_log/rtc_event_log_factory.h",
    "rtc_event_log/rtc_event_log_impl.cc",
  ]

  defines = []

  deps = [
    ":ice_log",
    ":rtc_event_log_api",
    ":rtc_event_log_impl_encoder",
    ":rtc_event_log_impl_output",
    "../rtc_base:checks",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:rtc_task_queue",
    "../rtc_base:safe_minmax",
    "../rtc_base:sequenced_task_checker",
  ]

  if (rtc_enable_protobuf) {
    defines += [ "ENABLE_RTC_EVENT_LOG" ]
    deps += [ ":rtc_event_log_proto" ]
  }

  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_enable_protobuf) {
  proto_library("rtc_event_log_proto") {
    sources = [
      "rtc_event_log/rtc_event_log.proto",
    ]
    proto_out_dir = "logging/rtc_event_log"
  }

  proto_library("rtc_event_log2_proto") {
    sources = [
      "rtc_event_log/rtc_event_log2.proto",
    ]
    proto_out_dir = "logging/rtc_event_log"
  }

  rtc_static_library("rtc_event_log_parser") {
    visibility = [ "*" ]
    sources = [
      "rtc_event_log/rtc_event_log_parser.cc",
      "rtc_event_log/rtc_event_log_parser.h",
      "rtc_event_log/rtc_event_log_parser_new.cc",
      "rtc_event_log/rtc_event_log_parser_new.h",
    ]

    deps = [
      ":ice_log",
      ":rtc_event_bwe",
      ":rtc_event_log2_proto",
      ":rtc_event_log_api",
      ":rtc_event_log_proto",
      ":rtc_stream_config",
      "..:webrtc_common",
      "../api:libjingle_peerconnection_api",
      "../call:video_stream_api",
      "../modules/audio_coding:audio_network_adaptor",
      "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
      "../modules/rtp_rtcp",
      "../modules/rtp_rtcp:rtp_rtcp_format",
      "../rtc_base:checks",
      "../rtc_base:protobuf_utils",
      "../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_source_set("rtc_event_log_tests") {
      testonly = true
      assert(rtc_enable_protobuf)
      defines = [ "ENABLE_RTC_EVENT_LOG" ]
      if (rtc_use_memcheck) {
        defines += [ "WEBRTC_USE_MEMCHECK" ]
      }
      sources = [
        "rtc_event_log/encoder/rtc_event_log_encoder_unittest.cc",
        "rtc_event_log/output/rtc_event_log_output_file_unittest.cc",
        "rtc_event_log/rtc_event_log_unittest.cc",
        "rtc_event_log/rtc_event_log_unittest_helper.cc",
        "rtc_event_log/rtc_event_log_unittest_helper.h",
      ]
      deps = [
        ":rtc_event_audio",
        ":rtc_event_bwe",
        ":rtc_event_log_api",
        ":rtc_event_log_impl_base",
        ":rtc_event_log_impl_encoder",
        ":rtc_event_log_impl_output",
        ":rtc_event_log_parser",
        ":rtc_event_log_proto",
        ":rtc_event_rtp_rtcp",
        ":rtc_event_video",
        ":rtc_stream_config",
        "../api:libjingle_peerconnection_api",
        "../call",
        "../call:call_interfaces",
        "../modules/audio_coding:audio_network_adaptor",
        "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
        "../modules/rtp_rtcp:rtp_rtcp_format",
        "../rtc_base:checks",
        "../rtc_base:rtc_base_approved",
        "../rtc_base:rtc_base_tests_utils",
        "../test:fileutils",
        "../test:test_support",
        "//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_test("rtc_event_log2rtp_dump") {
      testonly = true
      sources = [
        "rtc_event_log/rtc_event_log2rtp_dump.cc",
      ]
      deps = [
        ":rtc_event_log_api",
        ":rtc_event_log_parser",
        "../modules/rtp_rtcp",
        "../modules/rtp_rtcp:rtp_rtcp_format",
        "../rtc_base:checks",
        "../rtc_base:protobuf_utils",
        "../rtc_base:rtc_base_approved",
        "../system_wrappers:field_trial_default",
        "../system_wrappers:metrics_default",
        "../test:rtp_test_utils",
      ]
      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_executable("rtc_event_log2text") {
      testonly = true
      sources = [
        "rtc_event_log/rtc_event_log2text.cc",
      ]
      deps = [
        ":rtc_event_log_api",
        ":rtc_event_log_parser",
        "../:webrtc_common",
        "../call:video_stream_api",
        "../modules/rtp_rtcp:rtp_rtcp_format",
        "../rtc_base:checks",
        "../rtc_base:protobuf_utils",
        "../rtc_base:rtc_base_approved",
        "../rtc_base:stringutils",

        # TODO(kwiberg): Remove this dependency.
        "../api/audio_codecs:audio_codecs_api",
        "../modules/audio_coding:audio_network_adaptor_config",
        "../modules/rtp_rtcp",
      ]
      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_executable("rtc_event_log2stats") {
      testonly = true
      sources = [
        "rtc_event_log/rtc_event_log2stats.cc",
      ]
      deps = [
        ":rtc_event_log_api",
        ":rtc_event_log_proto",
        "../rtc_base:checks",
        "../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" ]
      }
    }
  }
}

rtc_source_set("ice_log") {
  sources = [
    "rtc_event_log/events/rtc_event_ice_candidate_pair.cc",
    "rtc_event_log/events/rtc_event_ice_candidate_pair.h",
    "rtc_event_log/events/rtc_event_ice_candidate_pair_config.cc",
    "rtc_event_log/events/rtc_event_ice_candidate_pair_config.h",
    "rtc_event_log/icelogger.cc",
    "rtc_event_log/icelogger.h",
  ]

  deps = [
    ":rtc_event_log_api",
    "../api:libjingle_logging_api",
    "../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_source_set("mocks") {
    testonly = true
    sources = [
      "rtc_event_log/mock/mock_rtc_event_log.cc",
      "rtc_event_log/mock/mock_rtc_event_log.h",
    ]
    deps = [
      ":rtc_event_log_api",
      "../../test:test_support",
    ]
  }
}
