# 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_library("video_capture_module") {
  visibility = [ "*" ]
  sources = [
    "device_info_impl.cc",
    "device_info_impl.h",
    "raw_video_sink_interface.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 = [
    "../../api:scoped_refptr",
    "../../api/video:video_frame",
    "../../api/video:video_rtp_headers",
    "../../common_video",
    "../../media:rtc_media_base",
    "../../rtc_base:event_tracer",
    "../../rtc_base:logging",
    "../../rtc_base:macromagic",
    "../../rtc_base:refcount",
    "../../rtc_base:stringutils",
    "../../rtc_base:timeutils",
    "../../rtc_base/synchronization:mutex",
    "../../rtc_base/system:rtc_export",
    "../../system_wrappers",
    "//third_party/libyuv",
  ]
  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
}

if (!build_with_chromium || is_linux || is_chromeos) {
  rtc_source_set("video_capture_internal_impl") {
    visibility = [ "*" ]
    deps = [
      ":video_capture_module",
      "../../api:scoped_refptr",
      "../../api:sequence_checker",
      "../../rtc_base:checks",
      "../../rtc_base:logging",
      "../../rtc_base:macromagic",
      "../../rtc_base:platform_thread",
      "../../rtc_base:refcount",
      "../../rtc_base:stringutils",
      "../../rtc_base/synchronization:mutex",
      "../../rtc_base/system:rtc_export",
      "../../system_wrappers",
    ]
    sources = [
      "video_capture_options.cc",
      "video_capture_options.h",
    ]

    if (is_linux || is_chromeos) {
      sources += [
        "linux/device_info_linux.cc",
        "linux/device_info_v4l2.cc",
        "linux/device_info_v4l2.h",
        "linux/video_capture_linux.cc",
        "linux/video_capture_v4l2.cc",
        "linux/video_capture_v4l2.h",
      ]
      deps += [ "../../media:rtc_media_base" ]

      if (rtc_use_pipewire) {
        sources += [
          "linux/device_info_pipewire.cc",
          "linux/device_info_pipewire.h",
          "linux/pipewire_session.cc",
          "linux/pipewire_session.h",
          "linux/video_capture_pipewire.cc",
          "linux/video_capture_pipewire.h",
        ]

        configs += [ "../portal:pipewire_base" ]

        public_configs = [ "../portal:pipewire_config" ]

        deps += [
          "../../api:refcountedbase",
          "../../common_video",
          "../../media:rtc_media_base",
          "../portal",
        ]
      }
    }
    if (is_win) {
      sources += [
        "windows/device_info_ds.cc",
        "windows/device_info_ds.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",
      ]

      libs = [
        "ole32.lib",
        "oleaut32.lib",
        "strmiids.lib",
        "user32.lib",
      ]

      if (build_with_mozilla) {
        sources += [
          "windows/BaseFilter.cpp",
          "windows/BaseInputPin.cpp",
          "windows/BasePin.cpp",
          "windows/MediaType.cpp",
        ]
      }
    }
    if (is_fuchsia) {
      sources += [ "video_capture_factory_null.cc" ]
    }

    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_chromeos || is_mac) {
        ldflags += [
          "-lpthread",
          "-lm",
        ]
      }
      if (is_linux || is_chromeos) {
        ldflags += [
          "-lrt",
          "-lXext",
          "-lX11",
        ]
      }

      deps = [
        ":video_capture_internal_impl",
        ":video_capture_module",
        "../../api:scoped_refptr",
        "../../api/video:video_frame",
        "../../api/video:video_rtp_headers",
        "../../common_video",
        "../../rtc_base:timeutils",
        "../../rtc_base/synchronization:mutex",
        "../../system_wrappers",
        "../../test:frame_utils",
        "../../test:test_main",
        "../../test:test_support",
        "../../test:video_test_common",
        "//testing/gtest",
        "//third_party/abseil-cpp/absl/memory",
      ]
    }
  }
}
