# 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.

source_set("renderers") {
  # 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" ]

  sources = [
    "audio_renderer_impl.cc",
    "audio_renderer_impl.h",
    "decrypting_renderer.cc",
    "decrypting_renderer.h",
    "decrypting_renderer_factory.cc",
    "decrypting_renderer_factory.h",
    "default_decoder_factory.cc",
    "default_decoder_factory.h",
    "default_renderer_factory.cc",
    "default_renderer_factory.h",
    "paint_canvas_video_renderer.cc",
    "paint_canvas_video_renderer.h",
    "remote_playback_client_wrapper.h",
    "renderer_impl.cc",
    "renderer_impl.h",
    "video_frame_rgba_to_yuva_converter.cc",
    "video_frame_rgba_to_yuva_converter.h",
    "video_frame_yuv_converter.cc",
    "video_frame_yuv_converter.h",
    "video_frame_yuv_mailboxes_holder.cc",
    "video_frame_yuv_mailboxes_holder.h",
    "video_overlay_factory.cc",
    "video_overlay_factory.h",
    "video_renderer_impl.cc",
    "video_renderer_impl.h",
    "video_resource_updater.cc",
    "video_resource_updater.h",
  ]

  deps = [
    "//base",
    "//cc/base",  # For MathUtil.
    "//cc/paint",
    "//components/viz/client",
    "//components/viz/common",
    "//gpu/command_buffer/client:gles2_interface",
    "//gpu/command_buffer/client:raster_interface",
    "//gpu/command_buffer/common",
    "//media:media_buildflags",
    "//media/audio",
    "//media/base",
    "//media/filters",
    "//media/video",
    "//third_party/libyuv",
    "//ui/gfx:memory_buffer",
    "//ui/gfx/geometry",
    "//ui/gfx/geometry:geometry_skia",
    "//ui/gl",
  ]

  if (is_win) {
    sources += [
      "win/media_engine_extension.cc",
      "win/media_engine_extension.h",
      "win/media_engine_notify_impl.cc",
      "win/media_engine_notify_impl.h",
      "win/media_foundation_audio_stream.cc",
      "win/media_foundation_audio_stream.h",
      "win/media_foundation_protection_manager.cc",
      "win/media_foundation_protection_manager.h",
      "win/media_foundation_renderer.cc",
      "win/media_foundation_renderer.h",
      "win/media_foundation_renderer_extension.h",
      "win/media_foundation_source_wrapper.cc",
      "win/media_foundation_source_wrapper.h",
      "win/media_foundation_stream_wrapper.cc",
      "win/media_foundation_stream_wrapper.h",
      "win/media_foundation_video_stream.cc",
      "win/media_foundation_video_stream.h",
    ]

    deps += [ "//media/base/win:media_foundation_util" ]

    # media_foundation_renderer uses Windows D3D and Media Foundation APIs.
    libs = [
      "d3d11.lib",
      "mfplat.lib",
    ]
  }

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

# Note: This is a roll-up only target; do not expand the visibility. DEPS should
# depend on the //media:test_support target instead.
static_library("test_support") {
  visibility = [ "//media:test_support" ]
  testonly = true
  sources = [
    "shared_image_video_frame_test_utils.cc",
    "shared_image_video_frame_test_utils.h",
  ]
  configs += [ "//media:media_config" ]
  deps = [
    "//base",
    "//components/viz/common",
    "//gpu:test_support",
    "//gpu/command_buffer/client:gles2_interface",
    "//gpu/command_buffer/common",
    "//media/base:test_support",
    "//ui/gfx",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "audio_renderer_impl_unittest.cc",
    "decrypting_renderer_unittest.cc",
    "paint_canvas_video_renderer_unittest.cc",
    "renderer_impl_unittest.cc",
    "video_renderer_impl_unittest.cc",
    "video_resource_updater_unittest.cc",
  ]
  configs += [ "//media:media_config" ]
  deps = [
    "//base",
    "//base/test:test_support",
    "//cc/paint",
    "//components/viz/client",
    "//components/viz/test:test_support",
    "//gpu:test_support",
    "//gpu/command_buffer/client:gles2_interface",
    "//gpu/command_buffer/common",
    "//media:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/libyuv",
    "//ui/gfx",
    "//ui/gl",
    "//ui/gl:test_support",
  ]

  if (is_win) {
    sources += [
      "win/media_foundation_renderer_integration_test.cc",
      "win/media_foundation_renderer_unittest.cc",
    ]
    deps += [ "//media/test:pipeline_integration_test_base" ]
    libs = [
      "mfuuid.lib",  # For MFMediaType_Video etc
    ]
  }
}
