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

import("//build/buildflag_header.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")

# Path to platform configuration files.
platform_config_root =
    "chromium/config/$ffmpeg_branding/$os_config/$ffmpeg_arch"

has_nasm_deps =
    ffmpeg_asm_sources != [] &&
    (current_cpu == "x86" || current_cpu == "x64") && os_config != "linux-noasm"
if (has_nasm_deps) {
  import("//third_party/nasm/nasm_assemble.gni")

  # x86inc.asm ignores the PIC flag when compiling for x86 which unfortunately
  # causes text relocations in the object files generated by the assembler. We
  # must disable the warning to allow linking with lld. Unlike gold, ld which
  # will silently allow text relocations, lld support must be explicit.
  #
  # See https://crbug.com/911658#c19 for more information. Tracked upstream at
  # https://trac.ffmpeg.org/ticket/7878
  config("fix_textrels") {
    ldflags = [ "-Wl,-z,notext" ]
  }

  nasm_assemble("ffmpeg_nasm") {
    sources = ffmpeg_asm_sources

    # Ensure the architecture defines go in the command line before the -P
    # file below, so don't use defines.
    nasm_flags = []
    if (current_cpu == "x86") {
      nasm_flags += [ "-DARCH_X86_32" ]
    } else if (current_cpu == "x64") {
      nasm_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 = [
      platform_config_root,
      "libavcodec/x86",
      "libavutil/x86",
      ".",
    ]

    nasm_flags += [
      "-W+error=all",
      "-Wno-macro-params-legacy",
      "-P" + rebase_path("$platform_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" ]
    }

    # See comments on fix_textrels config.
    if (use_lld && current_cpu == "x86" && !is_win) {
      all_dependent_configs = [ ":fix_textrels" ]
    }
  }
}

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

if (is_win) {
  # Stub generator script and signatures of all functions used by Chrome.
  generate_stubs_script = "//tools/generate_stubs/generate_stubs.py"

  # Used by ffmpeg_generate_stubs and ffmpeg_generate_def
  sig_files = [ "chromium/ffmpeg.sigs" ]

  action("ffmpeg_generate_def") {
    script = generate_stubs_script
    sources = sig_files
    outputs = [
      "$target_gen_dir/ffmpeg.def",
    ]
    args = [
             "-i",
             rebase_path(target_out_dir, root_build_dir),
             "-o",
             rebase_path(target_gen_dir, root_build_dir),
             "-t",
             "windows_def",
             "-m",
             "ffmpeg.dll",
           ] + rebase_path(sources, root_build_dir)
  }
}

# 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("ffmpeg_warnings") {
  if (is_clang) {
    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",

      # clock_gettime is marked as 10.12+ in the 10.12 SDK, but ffmpeg does
      # correctly check for that before calling.
      "-Wno-unguarded-availability",

      # 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",

      # utils.c does
      # `return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;`
      # while -Wstring-plus-int wants &FFMPEG_LICENSE[sizeof(LICENSE_PREFIX)-1]
      "-Wno-string-plus-int",

      # video_enc_params.c has a condition that is always false when size_t is
      # 64 bits.
      "-Wno-tautological-constant-out-of-range-compare",
    ]

    if (target_cpu == "arm" || target_cpu == "arm64") {
      # ffmpeg uses ARM instructions that clang deems deprecated.
      cflags += [ "-Wno-inline-asm" ]
    }

    if (is_win) {
      # This corresponds to /wd4273 below.
      cflags += [ "-Wno-inconsistent-dllimport" ]
    }
  }
}

buildflag_header("ffmpeg_features") {
  header = "ffmpeg_features.h"
  flags = [ "USE_SYSTEM_FFMPEG=false" ]
}

