# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/sanitizers/sanitizers.gni")
import("//third_party/openh264/openh264_args.gni")
import("//third_party/openh264/openh264_sources.gni")
import("//third_party/yasm/yasm_assemble.gni")

# Config shared by all openh264 targets.
config("config") {
  cflags = []
  defines = []

  if (is_chromeos && target_cpu == "arm") {
    # HAVE_NEON and __chromeos__ are needed for enabling NEON on ChromeOS
    # devices.
    defines += [
      "HAVE_NEON",
      "__chromeos__",
    ]
  }

  # GCC and clang flags. MSVS (is_win && !is_clang) does not use cflags.
  if (!is_win || is_clang) {
    cflags += [
      "-Wno-format",
      "-Wno-format-security",
      "-Wno-header-hygiene",
      "-Wno-unused-function",
      "-Wno-unused-value",
    ]
  }

  # Platform-specific defines.
  if (is_android) {
    # Android NDK is necessary for its cpufeatures and this define is what
    # OpenH264 code uses to check if it should be used.
    defines += [ "ANDROID_NDK" ]
  }
}

# YASM assembly is only checked to be working on Windows and Linux.
# Mac is known to fail certain tests when building, but actual assembly
# is believed to work.
# MSAN builds are flaky with assembler. crbug.com/685168

use_assembler = (is_win || is_linux) &&
                (target_cpu == "x86" || target_cpu == "x64") && !is_msan

# This IF statement will make the targets visible only on specific builds,
# which will lead to failures on other platforms if accidentally invoked.
if (use_assembler) {
  yasm_defines = []
  if (!is_component_build) {
    if (is_mac || is_ios) {
      yasm_defines += [ "WELS_PRIVATE_EXTERN=:private_extern" ]
    } else if (is_linux || is_android || is_fuchsia) {
      yasm_defines += [ "WELS_PRIVATE_EXTERN=:hidden" ]
    }
  }

  yasm_assemble("openh264_common_yasm") {
    include_dirs = openh264_common_include_dirs
    sources = openh264_common_sources_asm_x86
    defines = yasm_defines
    if (target_cpu == "x86") {
      defines += [ "X86_32" ]
    } else {  # x64
      if (is_mac) {
        defines += [
          "PREFIX",
          "UNIX64",
        ]
      } else if (is_win) {
        defines += [ "WIN64" ]
      } else if (is_linux) {
        defines += [ "UNIX64" ]
      }
    }
  }

  yasm_assemble("openh264_processing_yasm") {
    include_dirs = openh264_processing_include_dirs
    include_dirs += [ "./src/codec/common/x86" ]
    sources = openh264_processing_sources_asm_x86
    defines = yasm_defines
    if (target_cpu == "x86") {
      defines += [ "X86_32" ]
    } else {  # x64
      if (is_mac) {
        defines += [
          "PREFIX",
          "UNIX64",
        ]
      } else if (is_win) {
        defines += [ "WIN64" ]
      } else if (is_linux) {
        defines += [ "UNIX64" ]
      }
    }
  }

  yasm_assemble("openh264_encoder_yasm") {
    include_dirs = openh264_encoder_include_dirs
    include_dirs += [ "./src/codec/common/x86" ]
    sources = openh264_encoder_sources_asm_x86
    defines = yasm_defines
    if (target_cpu == "x86") {
      defines += [ "X86_32" ]
    } else {  # x64
      if (is_mac) {
        defines += [
          "PREFIX",
          "UNIX64",
        ]
      } else if (is_win) {
        defines += [ "WIN64" ]
      } else if (is_linux) {
        defines += [ "UNIX64" ]
      }
    }
  }
}  # if (is_win || is_linux)

source_set("common") {
  sources = openh264_common_sources
  if (is_chromeos && target_cpu == "arm") {
    sources += openh264_common_sources_asm_arm
  }
  include_dirs = openh264_common_include_dirs

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
  configs += [ ":config" ]
  deps = []
  if (use_assembler) {
    defines = [ "X86_ASM" ]
    deps += [ ":openh264_common_yasm" ]
  }
  if (is_android) {
    deps += [
      # Defines "android_get/setCpu..." functions. The original OpenH264 build
      # files replaces these using macros for "wels_..." versions of the same
      # functions. We do not have access to these and use the <cpu-features.h>
      # ones instead.
      "//third_party/android_sdk:cpu_features",
    ]
  }
}

source_set("processing") {
  sources = openh264_processing_sources
  if (is_chromeos && target_cpu == "arm") {
    sources += openh264_processing_sources_asm_arm
  }
  include_dirs = openh264_processing_include_dirs

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
  configs += [ ":config" ]
  deps = [
    ":common",
  ]
  if (use_assembler) {
    defines = [ "X86_ASM" ]
    deps += [ ":openh264_processing_yasm" ]
  }
}

source_set("encoder") {
  sources = openh264_encoder_sources
  if (is_chromeos && target_cpu == "arm") {
    sources += openh264_encoder_sources_asm_arm
  }
  include_dirs = openh264_encoder_include_dirs

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
  configs += [ ":config" ]

  # TODO: Remove after fixing always-true condition
  # third_party/openh264/src/codec/encoder/core/src/encoder_ext.cpp:142.
  if (is_clang) {
    configs -= [ "//build/config/clang:extra_warnings" ]
  }
  deps = [
    ":common",
    ":processing",
  ]
  if (use_assembler) {
    defines = [ "X86_ASM" ]
    deps += [ ":openh264_encoder_yasm" ]
  }
}
