# Copyright 2018 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("//build/components.gni")

declare_args() {
  # Use a prebuilt ffmpeg binary rather than building it locally.  See
  # //src/media/lib/ffmpeg/README.md for details.  This is ignored when
  # building in variant builds for which there is no prebuilt.  In that case,
  # ffmpeg is always built from source so as to be built with the selected
  # variant's config.  When this is false (either explicitly or in a variant
  # build) then //third_party/ffmpeg must be in the source tree, which
  # requires:
  #
  # ```
  # jiri import -name third_party/ffmpeg -revision HEAD third_party/ffmpeg http://fuchsia.googlesource.com/integration
  # ```
  #
  # Or, if already importing a different manifest from there, resulting in
  # errors from jiri update, it can work to just git clone (but jiri update
  # won't manage third_party/ffmpeg in this case):
  #
  # ```
  # mkdir third_party/ffmpeg
  # git clone "https://fuchsia.googlesource.com/third_party/ffmpeg" third_party/ffmpeg
  # ```
  use_prebuilt_ffmpeg = true
}

group("ffmpeg") {
  visibility = [
    "//src/media/codec/codecs/sw/ffmpeg:codec_runner_sw_ffmpeg",
    "//src/media/lib",
    "//src/media/playback/mediaplayer/ffmpeg",
    "//src/media/vnext/lib/ffmpeg",
  ]

  if (use_prebuilt_ffmpeg) {
    public_deps = [ ":prebuilt_ffmpeg($shlib_toolchain)" ]
  } else {
    deps = [ "//third_party/ffmpeg" ]
    public_configs = [ "//third_party/ffmpeg:ffmpeg_dependent_config" ]
  }
}

if (use_prebuilt_ffmpeg) {
  group("prebuilt_ffmpeg") {
    deps = [ ":prebuilt_ffmpeg_shared_library" ]

    public_configs = [ ":prebuilt_ffmpeg_config" ]
  }

  prebuilt_dir = "//prebuilt/third_party/ffmpeg"
  prebuilt_lib_dir = "$prebuilt_dir/arch/$current_cpu/lib"
  prebuilt_include_dir = "$prebuilt_dir/pkg/ffmpeg/include"

  # This file is produced by the ffmpeg prebuilt recipe, defining the list of
  # all the variants for which prebuilt ffmpeg binaries are available.  Each
  # of these corresponds to a subdirectory of $prebuilt_dir containing a
  # libffmpeg.so file.
  forward_variables_from(
      read_file("$prebuilt_dir/prebuilt_variants.json", "json"),
      [ "prebuilt_variants" ])

  # If there is a variant prebuilt, use it from the variant-named subdirectory.
  # Otherwise use the vanilla build in the main directory.
  if (prebuilt_variants + [ toolchain_variant.name ] -
      [ toolchain_variant.name ] != prebuilt_variants) {
    ffmpeg_lib_dir = "$prebuilt_lib_dir/${toolchain_variant.name}/"
  } else {
    ffmpeg_lib_dir = prebuilt_lib_dir
  }

  ffmpeg_so = "$ffmpeg_lib_dir/libffmpeg.so"

  config("prebuilt_ffmpeg_config") {
    visibility = [ ":prebuilt_ffmpeg" ]

    if (current_cpu == "x64") {
      ffmpeg_config = "max"
    } else {
      ffmpeg_config = "default"
    }

    include_dirs = [
      prebuilt_include_dir,
      "$prebuilt_include_dir/fuchsia/config/$ffmpeg_config/$current_cpu",
    ]

    libs = [ ffmpeg_so ]
  }

  resource("prebuilt_ffmpeg_shared_library") {
    sources = [ ffmpeg_so ]
    outputs = [ "lib/${toolchain_variant.libprefix}{{source_file_part}}" ]
  }
}