if (is_component_ffmpeg) {
  link_target_type = "source_set"
} else {
  # This must be a static_library in non-component builds to avoid pulling
  # in many large global arrays (and associated code) into chrome.dll.
  link_target_type = "static_library"
}
target(link_target_type, "ffmpeg_internal") {
  sources = ffmpeg_c_sources + ffmpeg_gas_sources + [
              "$platform_config_root/config.h",
              "$platform_config_root/libavutil/avconfig.h",
            ]
  include_dirs = [
    platform_config_root,
    ".",
  ]
  defines = [
    "HAVE_AV_CONFIG_H",
    "_POSIX_C_SOURCE=200112",
    "_XOPEN_SOURCE=600",
    "PIC",
    "FFMPEG_CONFIGURATION=NULL",
  ]

  if (is_component_ffmpeg) {
    configs += [ "//build/config/sanitizers:cfi_icall_disable" ]
  }

  # Disable internal ffmpeg logs in the official build; this saves ~158kb.
  if (is_official_build) {
    defines += [ "CHROMIUM_NO_LOGGING" ]
  }

  # So we can append below and assume they're defined.
  cflags = []
  ldflags = []
  libs = []
  deps = [
    ":ffmpeg_features",
    "//third_party/opus",
  ]

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

    # These must be after no_chromium_code for warning flags to be ordered
    # correctly.
    "//build/config/compiler:no_incompatible_pointer_warnings",
    ":ffmpeg_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.Chromium 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.
  configs -= [ "//build/config/compiler:default_optimization" ]
  configs += [ "//build/config/compiler:optimize_max" ]

  if (ffmpeg_use_atomics_fallback) {
    if (is_posix || is_fuchsia) {
      include_dirs += [ "compat/atomics/gcc" ]
    } else if (is_win) {
      include_dirs += [ "compat/atomics/win32" ]
    }
  }

  # On x86, sanitizers will fail to compiler the H264 CABAC code due to
  # insufficient registers unless we disable EBP usage. https://crbug.com/786760
  #
  # Windows builds can't compile without EBP because we can't omit frame
  # pointers like we do on posix.
  if (current_cpu == "x86") {
    if (using_sanitizer || is_win || use_lld) {
      defines += [ "HAVE_EBP_AVAILABLE=0" ]
    } else {
      defines += [ "HAVE_EBP_AVAILABLE=1" ]
    }

    # Despite the name, this isn't fixing any bugs with the linker. It's just
    # preventing ffmpeg from silently emitting text relocations. See discussion
    # https://crbug.com/911658#c19 and https://trac.ffmpeg.org/ticket/7878
    if (use_lld && !is_win) {
      defines += [ "BROKEN_RELOCATIONS=1" ]
    }
  }

  if (is_fuchsia || is_posix) {
    cflags += [
      "-fPIC",

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

    if (!(is_android && use_call_graph)) {
      # Remove default stack frames config so we can force -fomit-frame-pointer.
      configs -= [ "//build/config/compiler:default_stack_frames" ]

      cflags += [
        "-fomit-frame-pointer",
      ]
    }

    if (!is_clang) {
      # gcc doesn't have flags for specific warnings, so disable them
      # all.
      cflags += [ "-w" ]
    }

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

  if (is_fuchsia || (is_posix && !is_mac)) {
    defines += [
      "_ISOC99_SOURCE",
      "_LARGEFILE_SOURCE",
    ]
    cflags += [
      "-std=c99",
      "-pthread",
      "-fno-math-errno",
      "-fno-signed-zeros",
      "-fno-tree-vectorize",
    ]
    ldflags = [
      "-L",
      rebase_path(target_gen_dir, root_build_dir),
    ]
    if (!is_android && !is_fuchsia) {
      # OS=android requires that both -lz and -lm occur after
      # -lc++_shared on the link command line. Android link rules
      # already include -lm, and we get -lz as a transitive dependency
      # of libandroid.so, so simply moving both to the non-Android
      # section solves the problem.
      #
      # The root cause of this problem is certain system libraries
      # (libm starting with MNC and libz before MNC, among others)
      # re-export the libgcc unwinder, and libc++ exports the
      # libc++abi unwinder. As we build against libc++ headers, libc++
      # must be the first in the runtime symbol lookup order (among
      # all unwinder-providing libraries).

      # librt for clock_gettime on precise
      libs += [
        "m",
        "z",
        "rt",
      ]
    }
    if (is_component_ffmpeg) {
      # Export all symbols when building as component.
      configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
      configs += [ "//build/config/gcc:symbol_visibility_default" ]
    }
  }
  if (is_mac) {
    if (is_component_ffmpeg) {
      # Export all symbols when building as component.
      configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
      configs += [ "//build/config/gcc:symbol_visibility_default" ]
    }

    defines += [ "_DARWIN_C_SOURCE" ]
  } else if (is_win) {
    defines += [
      "_ISOC99_SOURCE",
      "_LARGEFILE_SOURCE",
      "HAVE_AV_CONFIG_H",
    ]

    if (is_component_ffmpeg) {
      # Required to avoid 4049 and 4217 errors around redundant imports.
      cflags += [
        "/FIcompat/msvcrt/snprintf.h",
        "/FIcompat/msvcrt/strtod.h",
      ]
    }

    # TODO(dalecurtis): We should fix these.  http://crbug.com/154421
    cflags += [
      "/wd4996",  # 'function': was declared deprecated
      "/wd4018",  # 'expression': signed/unsigned mismatch
      "/wd4090",  # 'operation' : different 'modifier' qualifiers
      "/wd4305",  # 'identifier': truncation from 'type1' to 'type2'
      "/wd4133",  # 'type' : incompatible types - from 'type1' to 'type2'
      "/wd4146",  # unary minus operator applied to unsigned type, result
                  #   still unsigned

      "/wd4554",  # 'operator' : check operator precedence for possible
                  #   error; use parentheses to clarify precedence

      "/wd4028",  # formal parameter 'number' different from declaration
      "/wd4334",  # 'operator' : result of 32-bit shift implicitly
                  #   converted to 64 bits (was 64-bit shift intended?)

      "/wd4101",  # 'identifier' : unreferenced local variable
      "/wd4102",  # 'label' : unreferenced label
      "/wd4116",  # unnamed type definition in parentheses
      "/wd4307",  # 'operator' : integral constant overflow
      "/wd4273",  # 'function' : inconsistent DLL linkage
      "/wd4005",  # 'identifier' : macro redefinition
      "/wd4056",  # overflow in floating point constant arithmetic
      "/wd4756",  # overflow in constant arithmetic
    ]
    if (current_cpu == "x64") {
      # TODO(wolenetz): We should fix this.  http://crbug.com/171009
      cflags += [ "/wd4267" ]  # Conversion from size_t to 'type'.
    }
  }

  if (has_nasm_deps) {
    deps += [ ":ffmpeg_nasm" ]
  }
}

if (is_component_ffmpeg) {
  shared_library("ffmpeg") {
    if (is_android) {
      configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
    }
    public_configs = [ ":ffmpeg_dependent_config" ]
    deps = [
      ":ffmpeg_internal",
    ]

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

    if (is_fuchsia || (is_posix && !is_mac)) {
      # Fixes warnings PIC relocation when building as component.
      ldflags += [
        "-Wl,-Bsymbolic",
        "-L",
        rebase_path(target_gen_dir, root_build_dir),
      ]
    } else if (is_win) {
      # Windows component build needs the .def file to export ffmpeg symbols.
      deps += [ ":ffmpeg_generate_def" ]
      sources = [
        "$target_gen_dir/ffmpeg.def",
      ]
    }

    if (is_mac && !is_component_build) {
      ldflags += [ "-Wl,-install_name,@rpath/libffmpeg.dylib" ]
    }
  }
} else {
  source_set("ffmpeg") {
    public_configs = [ ":ffmpeg_dependent_config" ]
    deps = [
      ":ffmpeg_internal",
    ]
  }
}
