# 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("//build/config/chrome_build.gni")
import("//build/config/chromecast_build.gni")
import("//build/config/features.gni")
import("//testing/libfuzzer/fuzzer_test.gni")

# Do not expand this list without double-checking with OWNERS, this is a list of
# all targets which roll up into the //media component. It controls visibility
# of subcomponent targets and public_deps for //media.
media_subcomponent_deps = [
  "//media/audio",
  "//media/base",

  # TODO(crbug.com/583067): These files should not be in //media/base.
  "//media/base/android",
  "//media/capabilities",
  "//media/cdm",
  "//media/device_monitors",
  "//media/filters",
  "//media/formats",
  "//media/muxers",
  "//media/renderers",
  "//media/video",
]

declare_args() {
  # Allows distributions to link pulseaudio directly (DT_NEEDED) instead of
  # using dlopen. This helps with automated detection of ABI mismatches and
  # prevents silent errors.
  link_pulseaudio = false

  # Enable usage of FFmpeg within the media library. Used for most software
  # based decoding, demuxing, and sometimes optimized FFTs. If disabled,
  # implementors must provide their own demuxers and decoders.
  media_use_ffmpeg = true

  # Enable usage of libvpx within the media library. Used for software based
  # decoding of VP9 and VP8A type content.
  media_use_libvpx = true

  # iOS doesn't use ffmpeg, libvpx.
  if (is_ios) {
    media_use_ffmpeg = false
    media_use_libvpx = false
  }

  # Override to dynamically link the cras (ChromeOS audio) library.
  use_cras = false

  # Enables AC3/EAC3 audio demuxing. This is enabled only on Chromecast, since
  # it only provides demuxing, and is only useful for AC3/EAC3 audio
  # pass-through to HDMI sink on Chromecast.
  enable_ac3_eac3_audio_demuxing = proprietary_codecs && is_chromecast

  enable_mpeg_h_audio_demuxing = proprietary_codecs && is_chromecast

  enable_mse_mpeg2ts_stream_parser =
      proprietary_codecs && (is_chromecast || use_fuzzing_engine)

  # Enable parsing for the 'cbcs' encryption scheme added by MPEG Common
  # Encryption 3rd Edition (ISO/IEC 23001-7), published 02/15/2016.
  enable_cbcs_encryption_scheme = is_chromecast || is_mac || is_win || is_linux

  # Enable HEVC/H265 demuxing. Actual decoding must be provided by the
  # platform. Enable by default for Chromecast.
  enable_hevc_demuxing = proprietary_codecs && is_chromecast

  # Enable Dolby Vision demuxing. Enable by default for Chromecast. Actual
  # decoding must be provided by the platform. Note some Dolby Vision profiles
  # which are encoded using HEVC require |enable_hevc_demuxing| to be enabled.
  enable_dolby_vision_demuxing = proprietary_codecs && is_chromecast

  # Enable HLS with SAMPLE-AES decryption.
  enable_hls_sample_aes = proprietary_codecs && is_chromecast

  # If true, use cast CMA backend instead of default chromium media pipeline.
  is_cast_using_cma_backend = is_cast_audio_only || !is_android
}

# enable_hls_sample_aes can only be true if enable_mse_mpeg2ts_stream_parser is.
assert(enable_mse_mpeg2ts_stream_parser || !enable_hls_sample_aes)

if (media_use_ffmpeg) {
  media_subcomponent_deps += [ "//media/ffmpeg" ]
}

# Use a second declare_args() to pick up possible overrides of |use_cras|.
declare_args() {
  # Enables runtime selection of PulseAudio library.
  use_pulseaudio = false

  # Enables runtime selection of ALSA library for audio.
  use_alsa = false

  # Alsa should be used on non-Android, non-Mac POSIX systems.
  # Alsa should be used on desktop Chromecast and audio-only Chromecast builds.
  if (is_posix && !is_android && !is_mac &&
      (!is_chromecast || is_cast_desktop_build || is_cast_audio_only)) {
    use_alsa = true

    # Pulse is not supported on Chromecast platforms.
    if (!use_cras && !is_chromecast) {
      use_pulseaudio = true
    }
  }
}

# Use another declare_args() to pick up possible overrides of media_use_ffmpeg
# from --args command line flags. See "gn help declare_args".
declare_args() {
  # On Android, FFMpeg is built without video decoders by default.
  # This flag gives the option to override that decision in case there are no
  # hardware decoders. To do so, you will also need to update ffmpeg build files
  # in order to define which decoders to build in.
  enable_ffmpeg_video_decoders = media_use_ffmpeg && !is_android
}

# Enables the use of library CDMs that implements the interface defined at
# media/cdm/api/content_decryption_module.h. If true, the actually library CDM
# will be hosted in the mojo CDM service running in the CDM (utility) process.
enable_library_cdms = (is_linux && !is_chromecast) || is_mac || is_win

