# Copyright 2019 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/features.gni")
import("//build/config/ui.gni")
import("//media/gpu/args.gni")
import("//media/media_options.gni")
import("//ui/gl/features.gni")

assert(is_mac)

import("//build/config/mac/mac_sdk.gni")

source_set("mac") {
  defines = [ "MEDIA_GPU_IMPLEMENTATION" ]
  visibility = [ "//media/gpu" ]

  sources = [
    "vp9_super_frame_bitstream_filter.cc",
    "vp9_super_frame_bitstream_filter.h",
    "vt_config_util.h",
    "vt_config_util.mm",
    "vt_video_decode_accelerator_mac.cc",
    "vt_video_decode_accelerator_mac.h",
    "vt_video_encode_accelerator_mac.cc",
    "vt_video_encode_accelerator_mac.h",
  ]
  public_deps = [ "//third_party/webrtc_overrides:webrtc_component" ]
  frameworks = [
    "CoreFoundation.framework",
    "CoreMedia.framework",
    "Foundation.framework",
    "IOSurface.framework",
    "QuartzCore.framework",
    "VideoToolbox.framework",
  ]
  deps = [
    "//base",
    "//components/crash/core/common:crash_key",
    "//gpu/command_buffer/service:gles2",
    "//gpu/ipc/service",
    "//media",
    "//media/gpu:common",
    "//ui/gfx/geometry",
    "//ui/gl",
  ]
}

source_set("unit_tests") {
  testonly = true
  frameworks = [
    "CoreFoundation.framework",
    "CoreMedia.framework",
  ]
  deps = [
    "//media:test_support",
    "//media/gpu:test_support",
    "//testing/gtest",
  ]

  if (media_use_ffmpeg) {
    deps += [ "//third_party/ffmpeg" ]
  }

  sources = [
    "vp9_super_frame_bitstream_filter_unittest.cc",
    "vt_config_util_unittest.cc",
  ]
}
