# 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")

source_set("video") {
  # 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",
    "//media/filters",
    "//media/formats",
    "//media/renderers",
  ]

  sources = [
    "gpu_memory_buffer_video_frame_pool.cc",
    "gpu_memory_buffer_video_frame_pool.h",
    "gpu_video_accelerator_factories.cc",
    "gpu_video_accelerator_factories.h",
    "h264_bit_reader.cc",
    "h264_bit_reader.h",
    "h264_level_limits.cc",
    "h264_level_limits.h",
    "h264_parser.cc",
    "h264_parser.h",
    "h264_poc.cc",
    "h264_poc.h",
    "half_float_maker.cc",
    "half_float_maker.h",
    "picture.cc",
    "picture.h",
    "renderable_gpu_memory_buffer_video_frame_pool.cc",
    "renderable_gpu_memory_buffer_video_frame_pool.h",
    "trace_util.cc",
    "trace_util.h",
    "video_decode_accelerator.cc",
    "video_decode_accelerator.h",
    "video_encode_accelerator.cc",
    "video_encode_accelerator.h",
    "video_encode_accelerator_adapter.cc",
    "video_encode_accelerator_adapter.h",
    "video_encoder_fallback.cc",
    "video_encoder_fallback.h",
    "video_encoder_info.cc",
    "video_encoder_info.h",
  ]

  if (enable_platform_hevc) {
    sources += [
      "h265_nalu_parser.cc",
      "h265_nalu_parser.h",
    ]
    if (enable_platform_hevc_decoding) {
      sources += [
        "h265_parser.cc",
        "h265_parser.h",
      ]
    }
  }

  public_deps = [ "//gpu/command_buffer/client:gles2_interface" ]

  deps = [
    "//build:chromeos_buildflags",
    "//gpu/command_buffer/client",
    "//gpu/command_buffer/common",
    "//gpu/ipc/common",
    "//media/base",
    "//third_party/libyuv",
    "//ui/gfx",
    "//ui/gl",
  ]

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

  if (media_use_libvpx) {
    sources += [
      "vpx_video_encoder.cc",
      "vpx_video_encoder.h",
    ]
    deps += [ "//third_party/libvpx" ]
  }

  if (proprietary_codecs && media_use_openh264) {
    sources += [
      "openh264_video_encoder.cc",
      "openh264_video_encoder.h",
    ]
    deps += [ "//third_party/openh264:encoder" ]
  }
}

# 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 = [
    "fake_gpu_memory_buffer.cc",
    "fake_gpu_memory_buffer.h",
    "fake_video_encode_accelerator.cc",
    "fake_video_encode_accelerator.h",
    "mock_gpu_memory_buffer_video_frame_pool.cc",
    "mock_gpu_memory_buffer_video_frame_pool.h",
    "mock_gpu_video_accelerator_factories.cc",
    "mock_gpu_video_accelerator_factories.h",
    "mock_video_decode_accelerator.cc",
    "mock_video_decode_accelerator.h",
    "mock_video_encode_accelerator.cc",
    "mock_video_encode_accelerator.h",
  ]
  configs += [ "//media:media_config" ]
  deps = [
    "//base",
    "//gpu/command_buffer/client:gles2_interface",
    "//gpu/command_buffer/common",
    "//media/base:test_support",
    "//services/viz/public/cpp/gpu",
    "//testing/gmock",
    "//ui/gfx",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "gpu_memory_buffer_video_frame_pool_unittest.cc",
    "h264_bit_reader_unittest.cc",
    "h264_parser_unittest.cc",
    "h264_poc_unittest.cc",
    "half_float_maker_unittest.cc",
    "renderable_gpu_memory_buffer_video_frame_pool_unittest.cc",
    "software_video_encoder_test.cc",
    "video_encode_accelerator_adapter_test.cc",
    "video_encoder_fallback_test.cc",
  ]
  if (enable_platform_hevc) {
    sources += [ "h265_nalu_parser_unittest.cc" ]
    if (enable_platform_hevc_decoding) {
      sources += [ "h265_parser_unittest.cc" ]
    }
  }

  configs += [ "//media:media_config" ]
  deps = [
    "//base",
    "//base/test:test_support",
    "//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:libyuv",
    "//ui/gfx",
  ]
}

fuzzer_test("media_h264_parser_fuzzer") {
  sources = [ "h264_parser_fuzzertest.cc" ]
  deps = [
    "//base",
    "//media",
    "//ui/gfx/geometry",
  ]
}

if (enable_platform_hevc_decoding) {
  fuzzer_test("media_h265_parser_fuzzer") {
    sources = [ "h265_parser_fuzzertest.cc" ]
    deps = [
      "//base",
      "//media",
    ]
  }
}
