# Copyright 2014 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/arm.gni")
import("//testing/test.gni")

# If fixed point implementation shall be used (otherwise float).
use_opus_fixed_point = current_cpu == "arm" || current_cpu == "arm64"

# If ARM optimizations shall be used to accelerate performance.
use_opus_arm_optimization = current_cpu == "arm"

# If OPUS Run Time CPU Detections (RTCD) shall be used.
# Based on the conditions in celt/arm/armcpu.c:
# defined(_MSC_VER) || defined(__linux__).
use_opus_rtcd = current_cpu == "arm" && (is_win || is_android || is_linux)

config("opus_config") {
  include_dirs = [ "src/include" ]
}

config("opus_test_config") {
  include_dirs = [
    "src/celt",
    "src/silk",
  ]

  if (is_win) {
    defines = [ "inline=__inline" ]
  }
  if (is_android) {
    libs = [ "log" ]
  }
  if (is_clang) {
    cflags = [ "-Wno-absolute-value" ]
  }
}

if (use_opus_rtcd) {
  action("convert_rtcd_assembler") {
    script = "convert_rtcd_assembler.py"
    outputs = [
      "$target_gen_dir/celt_pitch_xcorr_arm_gnu.S",
    ]
    args = [
      rebase_path("//third_party/opus/src/celt/arm/arm2gnu.pl", root_build_dir),
      rebase_path("//third_party/opus/src/celt/arm/celt_pitch_xcorr_arm.s",
                  root_build_dir),
      rebase_path("$target_gen_dir/celt_pitch_xcorr_arm_gnu.S", root_build_dir),
    ]
  }
}

source_set("opus") {
  gypi_values = exec_script("//build/gypi_to_gn.py",
                            [ rebase_path("opus_srcs.gypi") ],
                            "scope",
                            [ "opus_srcs.gypi" ])
  sources = gypi_values.opus_common_sources

  defines = [
    "OPUS_BUILD",
    "OPUS_EXPORT=",
  ]

  include_dirs = [
    "src/celt",
    "src/silk",
  ]

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

  if (is_win) {
    defines += [
      "USE_ALLOCA",
      "inline=__inline",
    ]

    cflags = [
      "/wd4305",  # Disable truncation warning in celt/pitch.c .
      "/wd4334",  # Disable 32-bit shift warning in src/opus_encoder.c .
    ]
  } else {
    defines += [
      "HAVE_LRINT",
      "HAVE_LRINTF",
      "VAR_ARRAYS",
    ]
  }

  if (is_posix && !is_android) {
    # Suppress a warning given by opus_decoder.c that tells us
    # optimizations are turned off.
    cflags = [ "-Wno-#pragma-messages" ]
  }

  if (!is_debug && is_posix &&
      (current_cpu == "arm" || current_cpu == "arm64")) {
    configs -= [ "//build/config/compiler:default_optimization" ]
    configs += [ "//build/config/compiler:optimize_max" ]
  }

  if (use_opus_fixed_point) {
    sources += gypi_values.opus_fixed_sources

    defines += [ "FIXED_POINT" ]

    include_dirs += [ "src/silk/fixed" ]
  } else {
    sources += gypi_values.opus_float_sources

    include_dirs += [ "src/silk/float" ]
  }

  if (use_opus_arm_optimization) {
    sources += [
      "src/celt/arm/fixed_armv4.h",
      "src/celt/arm/fixed_armv5e.h",
      "src/celt/arm/kiss_fft_armv4.h",
      "src/celt/arm/kiss_fft_armv5e.h",
      "src/celt/pitch_arm.h",
      "src/silk/arm/SigProc_FIX_armv4.h",
      "src/silk/arm/SigProc_FIX_armv5e.h",
      "src/silk/arm/macro_armv4.h",
      "src/silk/arm/macro_armv5e.h",
    ]

    defines += [
      "OPUS_ARM_ASM",
      "OPUS_ARM_INLINE_ASM",
      "OPUS_ARM_INLINE_EDSP",
    ]

    if (use_opus_rtcd) {
      sources += [
        "$target_gen_dir/celt_pitch_xcorr_arm_gnu.S",
        "src/celt/arm/arm_celt_map.c",
        "src/celt/arm/armcpu.c",
        "src/celt/arm/armcpu.h",
      ]

      defines += [
        "OPUS_ARM_MAY_HAVE_EDSP",
        "OPUS_ARM_MAY_HAVE_MEDIA",
        "OPUS_ARM_MAY_HAVE_NEON",
        "OPUS_HAVE_RTCD",
      ]

      deps = [
        ":convert_rtcd_assembler",
      ]
    }
  }
}

executable("opus_compare") {
  sources = [
    "src/src/opus_compare.c",
  ]

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

  deps = [
    ":opus",
    "//build/config/sanitizers:deps",
  ]
}

executable("opus_demo") {
  sources = [
    "src/src/opus_demo.c",
  ]

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

  deps = [
    ":opus",
    "//build/config/sanitizers:deps",
  ]
}

test("test_opus_api") {
  sources = [
    "src/tests/test_opus_api.c",
  ]

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

  deps = [
    ":opus",
  ]
}

test("test_opus_encode") {
  sources = [
    "src/tests/test_opus_encode.c",
  ]

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

  deps = [
    ":opus",
  ]
}

test("test_opus_decode") {
  sources = [
    "src/tests/test_opus_decode.c",
  ]

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

  # test_opus_decode passes a null pointer to opus_decode() for an argument
  # marked as requiring a non-null value by the nonnull function attribute,
  # and expects opus_decode() to fail. Disable the -Wnonnull option to avoid
  # a compilation error if -Werror is specified.
  if (is_posix) {
    cflags = [ "-Wno-nonnull" ]
  }

  deps = [
    ":opus",
  ]
}

test("test_opus_padding") {
  sources = [
    "src/tests/test_opus_padding.c",
  ]

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

  deps = [
    ":opus",
  ]
}
