# Copyright 2017 The Fuchsia 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("ffmpeg_options.gni")
import("ffmpeg_generated.gni")

# Path to configuration files.
ffmpeg_config_root = "fuchsia/config/$ffmpeg_profile/$current_cpu"

has_yasm_deps = ffmpeg_yasm_sources != [] && current_cpu == "x64"
if (has_yasm_deps) {
  import("//third_party/yasm/yasm_assemble.gni")
  yasm_assemble("ffmpeg_yasm") {
    sources = ffmpeg_yasm_sources

    # Ensure the architecture defines go in the command line before the -P
    # file below, so don't use defines.
    yasm_flags = []
    if (current_cpu == "x86") {
      yasm_flags += [ "-DARCH_X86_32" ]
    } else if (current_cpu == "x64") {
      yasm_flags += [ "-DARCH_X86_64" ]
    }

    inputs = [
      # Sets visibility hidden for cglobal functions. Explicitly included
      # to avoid overlooking changes to this file in incremental builds.
      "libavutil/x86/x86inc.asm",
    ]

    defines = [ "PIC" ]
    include_dirs = [
      ffmpeg_config_root,
      "libavcodec/x86",
      "libavutil/x86",
      ".",
    ]

    # Disable warnings, prevents log spam for things we won't fix.
    yasm_flags += [
      "-w",
      "-P",
      rebase_path("$ffmpeg_config_root/config.asm", root_build_dir),
    ]

    if (is_mac) {
      # Necessary to ensure symbols end up with a _ prefix; added by
      # yasm_assemble.gni for Windows, but not Mac.
      defines += [ "PREFIX" ]
    }
  }
}

config("ffmpeg_dependent_config") {
  include_dirs = [
    ffmpeg_config_root,
    ".",
  ]
}

# gn orders flags on a target before flags from configs. The default config
# adds -Wall, and these flags have to be after -Wall -- so they need to come
# from a config and can't be on the target directly.
config("ffmpegsumo_warnings") {
  cflags = [
    "-Wno-absolute-value",

    # ffmpeg uses its own deprecated functions.
    "-Wno-deprecated-declarations",

    # ffmpeg doesn't care about pointer constness.
    "-Wno-incompatible-pointer-types",

    # ffmpeg doesn't follow usual parentheses conventions.
    "-Wno-logical-op-parentheses",

    # ffmpeg doesn't care about pointer signedness.
    "-Wno-parentheses",

    # ffmpeg doesn't care about pointer signedness.
    "-Wno-pointer-sign",

    # ffmpeg doesn't believe in exhaustive switch statements.
    "-Wno-switch",

    # matroskadec.c has a "failed:" label that's only used if some
    # CONFIG_ flags we don't set are set.
    "-Wno-unused-label",

    # ffmpeg has a lot of unused variables.
    "-Wno-unused-variable",

    # This fires on `av_assert0(!"valid element size")` in utils.c
    "-Wno-string-conversion",

    # This fires on `pos_min` and `pos_max` in
    # autorename_libavformat_utils.c
    "-Wno-sometimes-uninitialized",

    # ffmpeg contains static functions in header files, which lead
    # to unused function warnings. There are a few legit unused
    # functions too.
    "-Wno-unused-function",

    # vp3data.h's vp31_inter_dequant stores '128' in an int8_t array.
    "-Wno-constant-conversion",
  ]
}

config("ffmpeg_warnings") {
  cflags = [
    "-Wno-sign-compare",
    "-Wno-missing-field-initializers",
    "-Wno-pointer-bool-conversion"
  ]
}

source_set("ffmpeg_internal") {
  sources = ffmpeg_c_sources + ffmpeg_gas_sources + [
              "$ffmpeg_config_root/config.h",
              "$ffmpeg_config_root/libavutil/avconfig.h",
            ]
  include_dirs = [
    ffmpeg_config_root,
    ".",
  ]
  defines = [
    "HAVE_AV_CONFIG_H",
    "_POSIX_C_SOURCE=200112",
    "_XOPEN_SOURCE=600",
    "PIC",

    # Disable deprecated features that generate spammy warnings.
    "FF_API_CONVERGENCE_DURATION=0",

    # Upstream libavcodec/utils.c still uses the deprecated
    # av_dup_packet(), avcodec_encode_{audio,video}2(), and
    # libavformat/utils.c still accesses the deprecated AVStream.codec,
    # causing deprecation warnings.
    # The normal fix for such things is to disable the features like setting
    # "FF_API_AVPACKET_OLD_API=0", but the upstream code does not yet compile
    # with it disabled (in the case of av_dup_packet()), and has no FF_API*
    # gate for avcodec_encode_{audio,video}2() or AVStream.codec.  In the
    # meantime, we directly disable those warnings locally in the C files.
  ]

  # So we can append below and assume they're defined.
  cflags = []
  ldflags = []
  libs = []
  deps = []

  configs += [
    ":ffmpeg_warnings",
    ":ffmpegsumo_warnings",
  ]

  # Since we are not often debugging FFmpeg, and performance is
  # unacceptable without optimization, freeze the optimizations to -O2.
  # If someone really wants -O1 , they can change these in their checkout.
  # If you want -O0, see the Gotchas in README.fuchsia for why that
  # won't work.
  #
  # In addition to the above reasons, /Od optimization won't remove symbols
  # that are under "if (0)" style sections.  Which lead to link time errors
  # when for example it tries to link an ARM symbol on X86.
  if (is_debug) {
    configs -= [ "//build/config:debug" ]
    configs += [ "//build/config:release" ]
  }

  cflags += [
    # ffmpeg uses its own deprecated functions.
    "-Wno-deprecated-declarations",
  ]

  if (current_cpu == "arm64") {
    asmflags = []
    if (arm_float_abi == "hard") {
      asmflags += [ "-DHAVE_VFP_ARGS=1" ]
    } else {
      asmflags += [ "-DHAVE_VFP_ARGS=0" ]
    }
  }

  defines += [
    "_ISOC99_SOURCE",
    "_LARGEFILE_SOURCE",
  ]

  cflags += [
    "-std=c99",
    "-pthread",
    "-fno-math-errno",
    "-fno-signed-zeros",
    "-fno-tree-vectorize",
    "-fomit-frame-pointer",
  ]
  ldflags = [
    "-L",
    rebase_path(target_gen_dir, root_build_dir),
  ]

  if (has_yasm_deps) {
    deps += [ ":ffmpeg_yasm" ]
  }
}

shared_library("ffmpeg") {
  public_configs = [ ":ffmpeg_dependent_config" ]
  deps = [
    ":ffmpeg_internal",
  ]
}
