# Copyright 2018 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/config/chromeos/ui_mode.gni")
import("//build/config/ui.gni")
import("//media/gpu/args.gni")

source_set("helpers") {
  testonly = true
  sources = [
    "image.cc",
    "image.h",
    "image_quality_metrics.cc",
    "image_quality_metrics.h",
    "video.cc",
    "video.h",
    "video_frame_helpers.cc",
    "video_frame_helpers.h",
  ]
  deps = [
    "//base:base",
    "//base/test:test_config",
    "//base/test:test_support",
    "//gpu/ipc/common",
    "//media:test_support",
    "//media/gpu",
    "//third_party/ffmpeg",
    "//third_party/libyuv",
  ]
  public_deps = [ "//testing/gtest" ]
}

source_set("frame_validator") {
  testonly = true
  sources = [
    "video_frame_validator.cc",
    "video_frame_validator.h",
  ]
  deps = [
    ":helpers",
    ":test_helpers",
    "//build:chromeos_buildflags",
    "//media/gpu",
  ]
}

source_set("frame_file_writer") {
  testonly = true
  sources = [
    "video_frame_file_writer.cc",
    "video_frame_file_writer.h",
  ]
  deps = [
    ":helpers",
    "//build:chromeos_buildflags",
    "//media/gpu",
    "//ui/gfx/codec:codec",
  ]
}

source_set("test_helpers") {
  testonly = true
  sources = [
    "video_test_helpers.cc",
    "video_test_helpers.h",
  ]
  public_deps = [
    ":helpers",
    "//media:test_support",
  ]
  deps = [
    "//media/gpu",
    "//media/mojo/common:mojo_shared_buffer_video_frame",
    "//media/parsers",
    "//mojo/public/cpp/system",
    "//testing/gtest",
    "//third_party/libyuv",
  ]
  if (use_ozone) {
    deps += [ "//ui/ozone" ]
  }
}

static_library("video_player_thumbnail_renderer") {
  testonly = true
  sources = [
    "video_player/frame_renderer.h",
    "video_player/frame_renderer_thumbnail.cc",
    "video_player/frame_renderer_thumbnail.h",
  ]
  deps = [
    ":test_helpers",
    "//gpu/command_buffer/common",
    "//media/gpu",
    "//ui/gfx/codec:codec",
    "//ui/gl:gl",
    "//ui/gl/init:init",
  ]
}

static_library("video_player") {
  testonly = true
  sources = [
    "video_player/frame_renderer.h",
    "video_player/frame_renderer_dummy.cc",
    "video_player/frame_renderer_dummy.h",
    "video_player/test_vda_video_decoder.cc",
    "video_player/test_vda_video_decoder.h",
    "video_player/video_decoder_client.cc",
    "video_player/video_decoder_client.h",
    "video_player/video_player.cc",
    "video_player/video_player.h",
  ]
  deps = [
    ":test_helpers",
    "//media/gpu",
    "//testing/gtest:gtest",
  ]
}

static_library("video_test_environment") {
  testonly = true
  sources = [
    "video_test_environment.cc",
    "video_test_environment.h",
  ]

  deps = [
    ":helpers",
    "//base:base",
    "//base/test:test_support",
    "//media:test_support",
    "//media/gpu",
    "//mojo/core/embedder:embedder",
  ]

  public_deps = [
    ":frame_file_writer",
    "//testing/gtest",
  ]
  if (use_ozone) {
    public_deps += [ "//ui/ozone" ]
  }
}

static_library("video_player_test_environment") {
  testonly = true
  sources = [
    "video_player/video_player_test_environment.cc",
    "video_player/video_player_test_environment.h",
  ]
  data = [ "//media/test/data/" ]
  deps = [
    ":frame_file_writer",
    ":helpers",
    ":video_player",
    ":video_test_environment",
    "//build:chromeos_buildflags",
    "//media/gpu",
  ]
}

static_library("video_encoder") {
  testonly = true
  sources = [
    "bitstream_helpers.cc",
    "bitstream_helpers.h",
    "video_encoder/bitstream_file_writer.cc",
    "video_encoder/bitstream_file_writer.h",
    "video_encoder/bitstream_validator.cc",
    "video_encoder/bitstream_validator.h",
    "video_encoder/decoder_buffer_validator.cc",
    "video_encoder/decoder_buffer_validator.h",
    "video_encoder/video_encoder.cc",
    "video_encoder/video_encoder.h",
    "video_encoder/video_encoder_client.cc",
    "video_encoder/video_encoder_client.h",
  ]
  deps = [
    ":test_helpers",
    "//media/gpu",
    "//media/parsers",
    "//testing/gtest:gtest",
  ]
}

static_library("video_encoder_test_environment") {
  testonly = true
  sources = [
    "video_encoder/video_encoder_test_environment.cc",
    "video_encoder/video_encoder_test_environment.h",
  ]
  data = [ "//media/test/data/" ]
  public_deps = [
    ":helpers",
    ":video_test_environment",
  ]
  deps = [
    "//base:base",
    "//build:chromeos_buildflags",
    "//media/gpu",
  ]
}

if (use_vaapi || use_v4l2_codec) {
  static_library("image_processor") {
    testonly = true
    sources = [
      "image_processor/image_processor_client.cc",
      "image_processor/image_processor_client.h",
    ]
    deps = [
      ":helpers",
      "//build:chromeos_buildflags",
      "//media:test_support",
      "//media/gpu",
      "//media/gpu/chromeos",
      "//testing/gtest",
      "//third_party/libyuv",
    ]
    data = [ "//media/test/data/" ]
  }
}

if (is_chromeos_ash) {
  static_library("local_gpu_memory_buffer_manager") {
    testonly = true
    sources = [
      "local_gpu_memory_buffer_manager.cc",
      "local_gpu_memory_buffer_manager.h",
    ]
    deps = [
      "//base",
      "//build/config/linux/libdrm",
      "//gpu/command_buffer/client",
      "//third_party/minigbm",
      "//ui/gfx:memory_buffer",
      "//ui/gfx/geometry",
    ]
  }
}
