# 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 = []

  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_tools: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" ]
  }
}
