# 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/config/arm.gni")
import("../../webrtc.gni")

build_video_processing_sse2 = current_cpu == "x86" || current_cpu == "x64"

rtc_static_library("video_processing") {
  visibility = [ "*" ]
  sources = [
    "util/denoiser_filter.cc",
    "util/denoiser_filter_c.cc",
    "util/denoiser_filter_c.h",
    "util/noise_estimation.cc",
    "util/noise_estimation.h",
    "util/skin_detection.cc",
    "util/skin_detection.h",
    "video_denoiser.cc",
    "video_denoiser.h",
  ]

  deps = [
    ":denoiser_filter",
    "..:module_api",
    "../../common_audio",
    "../../common_video",
    "../../modules/utility",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers:cpu_features_api",
    "//third_party/libyuv",
  ]
  if (build_video_processing_sse2) {
    deps += [ ":video_processing_sse2" ]
  }
  if (rtc_build_with_neon) {
    deps += [ ":video_processing_neon" ]
  }

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }
}

rtc_source_set("denoiser_filter") {
  # Target that only exists to avoid cyclic depdency errors for the SSE2 and
  # Neon implementations below.
  sources = [
    "util/denoiser_filter.h",
  ]
  deps = [
    "..:module_api",
  ]
}

if (build_video_processing_sse2) {
  rtc_static_library("video_processing_sse2") {
    sources = [
      "util/denoiser_filter_sse2.cc",
      "util/denoiser_filter_sse2.h",
    ]

    deps = [
      ":denoiser_filter",
      "../../rtc_base:rtc_base_approved",
      "../../system_wrappers",
    ]

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

    if (is_posix) {
      cflags = [ "-msse2" ]
    }
  }
}

if (rtc_build_with_neon) {
  rtc_static_library("video_processing_neon") {
    sources = [
      "util/denoiser_filter_neon.cc",
      "util/denoiser_filter_neon.h",
    ]

    deps = [
      ":denoiser_filter",
    ]

    if (current_cpu != "arm64") {
      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
      cflags = [ "-mfpu=neon" ]
    }
  }
}

if (rtc_include_tests) {
  rtc_source_set("video_processing_unittests") {
    testonly = true

    sources = [
      "test/denoiser_test.cc",
    ]
    deps = [
      ":video_processing",
      "../../common_video:common_video",
      "../../test:test_support",
      "../../test:video_test_common",
    ]
    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}
