# 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/chromecast_build.gni")
import("//build/config/features.gni")
import("//build/config/linux/pkg_config.gni")
import("//build/config/ui.gni")
import("//media/cdm/library_cdm/cdm_paths.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\"",
    "CDM_PLATFORM_SPECIFIC_PATH=\"$cdm_platform_specific_path\"",
    "ENABLE_PLATFORM_AC3_EAC3_AUDIO=$enable_platform_ac3_eac3_audio",
    "ENABLE_CAST_AUDIO_RENDERER=$enable_cast_audio_renderer",
    "ENABLE_CDM_HOST_VERIFICATION=$enable_cdm_host_verification",
    "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id",
    "ENABLE_DAV1D_DECODER=$enable_dav1d_decoder",
    "ENABLE_AV1_DECODER=$enable_av1_decoder",
    "ENABLE_PLATFORM_DOLBY_VISION=$enable_platform_dolby_vision",
    "ENABLE_FFMPEG=$media_use_ffmpeg",
    "ENABLE_FFMPEG_VIDEO_DECODERS=$enable_ffmpeg_video_decoders",
    "ENABLE_PLATFORM_HEVC=$enable_platform_hevc",
    "ENABLE_PLATFORM_HEVC_DECODING=$enable_platform_hevc_decoding",
    "ENABLE_PLATFORM_ENCRYPTED_HEVC=$enable_platform_encrypted_hevc",
    "ENABLE_HLS_SAMPLE_AES=$enable_hls_sample_aes",
    "ENABLE_LIBGAV1_DECODER=$enable_libgav1_decoder",
    "ENABLE_LIBRARY_CDMS=$enable_library_cdms",
    "ENABLE_LIBVPX=$media_use_libvpx",
    "ENABLE_LOGGING_OVERRIDE=$enable_logging_override",
    "ENABLE_MEDIA_DRM_STORAGE=$enable_media_drm_storage",
    "ENABLE_MEDIA_REMOTING=$enable_media_remoting",
    "ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc",
    "ENABLE_OPENH264=$media_use_openh264",
    "ENABLE_PLATFORM_MPEG_H_AUDIO=$enable_platform_mpeg_h_audio",
    "ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser",
    "ENABLE_CAST_STREAMING_RENDERER=$enable_cast_streaming_renderer",
    "USE_CHROMEOS_MEDIA_ACCELERATION=$use_vaapi||$use_v4l2_codec",
    "USE_CHROMEOS_PROTECTED_AV1=$use_chromeos_protected_av1",
    "USE_CHROMEOS_PROTECTED_MEDIA=$use_chromeos_protected_media",
    "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_apple) {
    public_deps += [ "//media/base/mac" ]
  }

  if (use_ozone) {
    deps += [ "//ui/ozone" ]
  }
}

# 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/renderers: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") {
  use_xvfb = use_xvfb_in_this_config

  deps = [
    "//media/audio:unit_tests",
    "//media/base:unit_tests",
    "//media/capabilities:unit_tests",
    "//media/cast/receiver: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/parsers: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/",
    "formats/mp4/h264_annex_b_fuzz_corpus/",
  ]

  data_deps = [ "//testing/buildbot/filters:media_unittests_filters" ]

  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.
      "//gpu/command_buffer/service:android_texture_owner_unittests",
      "//media/base/android:media_java",
      "//media/base/android:unit_tests",
      "//media/gpu:android_video_decode_accelerator_unittests",
      "//ui/android:ui_java",
    ]
  }

  if (is_fuchsia) {
    deps += [
      "//media/fuchsia/audio:unittests",
      "//media/fuchsia/cdm/service:unittests",
    ]

    additional_manifest_fragments = [
      "//build/config/fuchsia/test/audio_capabilities.test-cmx",

      # TODO(crbug.com/1185811): Figure out why
      # PaintCanvasVideoRendererWithGLTest.CopyVideoFrameYUVDataToGLTexture
      # crashes without "deprecated-ambient-replace-as-executable".
      "//build/config/fuchsia/test/jit_capabilities.test-cmx",

      "//build/config/fuchsia/test/vulkan_capabilities.test-cmx",
    ]
  }

  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",
    "base/video_types.cc",
    "base/video_types.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",
    "//build:chromeos_buildflags",
    "//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_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",
    "//base/test:test_support",
  ]
  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",
  ]
}

fuzzer_test("json_web_key_fuzzer") {
  sources = [ "cdm/json_web_key_fuzzer.cc" ]
  deps = [
    ":media",
    "//base",
  ]
}

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