| # 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/buildflag_header.gni") |
| import("//build/config/android/config.gni") |
| import("//build/config/arm.gni") |
| import("//build/config/features.gni") |
| import("//build/config/linux/pkg_config.gni") |
| import("//build/config/ui.gni") |
| import("//media/media_options.gni") |
| import("//testing/libfuzzer/fuzzer_test.gni") |
| import("//testing/test.gni") |
| import("//third_party/ffmpeg/ffmpeg_options.gni") |
| |
| buildflag_header("media_buildflags") { |
| header = "media_buildflags.h" |
| |
| flags = [ |
| "ALTERNATE_CDM_STORAGE_ID_KEY=$alternate_cdm_storage_id_key", |
| "ENABLE_AC3_EAC3_AUDIO_DEMUXING=$enable_ac3_eac3_audio_demuxing", |
| "ENABLE_CBCS_ENCRYPTION_SCHEME=$enable_cbcs_encryption_scheme", |
| "ENABLE_CDM_HOST_VERIFICATION=$enable_cdm_host_verification", |
| "ENABLE_HEVC_DEMUXING=$enable_hevc_demuxing", |
| "ENABLE_DOLBY_VISION_DEMUXING=$enable_dolby_vision_demuxing", |
| "ENABLE_FFMPEG=$media_use_ffmpeg", |
| "ENABLE_FFMPEG_VIDEO_DECODERS=$enable_ffmpeg_video_decoders", |
| "ENABLE_HLS_SAMPLE_AES=$enable_hls_sample_aes", |
| "ENABLE_LIBRARY_CDMS=$enable_library_cdms", |
| "ENABLE_LIBVPX=$media_use_libvpx", |
| "ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser", |
| "ENABLE_MPEG_H_AUDIO_DEMUXING=$enable_mpeg_h_audio_demuxing", |
| "ENABLE_RUNTIME_MEDIA_RENDERER_SELECTION=$enable_runtime_media_renderer_selection", |
| "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id", |
| "ENABLE_MEDIA_REMOTING=$enable_media_remoting", |
| "ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc", |
| "USE_PROPRIETARY_CODECS=$proprietary_codecs", |
| ] |
| } |
| |
| if (proprietary_codecs && media_use_ffmpeg) { |
| assert( |
| ffmpeg_branding != "Chromium", |
| "proprietary codecs and ffmpeg_branding set to Chromium are incompatible") |
| } |
| |
| # Common configuration for targets in the media directory; these must not be |
| # exported since things like USE_NEON and USE_CRAS have different meanings |
| # elsewhere in the code base. |
| config("media_config") { |
| defines = [] |
| if (current_cpu == "arm64" || (current_cpu == "arm" && arm_use_neon)) { |
| defines += [ "USE_NEON" ] |
| } |
| if (use_pulseaudio) { |
| defines += [ "USE_PULSEAUDIO" ] |
| if (!link_pulseaudio) { |
| defines += [ "DLOPEN_PULSEAUDIO" ] |
| } |
| } |
| if (use_cras) { |
| defines += [ "USE_CRAS" ] |
| } |
| } |
| |
| # Internal grouping of the configs necessary to support sub-folders having their |
| # own BUILD.gn files; only targets which roll up into the "media" target should |
| # include this config. I.e., not "test_support" or "unit_tests" targets. |
| # |
| # Without these configs having individual sub-folders take a //media/base DEP |
| # (or others) can yield incorrectly imported and exported symbols on Windows: |
| # |
| # fatal error LNK1169: one or more multiply defined symbols found. |
| # |
| config("subcomponent_config") { |
| visibility = media_subcomponent_deps |
| if (is_mac) { |
| visibility += [ "//media/base/mac" ] |
| } |
| defines = [ "IS_MEDIA_IMPL" ] |
| configs = [ |
| ":media_config", |
| "//build/config/compiler:wexit_time_destructors", |
| ] |
| } |
| |
| component("media") { |
| libs = [] |
| |
| deps = [ |
| "//base", |
| "//base:i18n", |
| "//base/third_party/dynamic_annotations", |
| "//cc/paint", |
| "//crypto:platform", |
| "//gpu/command_buffer/client:gles2_interface", |
| "//gpu/command_buffer/common", |
| "//third_party/libyuv", |
| "//ui/events:events_base", |
| "//ui/gfx", |
| "//ui/gfx/geometry", |
| "//ui/gl:gl", |
| "//url", |
| ] |
| |
| public_configs = [ "//third_party/libwebm:libwebm_config" ] |
| public_deps = media_subcomponent_deps |
| public_deps += [ |
| ":media_buildflags", |
| ":shared_memory_support", |
| "//ui/gfx:color_space", |
| ] |
| |
| # This must be included here since it actually depends on //media/base. |
| if (is_mac || is_ios) { |
| public_deps += [ "//media/base/mac" ] |
| } |
| } |
| |
| # Note: This can't be a static_library since it does not have any sources. |
| source_set("test_support") { |
| testonly = true |
| public_deps = [ |
| ":media", |
| "//media/audio:test_support", |
| "//media/base:test_support", |
| "//media/base/android:test_support", |
| "//media/filters:test_support", |
| "//media/formats:test_support", |
| "//media/gpu:test_support", |
| "//media/video:test_support", |
| ] |
| } |
| |
| # Contains tests for all targets in the "media" folder. |
| # TODO(xhwang): Move mojo/capture/remoting tests here where applicable. |
| test("media_unittests") { |
| deps = [ |
| "//media/audio:unit_tests", |
| "//media/base:unit_tests", |
| "//media/capabilities:unit_tests", |
| "//media/cdm:unit_tests", |
| "//media/device_monitors:unit_tests", |
| "//media/filters:unit_tests", |
| "//media/formats:unit_tests", |
| "//media/gpu:unit_tests", |
| "//media/learning:unit_tests", |
| "//media/mojo:unit_tests", |
| "//media/muxers:unit_tests", |
| "//media/renderers:unit_tests", |
| "//media/test:pipeline_integration_tests", |
| "//media/test:run_all_unittests", |
| "//media/video:unit_tests", |
| "//media/webrtc:unit_tests", |
| ] |
| |
| data = [ |
| "test/data/", |
| ] |
| |
| data_deps = [] |
| |
| if (media_use_ffmpeg) { |
| deps += [ "//media/ffmpeg:unit_tests" ] |
| } |
| |
| if (is_android) { |
| deps += [ |
| # The test needs the java dependencies to add the java classes for their |
| # native counterparts to the test apk. |
| "//media/base/android:media_java", |
| "//media/base/android:unit_tests", |
| "//media/gpu:android_video_decode_accelerator_unittests", |
| "//ui/android:ui_java", |
| ] |
| } |
| |
| if (enable_media_remoting) { |
| deps += [ "//media/remoting:media_remoting_tests" ] |
| } |
| |
| # The test needs OPUS_FIXED_POINT conditional define. |
| configs += [ "//third_party/opus:opus_config" ] |
| } |
| |
| test("media_perftests") { |
| configs += [ ":media_config" ] |
| deps = [ |
| ":test_support", |
| "//base/test:test_support", |
| "//media/base:perftests", |
| "//media/filters:perftests", |
| "//media/test:pipeline_integration_perftests", |
| "//testing/gmock", |
| "//testing/gtest", |
| "//testing/perf", |
| "//third_party/widevine/cdm:headers", |
| "//ui/gfx:test_support", |
| ] |
| if (media_use_ffmpeg) { |
| # Direct dependency required to inherit config. |
| deps += [ "//third_party/ffmpeg" ] |
| } |
| |
| # This target should not require the Chrome executable to run. |
| assert_no_deps = [ "//chrome" ] |
| |
| data = [ |
| "test/data/", |
| ] |
| |
| data_deps = [ |
| # Needed for isolate script to execute. |
| "//testing:run_perf_test", |
| ] |
| } |
| |
| # The audio subset of media_unittests. This target exists for running only the |
| # audio tests on the GPU bots (which have audio hardware). |
| test("audio_unittests") { |
| deps = [ |
| ":test_support", |
| "//base/test:test_support", |
| "//media/audio:unit_tests", |
| "//media/test:run_all_unittests", |
| ] |
| if (is_android) { |
| deps += [ |
| # The test needs the java dependencies to add the java classes for their |
| # native counterparts to the test apk. |
| "//media/base/android:media_java", |
| "//ui/android:ui_java", |
| ] |
| } |
| } |
| |
| # Note: Most external components should just depend on //media unless they |
| # specifically need this pared own target (NaCl, PPAPI, etc). Internal targets |
| # should just depend on //media/base which will propagate this target to them. |
| component("shared_memory_support") { |
| sources = [ |
| "base/audio_bus.cc", |
| "base/audio_bus.h", |
| "base/audio_latency.cc", |
| "base/audio_latency.h", |
| "base/audio_parameters.cc", |
| "base/audio_parameters.h", |
| "base/audio_point.cc", |
| "base/audio_point.h", |
| "base/audio_sample_types.h", |
| "base/channel_layout.cc", |
| "base/channel_layout.h", |
| "base/limits.h", |
| "base/media_shmem_export.h", |
| "base/sample_format.cc", |
| "base/sample_format.h", |
| "base/vector_math.cc", |
| "base/vector_math.h", |
| "base/vector_math_testing.h", |
| ] |
| if (is_mac) { |
| # These need to be included here because audio_latency.cc depends on them. |
| sources += [ |
| "base/mac/audio_latency_mac.cc", |
| "base/mac/audio_latency_mac.h", |
| ] |
| } |
| |
| # Do not use "subcomponent_config" here since these files are in their own |
| # component target and thus can't share the standard export macros. |
| configs += [ ":media_config" ] |
| defines = [ "MEDIA_SHMEM_IMPLEMENTATION" ] |
| |
| if (!is_debug) { |
| configs -= [ "//build/config/compiler:default_optimization" ] |
| configs += [ "//build/config/compiler:optimize_max" ] |
| } |
| deps = [ |
| "//base", |
| "//ui/gfx/geometry", |
| ] |
| } |
| |
| # TODO(watk): Refactor tests that could be made to run on Android. See |
| # http://crbug.com/570762 |
| if (media_use_ffmpeg && !is_android) { |
| test("ffmpeg_regression_tests") { |
| configs += [ "//media:media_config" ] |
| |
| deps = [ |
| ":test_support", |
| "//base/test:test_support", |
| "//media/ffmpeg:ffmpeg_regression_tests", |
| "//media/test:pipeline_integration_tests", |
| "//media/test:run_all_unittests", |
| "//testing/gmock", |
| "//testing/gtest", |
| "//ui/gfx:test_support", |
| "//ui/gfx/geometry", |
| ] |
| } |
| } |
| |
| if (proprietary_codecs) { |
| fuzzer_test("media_cenc_utils_fuzzer") { |
| sources = [ |
| "cdm/cenc_utils_fuzzertest.cc", |
| ] |
| deps = [ |
| ":media", |
| ] |
| } |
| } |
| |
| fuzzer_test("media_vp8_parser_fuzzer") { |
| sources = [ |
| "filters/vp8_parser_fuzzertest.cc", |
| ] |
| deps = [ |
| ":test_support", |
| "//base", |
| ] |
| libfuzzer_options = [ "max_len = 400000" ] |
| dict = "test/vp8.dict" |
| } |
| |
| fuzzer_test("media_vp9_parser_fuzzer") { |
| sources = [ |
| "filters/vp9_parser_fuzzertest.cc", |
| ] |
| deps = [ |
| ":test_support", |
| "//base", |
| ] |
| libfuzzer_options = [ "max_len = 400000" ] |
| } |
| |
| fuzzer_test("media_vp9_parser_encrypted_fuzzer") { |
| sources = [ |
| "filters/vp9_parser_encrypted_fuzzertest.cc", |
| ] |
| deps = [ |
| ":test_support", |
| "//base", |
| "//base/test:test_support", |
| ] |
| seed_corpus = "//media/test/data" |
| } |
| |
| fuzzer_test("media_vpx_video_decoder_fuzzer") { |
| sources = [ |
| "filters/vpx_video_decoder_fuzzertest.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| ] |
| libfuzzer_options = [ "max_len = 400000" ] |
| seed_corpus = "//media/test/data" |
| } |
| |
| fuzzer_test("media_webm_muxer_fuzzer") { |
| sources = [ |
| "muxers/webm_muxer_fuzzertest.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| "//third_party/libwebm", |
| ] |
| } |
| |
| fuzzer_test("cbcs_decryptor_fuzzer") { |
| sources = [ |
| "cdm/cbcs_decryptor_fuzzer.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| "//crypto", |
| ] |
| } |
| |
| fuzzer_test("cenc_decryptor_fuzzer") { |
| sources = [ |
| "cdm/cenc_decryptor_fuzzer.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| "//crypto", |
| ] |
| } |
| |
| if (proprietary_codecs) { |
| fuzzer_test("media_mp4_avcc_parser_fuzzer") { |
| sources = [ |
| "formats/mp4/mp4_avcc_parser_fuzzer.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| ] |
| } |
| |
| fuzzer_test("media_mp4_box_reader_fuzzer") { |
| sources = [ |
| "formats/mp4/mp4_box_reader_fuzzer.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| ] |
| libfuzzer_options = [ "max_len=500" ] |
| dict = "test/mp4.dict" |
| } |
| } |
| |
| if (enable_mse_mpeg2ts_stream_parser) { |
| fuzzer_test("media_es_parser_adts_fuzzer") { |
| sources = [ |
| "formats/mp2t/es_parser_adts_fuzzer.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| ] |
| } |
| |
| fuzzer_test("media_es_parser_h264_fuzzer") { |
| sources = [ |
| "formats/mp2t/es_parser_h264_fuzzer.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| ] |
| } |
| |
| fuzzer_test("media_es_parser_mpeg1audio_fuzzer") { |
| sources = [ |
| "formats/mp2t/es_parser_mpeg1audio_fuzzer.cc", |
| ] |
| deps = [ |
| ":media", |
| "//base", |
| ] |
| } |
| } |