# 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/qp_parser.h",
    "utility/include/quality_scaler.h",
    "utility/include/vp8_header_parser.h",
    "utility/qp_parser.cc",
    "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/i420.cc",
    "codecs/i420/include/i420.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",
  ]
}

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