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