# 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("//third_party/protobuf/proto_library.gni")
import("../build/webrtc.gni")

group("tools") {
  deps = [
    ":command_line_parser",
  ]

  if (!build_with_chromium) {
    # TODO(kjellander): Enable these when webrtc:5970 is fixed.
    deps += [
      ":frame_analyzer",
      ":rgba_to_i420_converter",
    ]
  }
}

rtc_static_library("command_line_parser") {
  sources = [
    "simple_command_line_parser.cc",
    "simple_command_line_parser.h",
  ]
  deps = [
    "../base:gtest_prod",
  ]
}

rtc_static_library("video_quality_analysis") {
  sources = [
    "frame_analyzer/video_quality_analysis.cc",
    "frame_analyzer/video_quality_analysis.h",
  ]

  deps = [
    "../common_video",
  ]
  public_deps = [
    "../common_video",
  ]
}

rtc_executable("frame_analyzer") {
  sources = [
    "frame_analyzer/frame_analyzer.cc",
  ]

  deps = [
    ":command_line_parser",
    ":video_quality_analysis",
    "//build/win:default_exe_manifest",
  ]
}

rtc_executable("psnr_ssim_analyzer") {
  sources = [
    "psnr_ssim_analyzer/psnr_ssim_analyzer.cc",
  ]

  deps = [
    ":command_line_parser",
    ":video_quality_analysis",
    "//build/win:default_exe_manifest",
  ]
}

rtc_executable("rgba_to_i420_converter") {
  sources = [
    "converter/converter.cc",
    "converter/converter.h",
    "converter/rgba_to_i420_converter.cc",
  ]

  deps = [
    ":command_line_parser",
    "../common_video",
    "//build/win:default_exe_manifest",
  ]
}

rtc_static_library("frame_editing_lib") {
  sources = [
    "frame_editing/frame_editing_lib.cc",
    "frame_editing/frame_editing_lib.h",
  ]

  # TODO(jschuh): Bug 1348: fix this warning.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  if (is_clang) {
    # Suppress warnings from the Chromium Clang plugin.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  deps = [
    "../common_video",
  ]
}

rtc_executable("frame_editor") {
  sources = [
    "frame_editing/frame_editing.cc",
  ]

  deps = [
    ":command_line_parser",
    ":frame_editing_lib",
    "//build/win:default_exe_manifest",
  ]
}

# It doesn't make sense to build this tool without the ADM enabled.
if (rtc_include_internal_audio_device) {
  rtc_executable("force_mic_volume_max") {
    sources = [
      "force_mic_volume_max/force_mic_volume_max.cc",
    ]

    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

    deps = [
      "../modules/audio_device:audio_device",
      "../system_wrappers:system_wrappers_default",
      "//build/win:default_exe_manifest",
    ]
  }
}

if (rtc_enable_protobuf) {
  proto_library("chart_proto") {
    sources = [
      "event_log_visualizer/chart.proto",
    ]
    proto_out_dir = "webrtc/tools/event_log_visualizer"
  }

  rtc_static_library("event_log_visualizer_utils") {
    sources = [
      "event_log_visualizer/analyzer.cc",
      "event_log_visualizer/analyzer.h",
      "event_log_visualizer/plot_base.cc",
      "event_log_visualizer/plot_base.h",
      "event_log_visualizer/plot_protobuf.cc",
      "event_log_visualizer/plot_protobuf.h",
      "event_log_visualizer/plot_python.cc",
      "event_log_visualizer/plot_python.h",
    ]
    if (is_clang && !is_nacl) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    defines = [ "ENABLE_RTC_EVENT_LOG" ]
    deps = [
      "../logging:rtc_event_log_impl",
      "../logging:rtc_event_log_parser",
      "../modules/congestion_controller:congestion_controller",
      "../modules/rtp_rtcp:rtp_rtcp",
      "../system_wrappers:system_wrappers_default",
      "//build/config/sanitizers:deps",
    ]
    public_deps = [
      ":chart_proto",
      "../logging:rtc_event_log_parser",
    ]
  }
}

# Exclude tools depending on gflags since that's not available in Chromium.
if (rtc_include_tests) {
  if (rtc_enable_protobuf) {
    rtc_executable("event_log_visualizer") {
      testonly = true
      sources = [
        "event_log_visualizer/main.cc",
      ]

      if (is_clang && !is_nacl) {
        # Suppress warnings from the Chromium Clang plugin.
        # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
      }

      defines = [ "ENABLE_RTC_EVENT_LOG" ]
      deps = [
        ":event_log_visualizer_utils",
        "//third_party/gflags",
      ]
    }
  }

  rtc_executable("activity_metric") {
    testonly = true
    sources = [
      "agc/activity_metric.cc",
    ]

    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

    deps = [
      "../modules/audio_processing",
      "../system_wrappers:metrics_default",
      "//build/win:default_exe_manifest",
      "//testing/gtest",
      "//third_party/gflags",
    ]
  }

  tools_unittests_resources = [ "//resources/foreman_cif.yuv" ]

  if (is_ios) {
    bundle_data("tools_unittests_bundle_data") {
      testonly = true
      sources = tools_unittests_resources
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }
  }

  rtc_test("tools_unittests") {
    testonly = true

    sources = [
      "frame_analyzer/video_quality_analysis_unittest.cc",
      "frame_editing/frame_editing_unittest.cc",
      "simple_command_line_parser_unittest.cc",
    ]

    # TODO(jschuh): Bug 1348: fix this warning.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

    deps = [
      ":command_line_parser",
      ":frame_editing_lib",
      ":video_quality_analysis",
      "../test:test_support_main",
      "//testing/gtest",
    ]

    data = tools_unittests_resources
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]
      shard_timeout = 900
    }
    if (is_ios) {
      deps += [ ":tools_unittests_bundle_data" ]
    }
  }

  if (rtc_enable_protobuf) {
    copy("rtp_analyzer") {
      sources = [
        "py_event_log_analyzer/misc.py",
        "py_event_log_analyzer/pb_parse.py",
        "py_event_log_analyzer/rtp_analyzer.py",
        "py_event_log_analyzer/rtp_analyzer.sh",
      ]
      outputs = [
        "$root_build_dir/{{source_file_part}}",
      ]
      deps = [
        "../logging:rtc_event_log_proto",
      ]
    }
  }
}
