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

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

  # Use low-memory buffers on non-Android builds of Chromecast.
  use_low_memory_buffer = is_chromecast && !is_android

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

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

  # TODO(GYP): This should be a platform define.
  is_openbsd = false
}

# 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.
  if (is_posix && !is_android && !is_mac) {
    use_alsa = true

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

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

  # Enable the TestMojoMediaClient to be used in MojoMediaApplication. This is
  # for testing only and will override the default platform MojoMediaClient.
  enable_test_mojo_media_client = false
}

# Use a second 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 = []

  # The process to host the mojo media application.
  # Valid options are:
  # - "none": Do not use mojo media application.
  # - "browser": Use mojo media application hosted in the browser process.
  # - "gpu": Use mojo media application hosted in the gpu process.
  # - "utility": Use mojo media application hosted in the utility process.
  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_android) {
      mojo_media_services = [
        "cdm",
        "audio_decoder",
      ]
      mojo_media_host = "gpu"
    } else if (is_chromecast) {
      mojo_media_services = [
        "cdm",
        "renderer",
      ]
      mojo_media_host = "browser"
    } else {
      mojo_media_services = [ "cdm" ]
      mojo_media_host = "utility"
    }
  }
}
