blob: 3574b2aa056d690e7fd2d46be75ced1cb8fd98ea [file] [log] [blame]
# 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
}
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_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" ]
}