# 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", "-Wno-pointer-bool-conversion" ]
  }
}

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" ]
  }
}