declare_args() {
  # Experiment to enable mojo media services (e.g. "renderer", "cdm", see
  # |mojo_media_services|). When enabled, selected mojo paths will be enabled in
  # the media pipeline and corresponding services will hosted in the selected
  # remote process (e.g. "utility" process, see |mojo_media_host|).
  enable_mojo_media =
      is_android || is_chromecast || is_mac || enable_library_cdms || is_win

  # Enable the TestMojoMediaClient to be used in mojo MediaService. This is for
  # testing only and will override the default platform MojoMediaClient, if any.
  enable_test_mojo_media_client = false

  # When enabled, this feature allows developers to use a runtime flag to
  # choose the implementation of the renderer that is used. On a build which
  # enables the mojo renderer, if --disable-mojo-renderer is passed at start-up,
  # the "default" renderer will be used instead. Both renderer implementations
  # will be linked if this feature is enabled, increasing the binary size. This
  # feature does not make sense if the mojo renderer is not enabled.
  enable_runtime_media_renderer_selection = is_cast_desktop_build

  # Enables host verification for CDMs.
  # Windows and Mac.
  enable_cdm_host_verification =
      enable_library_cdms && (is_mac || is_win) && is_chrome_branded

  # Enable Storage ID which is used by CDMs. This is only available with chrome
  # branding, but may be overridden by other embedders.
  enable_cdm_storage_id = enable_library_cdms && is_chrome_branded &&
                          (is_win || is_mac || is_chromeos)

  # If |enable_cdm_storage_id| is set, then an implementation specific key
  # must also be provided. It can be provided by defining CDM_STORAGE_ID_KEY
  # (which takes precedence), or by setting |alternate_cdm_storage_id_key|.
  # The key must be a string of at least 32 characters.
  alternate_cdm_storage_id_key = ""
}

# This feature can only be enabled when using Mojo media. Furthermore, the
# "renderer" service must be enabled, which is asserted in
# //media/mojo/services/BUILD.gn
assert(
    !enable_runtime_media_renderer_selection || enable_mojo_media,
    "Runtime media renderer selection only applies when mojo media is enabled.")

assert(!enable_cdm_host_verification || is_mac || is_win,
       "CDM host verification is only supported on Mac and Windows.")

_default_mojo_media_services = []
_default_mojo_media_host = "none"

# Default mojo_media_services and mojo_media_host on various platforms.
# Can be overridden by gn build arguments from the --args command line flag
# for local testing.
if (enable_mojo_media) {
  if (is_chromecast && is_cast_using_cma_backend && !is_android) {
    _default_mojo_media_services = [
      "cdm",
      "renderer",
    ]
    _default_mojo_media_host = "browser"
  } else if (is_android) {
    # Both chrome for Android and cast for Android belongs to this case
    _default_mojo_media_services = [
      "cdm",
      "audio_decoder",
      "video_decoder",
    ]
    _default_mojo_media_host = "gpu"
  } else if (is_mac || is_win) {
    _default_mojo_media_services = [ "video_decoder" ]
    _default_mojo_media_host = "gpu"
  }

  if (enable_library_cdms) {
    _default_mojo_media_services += [ "cdm" ]

    # Having a CDM running means it could require a CdmProxy running in the GPU
    # process.
    assert(
        _default_mojo_media_host == "none" || _default_mojo_media_host == "gpu",
        "For now, mojo_media_host should not overwrite it with a different " +
            "value if it has been set.")
    _default_mojo_media_host = "gpu"
  }
}

# Use another declare_args() to pick up possible overrides of enable_mojo_media
# from --args command line flags. See "gn help declare_args".
declare_args() {
  # A list of mojo media services that should be used in the media pipeline.
  # Must not be empty if |enable_mojo_media| is true.
  # Valid entries in the list are:
  # - "renderer": Use mojo-based media Renderer service.
  # - "cdm": Use mojo-based Content Decryption Module.
  # - "audio_decoder": Use mojo-based audio decoder in the default media
  #                    Renderer. Cannot be used with the mojo Renderer above.
  # - "video_decoder": Use mojo-based video decoder in the default media
  #                    Renderer. Cannot be used with the mojo Renderer above.
  mojo_media_services = _default_mojo_media_services

  # The process that the mojo MediaService runs in. By default, all services
  # registered in |mojo_media_services| are hosted in the MediaService, with the
  # exception that when |enable_library_cdms| is true, the "cdm" service will
  # run in a separate CdmService in the CDM (utility) process, while other
  # |mojo_media_services| still run in the MediaService in the process specified
  # by "mojo_media_host".
  # Valid options are:
  # - "none": Do not use mojo media service.
  # - "browser": Use mojo media service hosted in the browser process.
  # - "gpu": Use mojo media service hosted in the gpu process.
  # - "utility": Use mojo media service hosted in the utility process.
  mojo_media_host = _default_mojo_media_host
}

declare_args() {
  # This switch defines whether the Media Remoting implementation will be built.
  # When enabled, media is allowed to be renderer and played back on remote
  # devices when the tab is being casted and other conditions are met.
  enable_media_remoting = !is_chromecast && !is_ios
}

declare_args() {
  # Media Remoting RPC is disabled on Android since it's unused but increases
  # the native binary size by ~70Kb.
  enable_media_remoting_rpc = enable_media_remoting && !is_android
}
