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

if (is_component_build) {
  link_target_type = "source_set"
} else {
  link_target_type = "static_library"
}
target(link_target_type, "service") {
  visibility = [
    "//components/viz/service/*",
    "//content/gpu/*",
    "//content/public/gpu/*",
    "//media/*",
  ]

  sources = [
    "gpu_video_decode_accelerator.cc",
    "gpu_video_decode_accelerator.h",
    "media_gpu_channel.cc",
    "media_gpu_channel.h",
    "media_gpu_channel_manager.cc",
    "media_gpu_channel_manager.h",
    "picture_buffer_manager.cc",
    "picture_buffer_manager.h",
    "vda_video_decoder.cc",
    "vda_video_decoder.h",
  ]

  include_dirs = [ "//third_party/mesa_headers" ]

  public_deps = [
    "//base",
    "//gpu/config",
    "//ipc",
    "//media",
    "//media/gpu",
    "//media/mojo/mojom",
  ]
  deps = [
    "//build:chromeos_buildflags",
    "//gpu/command_buffer/service:gles2",
    "//gpu/ipc/service",
    "//media:media_buildflags",
    "//media/gpu",
    "//media/gpu:buildflags",
    "//media/gpu/ipc/common",
    "//third_party/mesa_headers",
    "//ui/gfx/ipc/color",
  ]

  if (is_mac) {
    deps += [ "//third_party/webrtc_overrides:webrtc_component" ]
  }
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "picture_buffer_manager_unittest.cc",
    "vda_video_decoder_unittest.cc",
  ]
  deps = [
    ":service",
    "//base",
    "//base/test:test_support",
    "//media:test_support",
    "//media/gpu:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
