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

  # GCC and clang flags. MSVS (is_win && !is_clang) does not use cflags.
  if (!is_win || is_clang) {
    cflags += [
      "-Wno-format",
      "-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_assemble("openh264_common_yasm") {
    include_dirs = openh264_common_include_dirs
    sources = openh264_common_sources_asm_x86
    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
    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
    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
  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
  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
  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" ]
  }
}
