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

import("//build/config/ui.gni")
import("//media/media_options.gni")
import("//testing/test.gni")

group("capture") {
  public_deps = [
    ":capture_lib",
    "//media/capture/mojom:image_capture",
    "//media/capture/mojom:image_capture_types",
    "//media/capture/mojom:video_capture",
    "//services/service_manager/public/cpp",
  ]
}

component("capture_switches") {
  defines = [ "CAPTURE_IMPLEMENTATION" ]
  sources = [
    "capture_export.h",
    "capture_switches.cc",
    "capture_switches.h",
  ]
  deps = [
    "//base",
    "//third_party/webrtc_overrides:webrtc_component",
  ]
}

# Things needed by //media/capture/mojom/video_capture_types.mojom.
component("capture_base") {
  defines = [ "CAPTURE_IMPLEMENTATION" ]
  sources = [
    "capture_export.h",
    "video/video_capture_device_descriptor.cc",
    "video/video_capture_device_descriptor.h",
    "video/video_capture_device_info.cc",
    "video/video_capture_device_info.h",
    "video/video_capture_feedback.cc",
    "video/video_capture_feedback.h",
    "video_capture_types.cc",
    "video_capture_types.h",
  ]
  deps = [
    "//base",
    "//base:i18n",
    "//media",
    "//ui/gfx",
  ]
}

# Target which allows breakout of platform-specific BUILD.gn files.
source_set("capture_device_specific") {
  visibility = [
    ":capture_lib",
    "//media/capture/video/android",
    "//media/capture/video/apple",
    "//media/capture/video/chromeos",
    "//media/capture/video/fuchsia",
    "//media/capture/video/ios",
    "//media/capture/video/linux",
    "//media/capture/video/mac",
    "//media/capture/video/win",
  ]
  defines = [ "CAPTURE_IMPLEMENTATION" ]
  sources = [
    "content/animated_content_sampler.cc",
    "content/animated_content_sampler.h",
    "content/capture_resolution_chooser.cc",
    "content/capture_resolution_chooser.h",
    "content/screen_enumerator.h",
    "content/smooth_event_sampler.cc",
    "content/smooth_event_sampler.h",
    "content/video_capture_oracle.cc",
    "content/video_capture_oracle.h",
    "video/blob_utils.cc",
    "video/blob_utils.h",
    "video/fake_video_capture_device.cc",
    "video/fake_video_capture_device.h",
    "video/fake_video_capture_device_factory.cc",
    "video/fake_video_capture_device_factory.h",
    "video/mappable_shared_image_utils.cc",
    "video/mappable_shared_image_utils.h",
    "video/video_capture_buffer_handle.cc",
    "video/video_capture_buffer_handle.h",
    "video/video_capture_buffer_pool_constants.h",
    "video/video_capture_buffer_tracker.cc",
    "video/video_capture_buffer_tracker.h",
    "video/video_capture_device.cc",
    "video/video_capture_device.h",
    "video/video_capture_device_factory.cc",
    "video/video_capture_device_factory.h",
    "video/video_capture_metrics.cc",
    "video/video_capture_metrics.h",
    "video/video_frame_receiver_types.h",
  ]

  if (!is_android) {
    sources += [
      "video/file_video_capture_device.cc",
      "video/file_video_capture_device.h",
      "video/file_video_capture_device_factory.cc",
      "video/file_video_capture_device_factory.h",
    ]
  }

  public_deps = [ ":capture_base" ]
  deps = [
    "//base",
    "//base:i18n",
    "//gpu/command_buffer/client",
    "//gpu/ipc/common",
    "//media",
    "//media/capture:capture_gpu_channel",
    "//media/capture:capture_switches",
    "//media/capture/mojom:image_capture",
    "//media/capture/mojom:image_capture_types",
    "//media/capture/mojom:video_capture",
    "//media/mojo/mojom",
    "//skia",
    "//third_party/libyuv",
    "//third_party/webrtc_overrides:webrtc_component",
    "//ui/gfx",
  ]
}

