# Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("../../build/webrtc.gni")
import("//testing/test.gni")

# Note this target is missing an implementation for the video capture.
# Targets must link with either 'video_capture' or
# 'video_capture_internal_impl' depending on whether they want to
# use the internal capturer.
source_set("video_capture_module") {
  sources = [
    "device_info_impl.cc",
    "device_info_impl.h",
    "video_capture.h",
    "video_capture_config.h",
    "video_capture_defines.h",
    "video_capture_delay.h",
    "video_capture_factory.cc",
    "video_capture_factory.h",
    "video_capture_impl.cc",
    "video_capture_impl.h",
  ]

  deps = [
    "../..:webrtc_common",
    "../../common_video",
    "../../system_wrappers",
    "../utility",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }
}

source_set("video_capture") {
  sources = [
    "external/device_info_external.cc",
    "external/video_capture_external.cc",
  ]

  deps = [
    ":video_capture_module",
    "../../system_wrappers",
  ]

  configs += [ "../..:common_config" ]
  public_configs = [ "../..:common_inherited_config" ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }
}

if (!build_with_chromium) {
  config("video_capture_internal_impl_config") {
    if (is_ios) {
      libs = [
        "AVFoundation.framework",
        "CoreMedia.framework",
        "CoreVideo.framework",
      ]
    }
  }

  source_set("video_capture_internal_impl") {
    deps = [
      ":video_capture_module",
      "../../system_wrappers",
    ]

    if (is_linux) {
      sources = [
        "linux/device_info_linux.cc",
        "linux/device_info_linux.h",
        "linux/video_capture_linux.cc",
        "linux/video_capture_linux.h",
      ]
      deps += [ "../..:webrtc_common" ]
    }
    if (is_mac) {
      sources = [
        "mac/qtkit/video_capture_qtkit.h",
        "mac/qtkit/video_capture_qtkit.mm",
        "mac/qtkit/video_capture_qtkit_info.h",
        "mac/qtkit/video_capture_qtkit_info.mm",
        "mac/qtkit/video_capture_qtkit_info_objc.h",
        "mac/qtkit/video_capture_qtkit_info_objc.mm",
        "mac/qtkit/video_capture_qtkit_objc.h",
        "mac/qtkit/video_capture_qtkit_objc.mm",
        "mac/qtkit/video_capture_qtkit_utility.h",
        "mac/video_capture_mac.mm",
      ]

      libs = [
        # For NSAlert in video_capture_qtkit_info_objc.mm.
        "Cocoa.framework",

        # For GetGestalt in video_capture_mac.mm.
        "CoreServices.framework",
        "CoreVideo.framework",
        "QTKit.framework",
      ]
    }
    if (is_win) {
      sources = [
        "windows/device_info_ds.cc",
        "windows/device_info_ds.h",
        "windows/device_info_mf.cc",
        "windows/device_info_mf.h",
        "windows/help_functions_ds.cc",
        "windows/help_functions_ds.h",
        "windows/sink_filter_ds.cc",
        "windows/sink_filter_ds.h",
        "windows/video_capture_ds.cc",
        "windows/video_capture_ds.h",
        "windows/video_capture_factory_windows.cc",
        "windows/video_capture_mf.cc",
        "windows/video_capture_mf.h",
      ]

      libs = [ "Strmiids.lib" ]

      deps += [ "//third_party/winsdk_samples" ]
    }
    if (is_ios) {
      sources = [
        "ios/device_info_ios.h",
        "ios/device_info_ios.mm",
        "ios/device_info_ios_objc.h",
        "ios/device_info_ios_objc.mm",
        "ios/rtc_video_capture_ios_objc.h",
        "ios/rtc_video_capture_ios_objc.mm",
        "ios/video_capture_ios.h",
        "ios/video_capture_ios.mm",
      ]

      cflags = [
        "-fobjc-arc",  # CLANG_ENABLE_OBJC_ARC = YES.

        # To avoid warnings for deprecated videoMinFrameDuration and
        # videoMaxFrameDuration properties in iOS 7.0.
        # See webrtc:3705 for more details.
        "-Wno-deprecated-declarations",
      ]
    }

    all_dependent_configs = [ ":video_capture_internal_impl_config" ]

    configs += [ "../..:common_config" ]
    public_configs = [ "../..:common_inherited_config" ]

    if (is_clang) {
      # Suppress warnings from Chrome's Clang plugins.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  if (!is_android && rtc_include_tests) {
    test("video_capture_tests") {
      sources = [
        "test/video_capture_main_mac.mm",
        "test/video_capture_unittest.cc",
      ]

      cflags = []
      if (is_linux || is_mac) {
        cflags += [ "-Wno-write-strings" ]
      }

      ldflags = []
      if (is_linux || is_mac) {
        ldflags += [
          "-lpthread",
          "-lm",
        ]
      }
      if (is_linux) {
        ldflags += [
          "-lrt",
          "-lXext",
          "-lX11",
        ]
      }

      deps = [
        ":video_capture_internal_impl",
        ":video_capture_module",
        "../../system_wrappers:system_wrappers_default",
        "../../test:video_test_common",
        "../utility",
        "//testing/gtest",
      ]
      if (is_mac) {
        deps += [ "//webrtc/test:test_support_main_threaded_mac" ]
      } else {
        deps += [ "//webrtc/test:test_support_main" ]
      }

      if (is_clang) {
        # Suppress warnings from Chrome's Clang plugins.
        # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
        configs -= [ "//build/config/clang:find_bad_constructs" ]
      }
    }
  }
}
