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

source_set("video_coding") {
  sources = [
    "main/interface/video_coding.h",
    "main/interface/video_coding_defines.h",
    "main/source/codec_database.cc",
    "main/source/codec_database.h",
    "main/source/codec_timer.cc",
    "main/source/codec_timer.h",
    "main/source/content_metrics_processing.cc",
    "main/source/content_metrics_processing.h",
    "main/source/decoding_state.cc",
    "main/source/decoding_state.h",
    "main/source/encoded_frame.cc",
    "main/source/encoded_frame.h",
    "main/source/fec_tables_xor.h",
    "main/source/frame_buffer.cc",
    "main/source/frame_buffer.h",
    "main/source/generic_decoder.cc",
    "main/source/generic_decoder.h",
    "main/source/generic_encoder.cc",
    "main/source/generic_encoder.h",
    "main/source/inter_frame_delay.cc",
    "main/source/inter_frame_delay.h",
    "main/source/internal_defines.h",
    "main/source/jitter_buffer.cc",
    "main/source/jitter_buffer.h",
    "main/source/jitter_buffer_common.h",
    "main/source/jitter_estimator.cc",
    "main/source/jitter_estimator.h",
    "main/source/media_opt_util.cc",
    "main/source/media_opt_util.h",
    "main/source/media_optimization.cc",
    "main/source/media_optimization.h",
    "main/source/nack_fec_tables.h",
    "main/source/packet.cc",
    "main/source/packet.h",
    "main/source/qm_select.cc",
    "main/source/qm_select.h",
    "main/source/qm_select_data.h",
    "main/source/receiver.cc",
    "main/source/receiver.h",
    "main/source/rtt_filter.cc",
    "main/source/rtt_filter.h",
    "main/source/session_info.cc",
    "main/source/session_info.h",
    "main/source/timestamp_map.cc",
    "main/source/timestamp_map.h",
    "main/source/timing.cc",
    "main/source/timing.h",
    "main/source/video_coding_impl.cc",
    "main/source/video_coding_impl.h",
    "main/source/video_receiver.cc",
    "main/source/video_sender.cc",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_win) {
    cflags = [
      # TODO(jschuh): Bug 1348: fix this warning.
      "/wd4267",  # size_t to int truncation.
    ]
  }

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

  deps = [
    ":video_coding_utility",
    ":webrtc_h264",
    ":webrtc_i420",
    ":webrtc_vp8",
    ":webrtc_vp9",
    "../..:webrtc_common",
    "../../common_video",
    "../../system_wrappers",
  ]
}

source_set("video_coding_utility") {
  sources = [
    "utility/frame_dropper.cc",
    "utility/include/frame_dropper.h",
    "utility/include/moving_average.h",
    "utility/include/quality_scaler.h",
    "utility/include/vp8_header_parser.h",
    "utility/quality_scaler.cc",
    "utility/vp8_header_parser.cc",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

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

source_set("webrtc_h264") {
  sources = [
    "codecs/h264/h264.cc",
    "codecs/h264/include/h264.h",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

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

# TODO(tkchin): Source set for webrtc_h264_video_toolbox. Currently not
# possible to add, see https://crbug.com/297668.

source_set("webrtc_i420") {
  sources = [
    "codecs/i420/main/interface/i420.h",
    "codecs/i420/main/source/i420.cc",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

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

source_set("webrtc_vp8") {
  sources = [
    "codecs/vp8/default_temporal_layers.cc",
    "codecs/vp8/default_temporal_layers.h",
    "codecs/vp8/include/vp8.h",
    "codecs/vp8/include/vp8_common_types.h",
    "codecs/vp8/realtime_temporal_layers.cc",
    "codecs/vp8/reference_picture_selection.cc",
    "codecs/vp8/reference_picture_selection.h",
    "codecs/vp8/screenshare_layers.cc",
    "codecs/vp8/screenshare_layers.h",
    "codecs/vp8/simulcast_encoder_adapter.cc",
    "codecs/vp8/simulcast_encoder_adapter.h",
    "codecs/vp8/temporal_layers.h",
    "codecs/vp8/vp8_factory.cc",
    "codecs/vp8/vp8_factory.h",
    "codecs/vp8/vp8_impl.cc",
    "codecs/vp8/vp8_impl.h",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

  if (is_win) {
    cflags = [
      # TODO(jschuh): Bug 1348: fix this warning.
      "/wd4267",  # size_t to int truncation.
    ]
  }

  deps = [
    ":video_coding_utility",
    "../..:webrtc_common",
    "../../common_video",
    "../../system_wrappers",
  ]
  if (rtc_build_libvpx) {
    deps += [ rtc_libvpx_dir ]
  }
}

source_set("webrtc_vp9") {
  if (rtc_build_vp9) {
    sources = [
      "codecs/vp9/include/vp9.h",
      "codecs/vp9/vp9_frame_buffer_pool.cc",
      "codecs/vp9/vp9_frame_buffer_pool.h",
      "codecs/vp9/vp9_impl.cc",
      "codecs/vp9/vp9_impl.h",
    ]
  } else {
    sources = [
      "codecs/vp9/vp9_dummy_impl.cc",
    ]
  }

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

  deps = [
    ":video_coding_utility",
    "../../common_video",
    "../../system_wrappers",
  ]
  if (rtc_build_libvpx) {
    deps += [ rtc_libvpx_dir ]
  }
}
