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

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

has_yasm_deps = ffmpeg_yasm_sources != [] && (current_cpu == "x86" || current_cpu == "x64") && os_config != "linux-noasm"
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 = [
      platform_config_root,
      "libavcodec/x86",
      "libavutil/x86",
      ".",
    ]

    # Disable warnings, prevents log spam for things we won't fix.
    yasm_flags += [
      "-w",
      "-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_compile.gypi for Windows, but not Mac.
      defines += [ "PREFIX" ]
    }
  }
}

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 = [
  # TODO(ajwong): This was -i <(INTERMEDIATE_DIR). What next?
      "-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("ffmpegsumo_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",
      # 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",
    ]
    if (is_win) {
      # This corresponds to /wd4273 below.
      cflags += [ "-Wno-inconsistent-dllimport" ]
    }
  }
}

config("ffmpeg_fuchsia_warnings") {
  cflags = []
  if (is_clang) {
    cflags += [ "-Wno-sign-compare", "-Wno-missing-field-initializers" ]
  }
}

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",
    # Disable deprecated features that generate spammy warnings.
    # ffmpeg.gyp & media/ffmpeg/ffmpeg_common.h must be kept in sync.
    "FF_API_CONVERGENCE_DURATION=0",
    # Upstream libavcodec/utils.c still uses the deprecated
    # av_dup_packet(), causing deprecation warnings.
    # The normal fix for such things is to disable the feature as below,
    # but the upstream code does not yet compile with it disabled.
    # (In this case, the fix is replacing the call with a new function.)
    # In the meantime, we directly disable those warnings in the C file.
    # "FF_API_AVPACKET_OLD_API=0",
  ]

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

  if (target_os != "fuchsia") {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      # This must be after no_chromium_code for warning flags to be ordered
      # correctly.
      "//build/config/compiler:no_incompatible_pointer_warnings",
    ]
  } else {
    configs += [":ffmpeg_fuchsia_warnings"]
  }

  configs += [
    # This must be after no_chromium_code for warning flags to be ordered
    # correctly.
    ":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.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.
  if (target_os != "fuchsia") {
    configs -= [ "//build/config/compiler:default_optimization" ]
    if (is_win) {
      # Setting the optimizations to 'speed' or to 'max' on Windows results in
      # a lot of unresolved symbols. The only supported mode is 'size' (see
      # crbug.com/264459).
      #
      # FFMmpeg require dead code elimination to be available in all build modes
      # and thus doesn't support wpo.
      configs += [ "//build/config/compiler:optimize_no_wpo" ]

      # /analyze must be disabled for ffmpeg because of an internal compiler
      # error in VS 2015 Update 1, fixed in Update 2.
      # https://connect.microsoft.com/VisualStudio/feedback/details/2299303
      configs -= [ "//build/config/win:vs_code_analysis" ]
    } else {
      configs += [ "//build/config/compiler:optimize_max" ]
    }
  } else if (is_debug) {
    # For fuchsia debug, we want to optimize ffmpeg as explained above
    configs -= [ "//build/config:debug" ]
    configs += [ "//build/config:release" ]
  }

  if (is_posix) {
    cflags += [
      "-fPIC",
      "-fomit-frame-pointer",
      # ffmpeg uses its own deprecated functions.
      "-Wno-deprecated-declarations",
    ]

    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_clang) {
        # TODO(hans) Enable integrated-as (crbug.com/124610).
        asmflags += [ "-fno-integrated-as" ]
        if (is_android) {
          import("//build/config/android/config.gni")
          rebased_android_toolchain_root =
              rebase_path(android_toolchain_root, root_build_dir)
          # Else /usr/bin/as gets picked up.
          asmflags += [ "-B${rebased_android_toolchain_root}/bin" ]
        }
      }
    }
  }

  if (is_posix && !is_mac) {
    defines += [
      "_ISOC99_SOURCE",
      "_LARGEFILE_SOURCE",
      # BUG(ihf): ffmpeg compiles with this define. But according to
      # ajwong: I wouldn't change _FILE_OFFSET_BITS.  That's a scary change
      # cause it affects the default length of off_t, and fpos_t,
      # which can cause strange problems if the loading code doesn't
      # have it set and you start passing FILE*s or file descriptors
      # between symbol contexts.
      # "_FILE_OFFSET_BITS=64",
    ]
    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 (!is_android) {
      # 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" ]
    }
    # TODO(ajwong): How to handle openbsd? Especially w/o the is_posix?
    #      if (is_openbsd) {
    #       # OpenBSD's gcc (4.2.1) does not support this flag
    #       cflags -= [ "-fno-signed-zeros" ]
    #      }
  }
  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) {
    import("//build/config/win/visual_studio_version.gni")

    if ((visual_studio_version == "2013") || (visual_studio_version == "2013e")) {
      defines += [
        # VS 2015 supports these natively so they cannot be #defines.
        "inline=__inline",
        "strtoll=_strtoi64",
        "strtod=avpriv_strtod",
        "snprintf=avpriv_snprintf",
        "vsnprintf=avpriv_vsnprintf",
        # This leads to duplicate avpriv_snprintf definitions due to inline
        # _snprintf in VC++ 2015 stdio.h.
        "_snprintf=avpriv_snprintf",
      ]
    }
    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_yasm_deps) {
    deps += [ ":ffmpeg_yasm" ]
  }
}

if (is_component_ffmpeg) {
  shared_library("ffmpeg") {
    public_configs = [ ":ffmpeg_dependent_config" ]
    deps = [ ":ffmpeg_internal" ]

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

    if (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" ]
    }
  }
} else {
  source_set("ffmpeg") {
    public_configs = [ ":ffmpeg_dependent_config" ]
    deps = [ ":ffmpeg_internal" ]
  }
}
