# Copyright 2017 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("//media/media_options.gni")

if (enable_library_cdms) {
  source_set("cdm_api") {
    sources = [
      "api/content_decryption_module.h",
    ]
  }
}

source_set("cdm") {
  # Do not expand the visibility here without double-checking with OWNERS, this
  # is a roll-up target which is part of the //media component. Most other DEPs
  # should be using //media and not directly DEP this roll-up target.
  visibility = [
    "//media",

    # TODO(crbug.com/583067): These files should not be in //media/base.
    "//media/base/android",

    "//media/filters",
  ]

  sources = [
    "aes_cbc_crypto.cc",
    "aes_cbc_crypto.h",
    "aes_decryptor.cc",
    "aes_decryptor.h",
    "cbcs_decryptor.cc",
    "cbcs_decryptor.h",
    "cdm_context_ref_impl.cc",
    "cdm_context_ref_impl.h",
    "cenc_decryptor.cc",
    "cenc_decryptor.h",

    # TODO(crbug.com/676224): Move this to |enable_library_cdms| block below
    # when EnabledIf attribute is supported in mojom.
    "cdm_proxy.cc",
    "cdm_proxy.h",
    "cdm_proxy_context.cc",
    "cdm_proxy_context.h",
    "cenc_utils.cc",
    "cenc_utils.h",
    "default_cdm_factory.cc",
    "default_cdm_factory.h",
    "json_web_key.cc",
    "json_web_key.h",
    "player_tracker_impl.cc",
    "player_tracker_impl.h",
  ]

  # TODO(crbug.com/167187): Fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  deps = [
    "//crypto",
    "//media/base",
    "//media/formats",
    "//third_party/boringssl",
    "//ui/gfx/geometry",
    "//url",
  ]

  configs += [ "//media:subcomponent_config" ]

  if (enable_library_cdms) {
    deps += [
      ":cdm_api",
      ":cdm_paths",
      "//components/crash/core/common:crash_key",
    ]
    sources += [
      "cdm_adapter.cc",
      "cdm_adapter.h",
      "cdm_adapter_factory.cc",
      "cdm_adapter_factory.h",
      "cdm_allocator.cc",
      "cdm_allocator.h",
      "cdm_auxiliary_helper.cc",
      "cdm_auxiliary_helper.h",
      "cdm_helpers.cc",
      "cdm_helpers.h",
      "cdm_module.cc",
      "cdm_module.h",
      "cdm_type_conversion.cc",
      "cdm_type_conversion.h",
      "cdm_wrapper.h",
      "output_protection.h",
      "platform_verification.h",
      "supported_cdm_versions.cc",
      "supported_cdm_versions.h",
    ]

    if (enable_cdm_host_verification) {
      sources += [
        "cdm_host_file.cc",
        "cdm_host_file.h",
        "cdm_host_files.cc",
        "cdm_host_files.h",
      ]
    }
  }
}

config("cdm_manager_implementation") {
  defines = [ "CDM_MANAGER_IMPLEMENTATION" ]
}

# cdm_manager must not be a source_set() because CdmManager exposes a static
# singleton, shared by multiple component()s.
#
# TODO(xhwang): Remove this component once AVDA no longer depends on it.
component("cdm_manager") {
  visibility = [
    "//media/gpu",
    "//media/mojo/services",
  ]
  sources = [
    "cdm_manager.cc",
    "cdm_manager.h",
    "cdm_manager_export.h",
  ]
  configs += [ ":cdm_manager_implementation" ]
  deps = [
    "//base",
    "//media",
  ]
}

static_library("cdm_paths") {
  sources = [
    "cdm_paths.cc",
    "cdm_paths.h",
  ]
  deps = [
    "//base",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "aes_cbc_crypto_unittest.cc",
    "aes_decryptor_unittest.cc",
    "cbcs_decryptor_unittest.cc",
    "cenc_decryptor_unittest.cc",
    "json_web_key_unittest.cc",
  ]

  deps = [
    "//base/test:test_support",
    "//crypto",
    "//media:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/boringssl",
    "//ui/gfx:test_support",
    "//url",
  ]

  configs += [
    # TODO(crbug.com/167187): Fix size_t to int truncations.
    "//build/config/compiler:no_size_t_to_int_warning",
    "//media:media_config",
  ]

  data_deps = []

  if (enable_library_cdms) {
    sources += [
      "cdm_adapter_unittest.cc",
      "external_clear_key_test_helper.cc",
      "external_clear_key_test_helper.h",
      "mock_helpers.cc",
      "mock_helpers.h",
      "simple_cdm_allocator.cc",
      "simple_cdm_allocator.h",
      "simple_cdm_allocator_unittest.cc",
      "simple_cdm_buffer.cc",
      "simple_cdm_buffer.h",
    ]
    data_deps += [ "//media/cdm/library_cdm/clear_key_cdm" ]

    deps += [
      ":cdm_api",
      ":cdm_paths",
      "//media/cdm/library_cdm:cdm_host_proxy",
      "//media/cdm/library_cdm:test_support",
    ]
  }

  if (proprietary_codecs) {
    sources += [ "cenc_utils_unittest.cc" ]
  }
}
