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

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

component("capture") {
  defines = [ "CAPTURE_IMPLEMENTATION" ]
  sources = [
    "capture_export.h",
    "content/animated_content_sampler.cc",
    "content/animated_content_sampler.h",
    "content/capture_resolution_chooser.cc",
    "content/capture_resolution_chooser.h",
    "content/screen_capture_device_core.cc",
    "content/screen_capture_device_core.h",
    "content/smooth_event_sampler.cc",
    "content/smooth_event_sampler.h",
    "content/thread_safe_capture_oracle.cc",
    "content/thread_safe_capture_oracle.h",
    "content/video_capture_oracle.cc",
    "content/video_capture_oracle.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/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",
    "video/linux/v4l2_capture_delegate.cc",
    "video/linux/v4l2_capture_delegate.h",
    "video/linux/video_capture_device_chromeos.cc",
    "video/linux/video_capture_device_chromeos.h",
    "video/linux/video_capture_device_factory_linux.cc",
    "video/linux/video_capture_device_factory_linux.h",
    "video/linux/video_capture_device_linux.cc",
    "video/linux/video_capture_device_linux.h",
    "video/mac/video_capture_device_avfoundation_mac.h",
    "video/mac/video_capture_device_avfoundation_mac.mm",
    "video/mac/video_capture_device_decklink_mac.h",
    "video/mac/video_capture_device_decklink_mac.mm",
    "video/mac/video_capture_device_factory_mac.h",
    "video/mac/video_capture_device_factory_mac.mm",
    "video/mac/video_capture_device_mac.h",
    "video/mac/video_capture_device_mac.mm",
    "video/scoped_result_callback.h",
    "video/video_capture_buffer_handle.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_tracker.h",
    "video/video_capture_buffer_tracker_factory.h",
    "video/video_capture_device.cc",
    "video/video_capture_device.h",
    "video/video_capture_device_client.cc",
    "video/video_capture_device_client.h",
    "video/video_capture_device_descriptor.cc",
    "video/video_capture_device_descriptor.h",
    "video/video_capture_device_factory.cc",
    "video/video_capture_device_factory.h",
    "video/video_capture_jpeg_decoder.h",
    "video/video_frame_receiver.h",
    "video/win/capability_list_win.cc",
    "video/win/capability_list_win.h",
    "video/win/filter_base_win.cc",
    "video/win/filter_base_win.h",
    "video/win/pin_base_win.cc",
    "video/win/pin_base_win.h",
    "video/win/sink_filter_observer_win.h",
    "video/win/sink_filter_win.cc",
    "video/win/sink_filter_win.h",
    "video/win/sink_input_pin_win.cc",
    "video/win/sink_input_pin_win.h",
    "video/win/video_capture_device_factory_win.cc",
    "video/win/video_capture_device_factory_win.h",
    "video/win/video_capture_device_mf_win.cc",
    "video/win/video_capture_device_mf_win.h",
    "video/win/video_capture_device_win.cc",
    "video/win/video_capture_device_win.h",
    "video_capture_types.cc",
    "video_capture_types.h",
    "video_capturer_source.cc",
    "video_capturer_source.h",
  ]

  public_deps = []
  deps = [
    "//base",
    "//base:i18n",
    "//media",
    "//media/mojo/interfaces:image_capture",
    "//skia",
    "//third_party/libyuv",
    "//ui/display",
    "//ui/gfx",
  ]

  configs += [
    # TODO(mcasas): media/base should be a component and not a source_set, but
    # it depends on parts of media/filters, media/ffmpeg etc. Until then, we
    # pretend to be inside media.dll and duplicate the few symbols needed, see
    # https://crbug.com/590017.
    "//media:media_implementation",
  ]

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

  if (is_mac) {
    deps += [ "//third_party/decklink" ]
    libs = [
      "CoreFoundation.framework",
      "CoreGraphics.framework",
      "CoreVideo.framework",
      "Foundation.framework",
    ]
  }

  if (is_win) {
    deps += [
      "//media/base",  # For media_switches.
      "//media/base/win",
    ]
    libs = [
      "mf.lib",
      "mfplat.lib",
      "mfreadwrite.lib",
      "mfuuid.lib",
    ]
    ldflags = [
      "/DELAYLOAD:mf.dll",
      "/DELAYLOAD:mfplat.dll",
      "/DELAYLOAD:mfreadwrite.dll",
    ]

    # TODO(jschuh): https://crbug.com/167187 fix size_t to int truncations.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
  }

  if (is_linux || is_chromeos || is_win) {
    sources += [
      "video/blob_utils.cc",
      "video/blob_utils.h",
    ]
  }
}

test("capture_unittests") {
  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",
    "video/fake_video_capture_device_unittest.cc",
    "video/mac/video_capture_device_factory_mac_unittest.mm",
    "video/video_capture_device_unittest.cc",
  ]

  deps = [
    ":capture",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//media/base:test_support",
    "//media/mojo/interfaces:image_capture",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/gfx:test_support",
  ]

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

  if (is_win) {
    # TODO(jschuh): https://crbug.com/167187 fix size_t to int truncations.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
  }
}
