# 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:sequence_checker",
    "../../api/video:video_frame",
    "../../api/video:video_rtp_headers",
    "../../common_video",
    "../../rtc_base:event_tracer",
    "../../rtc_base:logging",
    "../../rtc_base:macromagic",
    "../../rtc_base:race_checker",
    "../../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",
      "../../media:video_common",
      "../../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/camera_portal.cc",
          "linux/camera_portal.h",
          "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:gunit_helpers",
        "../../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",
      ]
    }
  }
}