component("capture_lib") {
  defines = [ "CAPTURE_IMPLEMENTATION" ]
  sources = [
    "video/create_video_capture_device_factory.cc",
    "video/create_video_capture_device_factory.h",
    "video/scoped_buffer_pool_reservation.h",
    "video/shared_image_buffer_tracker.cc",
    "video/shared_image_buffer_tracker.h",
    "video/shared_memory_buffer_tracker.cc",
    "video/shared_memory_buffer_tracker.h",
    "video/video_capture_buffer_pool.h",
    "video/video_capture_buffer_pool_impl.cc",
    "video/video_capture_buffer_pool_impl.h",
    "video/video_capture_buffer_pool_util.cc",
    "video/video_capture_buffer_pool_util.h",
    "video/video_capture_buffer_tracker_factory.h",
    "video/video_capture_buffer_tracker_factory_impl.cc",
    "video/video_capture_buffer_tracker_factory_impl.h",
    "video/video_capture_device_client.cc",
    "video/video_capture_device_client.h",
    "video/video_capture_system.h",
    "video/video_capture_system_impl.cc",
    "video/video_capture_system_impl.h",
    "video/video_frame_receiver.cc",
    "video/video_frame_receiver.h",
    "video/video_frame_receiver_on_task_runner.cc",
    "video/video_frame_receiver_on_task_runner.h",
  ]

  public_deps = [
    ":capture_base",
    ":capture_device_specific",
    ":capture_gpu_channel",
    ":capture_switches",
  ]

  deps = [
    "//base",
    "//base:i18n",
    "//gpu/config",
    "//media",
    "//media/capture/mojom:image_capture",
    "//media/capture/mojom:image_capture_types",
    "//media/capture/mojom:video_capture",
    "//media/mojo/mojom",
    "//services/service_manager/public/cpp",
    "//services/video_capture/public/mojom",
    "//third_party/libyuv",
    "//ui/display",
    "//ui/gfx",
    "//ui/gfx:color_space",
    "//ui/gfx/geometry",
  ]

  if (is_android) {
    public_deps += [ "video/android" ]
    deps += [ "video/android:capture_jni_headers" ]
  }

  if (is_apple) {
    public_deps += [ "video/apple" ]
  }

  if (is_win) {
    public_deps += [ "video/win" ]
  }

  if (is_linux || is_chromeos) {
    deps += [ "video/linux" ]
  }

  if (is_chromeos) {
    public_deps += [ "video/chromeos" ]
    data_deps = [ "video/chromeos:mojo_policies" ]
  }

  if (is_fuchsia) {
    deps += [ "video/fuchsia" ]
  }
}

source_set("capture_gpu_channel") {
  defines = [ "CAPTURE_IMPLEMENTATION" ]
  sources = []
  deps = []

  # Establish GPU Channel
  if (enable_gpu_channel_media_capture) {
    sources += [
      "video/video_capture_gpu_channel_host.cc",
      "video/video_capture_gpu_channel_host.h",
    ]
    deps += [
      ":capture_base",
      "//gpu/command_buffer/client",
      "//gpu/ipc/client",
    ]
  }
}

source_set("test_support") {
  testonly = true

  sources = [
    "video/mock_device.cc",
    "video/mock_device.h",
    "video/mock_device_factory.cc",
    "video/mock_device_factory.h",
    "video/mock_video_capture_device_client.cc",
    "video/mock_video_capture_device_client.h",
    "video/mock_video_frame_receiver.cc",
    "video/mock_video_frame_receiver.h",
  ]

  deps = [
    ":capture_lib",
    "//base/test:test_support",
    "//gpu:test_support",
    "//gpu/command_buffer/client",
    "//gpu/command_buffer/common",
    "//media:test_support",
    "//media/capture/mojom:image_capture",
    "//media/capture/mojom:image_capture_types",
    "//testing/gmock",
    "//ui/gfx:test_support",
  ]

  if (is_chromeos) {
    public_deps = [ "video/chromeos:test_support" ]
  } else if (is_linux) {
    public_deps = [ "video/linux:test_support" ]
  } else if (is_mac) {
    public_deps = [ "video/mac/test:test_support" ]
  }

  testonly = true
}

test("capture_unittests") {
  use_xvfb = use_xvfb_in_this_config

  sources = [
    "content/animated_content_sampler_unittest.cc",
    "content/capture_resolution_chooser_unittest.cc",
    "content/smooth_event_sampler_unittest.cc",
    "content/video_capture_oracle_unittest.cc",
    "run_all_unittests.cc",
    "video/fake_video_capture_device_unittest.cc",
    "video/video_capture_device_client_unittest.cc",
    "video/video_capture_device_unittest.cc",
    "video/video_capture_metrics_unittest.cc",
    "video_capture_types_unittest.cc",
  ]

  if (!is_android) {
    sources += [ "video/file_video_capture_device_unittest.cc" ]
  }

  data = [ "//media/test/data/bear.mjpeg" ]

  deps = [
    ":capture",
    ":test_support",
    "//base/test:test_support",
    "//components/viz/test:test_support",
    "//gpu:test_support",
    "//gpu/command_buffer/client",
    "//media:test_support",
    "//media/capture/mojom:image_capture",
    "//media/capture/mojom:image_capture_types",
    "//mojo/core/embedder",
    "//services/video_capture/public/mojom",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/libyuv",
    "//ui/gfx:color_space",
    "//ui/gfx:test_support",
  ]

  if (is_linux) {
    deps += [ "video/linux:unit_tests" ]
    data += [ "//media/test/data/one_frame_1280x720.mjpeg" ]
  }

  if (is_android) {
    deps += [
      "//media/capture/video/android",
      "//media/capture/video/android:capture_java",
    ]
  }

  if (is_fuchsia) {
    deps += [ "video/fuchsia:unit_tests" ]
    additional_manifest_fragments =
        [ "//build/config/fuchsia/test/sysmem.shard.test-cml" ]
  }

  if (is_apple) {
    deps += [ "video/apple:unit_tests" ]
  }

  if (is_mac) {
    deps += [ "video/mac:unit_tests" ]
  }

  if (is_ios) {
    deps += [ "//media:unit_tests_bundle_data" ]
  }

  if (is_win) {
    deps += [ "video/win:win_unittests" ]
  }

  if (is_chromeos) {
    deps += [
      "video/chromeos:unit_tests",
      "//chromeos/ash/components/mojo_service_manager",
    ]
  }
}
