# 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_IAMF_AUDIO=$enable_platform_iamf_audio",
    "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",
    ]
  }
}
