# 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/chromeos/args.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/features.gni")
import("//media/gpu/args.gni")
import("//testing/libfuzzer/fuzzer_test.gni")
import("//third_party/libgav1/options.gni")

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
  }

  # Enable usage of OpenH264 within the media library. Used for software based
  # encoding of H264 content.
  media_use_openh264 = true
  if (is_ios || is_android || !proprietary_codecs) {
    media_use_openh264 = false
  }

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

  # 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_platform_ac3_eac3_audio = proprietary_codecs && is_chromecast

  enable_platform_mpeg_h_audio = proprietary_codecs && is_chromecast

  enable_mse_mpeg2ts_stream_parser =
      proprietary_codecs && (is_chromecast || is_fuchsia || use_fuzzing_engine)

  enable_platform_encrypted_hevc =
      proprietary_codecs &&
      (use_chromeos_protected_media || (is_win && is_chrome_branded))

  # 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_platform_hevc| to be enabled.
  enable_platform_dolby_vision = proprietary_codecs && is_chromecast

  # Enable HLS with SAMPLE-AES decryption.
  enable_hls_sample_aes = proprietary_codecs && (is_chromecast || is_fuchsia)

  # Enable logging override, e.g. enable DVLOGs through level 2 at build time.
  # On Chromecast, these are logged as INFO.
  # On Fuchsia, these are logged as VLOGs.
  enable_logging_override = is_chromecast || is_fuchsia

  enable_dav1d_decoder = !is_ios

  # Enable browser managed persistent metadata storage for EME persistent
  # session and persistent usage record session.
  enable_media_drm_storage = is_android || is_chromecast

  # Enable HLS manifest parser and demuxer.
  enable_hls_demuxer = false
}

declare_args() {
  enable_av1_decoder = enable_dav1d_decoder || enable_libgav1_decoder

  # Enable HEVC/H265 demuxing. Actual decoding must be provided by the
  # platform. Enabled by default for Chromecast, fuzzer builds and protected
  # video on ChromeOS and Windows.
  enable_platform_hevc =
      proprietary_codecs &&
      (is_chromecast || use_fuzzing_engine || enable_platform_encrypted_hevc)

  # Enable HEVC/H265 decoding with hardware acceleration assist. Enabled by
  # default for fuzzer builds and protected video on ChromeOS. It is also
  # enabled for Chromecast by default so the unit tests get run in Chrome CQ.
  enable_platform_hevc_decoding =
      proprietary_codecs &&
      (is_chromecast || use_fuzzing_engine || use_chromeos_protected_media)
}

assert(
    !enable_hls_sample_aes || enable_mse_mpeg2ts_stream_parser,
    "enable_mse_mpeg2ts_stream_parser=true is required for enable_hls_sample_aes=true.")

assert(
    !enable_hls_demuxer || enable_mse_mpeg2ts_stream_parser,
    "enable_mse_mpeg2ts_stream_parser=true is required for enable_hls_demuxer=true.")

assert(!enable_platform_hevc || proprietary_codecs,
       "proprietary_codecs=true is required for enable_platform_hevc=true.")

assert(
    !enable_platform_encrypted_hevc || enable_platform_hevc,
    "enable_platform_hevc=true is required for enable_platform_encrypted_hevc=true.")

# 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.
    #
    # ASAN and TSAN will occasionally hang during pa_context_connect(), so we
    # disable PulseAudio when these configurations are enabled.
    #
    # TODO(crbug.com/986021): We shouldn't have to do this, but it's unclear why
    # our test bots are hanging and all of the ones that don't hang just fall
    # back to ALSA after a connection error anyways.
    if (!use_cras && !is_chromecast && !is_asan && !is_tsan) {
      use_pulseaudio = true
    }
  }
}

# Use another declare_args() to include possible overrides of media_use_ffmpeg
# from --args command line flags in the evaluation. 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
}

declare_args() {
  # 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_chromeos_lacros ||
                        is_chromeos_ash || is_mac || is_win
}

declare_args() {
  # 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 = ""
}

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

# Default |mojo_media_services| and |mojo_media_host| on various platforms. See
# comments below for valid values. Can be overridden by gn build arguments from
# the --args command line flag.
_default_mojo_media_services = []
_default_mojo_media_host = ""

if (is_chromecast) {
  _default_mojo_media_services = cast_mojo_media_services
  _default_mojo_media_host = cast_mojo_media_host
} else if (is_android) {
  _default_mojo_media_services = [
    "cdm",
    "audio_decoder",
    "video_decoder",
  ]
  _default_mojo_media_host = "gpu"
} else if (is_chromeos_ash || is_mac || is_win ||
           ((is_linux || is_chromeos_lacros) && use_vaapi)) {
  _default_mojo_media_services = [ "video_decoder" ]
  _default_mojo_media_host = "gpu"
}

# When |enable_library_cdms| is true, the "cdm" service will run in a separate
# CdmService in the CDM (utility) process. Therefore there's no need to specify
# |_default_mojo_media_host| which controls where the MediaService runs in.
if (enable_library_cdms) {
  _default_mojo_media_services += [ "cdm" ]
}

declare_args() {
  # A list of mojo media services that should be used in the media pipeline.
  # 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:
  # - "browser": Use mojo media service hosted in the browser process.
  # - "gpu": Use mojo media service hosted in the gpu process.
  # - "": Do not use mojo media service.
  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
}

declare_args() {
  # Enable use of libcast (//third_party/openscreen/src/cast) for cast mirroring
  # and linked into the resulting binary.
  enable_cast_streaming_renderer = false
}

assert(!enable_cast_streaming_renderer || is_chromecast,
       "Currently, libcast mirroring is only supported for chromecast.")

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

if (is_fuchsia) {
  media_subcomponent_deps += [
    "//media/fuchsia/audio",
    "//media/fuchsia/cdm",
    "//media/fuchsia/common",
  ]
}

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

if (enable_library_cdms || is_win) {
  media_subcomponent_deps += [ "//media/cdm:cdm_type_conversion" ]
}
