# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

source_set("encoder") {
  sources = [
    "audio_encoder.h",
    "encoder_bitrate_filter.cc",
    "encoder_bitrate_filter.h",
    "frame_processing_time_estimator.cc",
    "frame_processing_time_estimator.h",
    "video_encoder.cc",
    "video_encoder.h",
    "video_encoder_helper.cc",
    "video_encoder_helper.h",
    "video_encoder_verbatim.cc",
    "video_encoder_verbatim.h",
    "video_encoder_vpx.cc",
    "video_encoder_vpx.h",
    "webrtc_video_encoder_proxy.cc",
    "webrtc_video_encoder_proxy.h",
    "webrtc_video_encoder_selector.cc",
    "webrtc_video_encoder_selector.h",
    "webrtc_video_encoder_vpx.cc",
    "webrtc_video_encoder_vpx.h",
  ]

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  deps = [
    ":vpx_codec",
    "//base/third_party/dynamic_annotations",
    "//remoting/proto",
    "//third_party/libvpx",
    "//third_party/libyuv",
    "//third_party/opus",
    "//third_party/webrtc/modules/desktop_capture:primitives",
    "//ui/gfx:color_space",
    "//ui/gfx/geometry",
  ]

  # Currently, building WebrtcVideoEncoderGpu is only supported on Windows and
  # Linux, and encoding with WebrtcVideoEncoderGpu is only supported on Windows.
  if (is_win || is_linux) {
    public_configs = [
      "//skia:skia_config",
    ]
    sources += [
      "webrtc_video_encoder_gpu.cc",
      "webrtc_video_encoder_gpu.h",
    ]
    deps += [
      "//gpu/command_buffer/service",
      "//media/gpu",
    ]
  }

  # Opus depends on //media, which is not a supported include for iOS.
  # Also disabled it on Android, to avoid dependency on //media.
  # TODO(sergeyu): Cleanup host-only deps in client targets.
  if (!is_ios && !is_android) {
    sources += [
      "audio_encoder_opus.cc",
      "audio_encoder_opus.h",
      "cast_software_video_encoder_adapter.cc",
      "cast_software_video_encoder_adapter.h",
    ]
    deps += [
      "//media",
      "//media:shared_memory_support",
      "//media/cast:sender",
    ]
  }
}

source_set("decoder") {
  sources = [
    "audio_decoder.cc",
    "audio_decoder.h",
    "audio_decoder_opus.cc",
    "audio_decoder_opus.h",
    "video_decoder.h",
    "video_decoder_verbatim.cc",
    "video_decoder_verbatim.h",
    "video_decoder_vpx.cc",
    "video_decoder_vpx.h",
  ]

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  deps = [
    ":vpx_codec",
    "//base/third_party/dynamic_annotations",
    "//remoting/proto",
    "//third_party/libvpx",
    "//third_party/libyuv",
    "//third_party/opus",
    "//third_party/webrtc/modules/desktop_capture:primitives",
  ]
}

source_set("vpx_codec") {
  sources = [
    "scoped_vpx_codec.cc",
    "scoped_vpx_codec.h",
  ]

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  public_deps = [
    "//third_party/libvpx",
  ]

  deps = [
    "//base/third_party/dynamic_annotations",
    "//remoting/proto",
    "//third_party/libyuv",
    "//third_party/webrtc/modules/desktop_capture:primitives",
  ]
}

source_set("unit_tests") {
  testonly = true

  sources = [
    "audio_encoder_opus_unittest.cc",
    "codec_test.cc",
    "codec_test.h",
    "encoder_bitrate_filter_unittest.cc",
    "frame_processing_time_estimator_unittest.cc",
    "video_decoder_vpx_unittest.cc",
    "video_encoder_helper_unittest.cc",
    "video_encoder_verbatim_unittest.cc",
    "video_encoder_vpx_unittest.cc",
    "webrtc_video_encoder_selector_unittest.cc",
  ]

  deps = [
    ":decoder",
    ":encoder",
    "//base",
    "//remoting/proto",
    "//testing/gtest",
    "//third_party/webrtc/modules/desktop_capture",
    "//ui/gfx:color_space",
  ]

  if (is_ios || is_android) {
    sources -= [ "audio_encoder_opus_unittest.cc" ]
  }
}
