# 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.

import("//remoting/remoting_srcs.gni")

source_set("codec") {
  sources = rebase_path(remoting_srcs_gypi_values.remoting_codec_sources,
                        ".",
                        "//remoting")

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

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

  if (is_nacl) {
    deps -= [
      "//media",
      "//media:shared_memory_support",
    ]
    sources -= [
      "audio_encoder.h",
      "audio_encoder_opus.cc",
      "audio_encoder_opus.h",
      "audio_encoder_verbatim.cc",
      "audio_encoder_verbatim.h",
      "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",
    ]
  }
}

source_set("unit_tests") {
  testonly = true

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

  deps = [
    ":codec",
    "//base",
    "//remoting/proto",
    "//testing/gtest",
    "//third_party/webrtc/modules/desktop_capture",
  ]
}
