# 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("../../webrtc.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.
rtc_static_library("video_capture_module") {
  visibility = [ "*" ]
  sources = [
    "device_info_impl.cc",
    "device_info_impl.h",
    "video_capture.h",
    "video_capture_config.h",
    "video_capture_defines.h",
    "video_capture_factory.cc",
    "video_capture_factory.h",
    "video_capture_impl.cc",
    "video_capture_impl.h",
  ]

  deps = [
    "..:module_api",
    "../..:webrtc_common",
    "../../api:libjingle_peerconnection_api",
    "../../api:scoped_refptr",
    "../../api/video:video_frame",
    "../../api/video:video_frame_i420",
    "../../common_video",
    "../../media:rtc_media_base",
    "../../rtc_base:rtc_base_approved",
    "../../rtc_base:stringutils",
    "../../rtc_base/synchronization:rw_lock_wrapper",
    "../../system_wrappers",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/libyuv",
  ]
}

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

  deps = [
    ":video_capture_module",
    "../../api:scoped_refptr",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers",
  ]
}

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

  if (is_ios || is_mac) {
    rtc_source_set("video_capture_internal_impl_objc") {
      visibility = [ ":video_capture_internal_impl" ]

      deps = [
        ":video_capture_module",
        "../../api:scoped_refptr",
        "../../rtc_base:rtc_base_approved",
        "../../system_wrappers",
      ]

      sources = [
        "objc/device_info.h",
        "objc/device_info.mm",
        "objc/device_info_objc.h",
        "objc/device_info_objc.mm",
        "objc/rtc_video_capture_objc.h",
        "objc/rtc_video_capture_objc.mm",
        "objc/video_capture.h",
        "objc/video_capture.mm",
      ]

      all_dependent_configs = [ ":video_capture_internal_impl_config" ]
    }
  }

  rtc_source_set("video_capture_internal_impl") {
    deps = [
      ":video_capture_module",
      "../../api:scoped_refptr",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_approved",
      "../../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",
        "../../media:rtc_media_base",
      ]
    }
    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" ]

      if (build_with_mozilla) {
        sources += [
          "windows/BaseFilter.cpp",
          "windows/BaseInputPin.cpp",
          "windows/BasePin.cpp",
          "windows/MediaType.cpp",
        ]
      } else {
        deps += [ "//third_party/winsdk_samples" ]
      }
    }
    if (is_ios || is_mac) {
      deps += [ ":video_capture_internal_impl_objc" ]
    }

    all_dependent_configs = [ ":video_capture_internal_impl_config" ]

    if (build_with_mozilla && is_android) {
      include_dirs = [
        "/config/external/nspr",
        "/nsprpub/lib/ds",
        "/nsprpub/pr/include",
      ]

      sources = [
        "android/device_info_android.cc",
        "android/video_capture_android.cc",
      ]
    }
  }

  if (!is_android && rtc_include_tests) {
    rtc_test("video_capture_tests") {
      sources = [
        "test/video_capture_unittest.cc",
      ]
      ldflags = []
      if (is_linux || is_mac) {
        ldflags += [
          "-lpthread",
          "-lm",
        ]
      }
      if (is_linux) {
        ldflags += [
          "-lrt",
          "-lXext",
          "-lX11",
        ]
      }

      deps = [
        ":video_capture_internal_impl",
        ":video_capture_module",
        "../../api:scoped_refptr",
        "../../api/video:video_frame",
        "../../api/video:video_frame_i420",
        "../../common_video:common_video",
        "../../rtc_base:rtc_base_approved",
        "../../system_wrappers:system_wrappers",
        "../../test:test_support",
        "../../test:video_test_common",
        "../utility",
        "//testing/gtest",
        "//third_party/abseil-cpp/absl/memory:memory",
      ]
      deps += [ "../../test:test_main" ]
    }
  }
}
