# Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("../../../webrtc.gni")

rtc_library("scalability_mode_util") {
  sources = [
    "scalability_mode_util.cc",
    "scalability_mode_util.h",
  ]
  deps = [
    "../../../api/video_codecs:scalability_mode",
    "../../../api/video_codecs:video_codecs_api",
    "../../../rtc_base:checks",
    "../../../rtc_base/system:rtc_export",
    "//third_party/abseil-cpp/absl/algorithm:container",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}

rtc_library("scalable_video_controller") {
  sources = [
    "scalable_video_controller.h",
    "scalable_video_controller_no_layering.cc",
    "scalable_video_controller_no_layering.h",
  ]
  deps = [
    "../../../api/transport/rtp:dependency_descriptor",
    "../../../api/video:video_bitrate_allocation",
    "../../../api/video:video_codec_constants",
    "../../../common_video/generic_frame_descriptor",
    "../../../rtc_base:checks",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
  ]
}

rtc_library("scalability_structures") {
  sources = [
    "create_scalability_structure.cc",
    "create_scalability_structure.h",
    "scalability_structure_full_svc.cc",
    "scalability_structure_full_svc.h",
    "scalability_structure_key_svc.cc",
    "scalability_structure_key_svc.h",
    "scalability_structure_l2t2_key_shift.cc",
    "scalability_structure_l2t2_key_shift.h",
    "scalability_structure_simulcast.cc",
    "scalability_structure_simulcast.h",
  ]
  deps = [
    ":scalable_video_controller",
    "../../../api/transport/rtp:dependency_descriptor",
    "../../../api/video:video_bitrate_allocation",
    "../../../api/video_codecs:scalability_mode",
    "../../../common_video/generic_frame_descriptor",
    "../../../rtc_base:checks",
    "../../../rtc_base:logging",
    "../../../rtc_base/system:rtc_export",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}

rtc_library("svc_rate_allocator") {
  sources = [
    "svc_rate_allocator.cc",
    "svc_rate_allocator.h",
  ]
  deps = [
    ":scalability_structures",
    ":scalable_video_controller",
    "../../../api:field_trials_view",
    "../../../api/units:data_rate",
    "../../../api/video:video_bitrate_allocation",
    "../../../api/video:video_bitrate_allocator",
    "../../../api/video:video_codec_constants",
    "../../../api/video:video_frame",
    "../../../api/video_codecs:scalability_mode",
    "../../../api/video_codecs:video_codecs_api",
    "../../../rtc_base:checks",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
  ]
}

rtc_library("simulcast_to_svc_converter") {
  sources = [
    "simulcast_to_svc_converter.cc",
    "simulcast_to_svc_converter.h",
  ]
  deps = [
    ":scalability_mode_util",
    ":scalability_structures",
    ":scalable_video_controller",
    "..:codec_globals_headers",
    "../../../api/video:encoded_image",
    "../../../api/video:video_bitrate_allocation",
    "../../../api/video_codecs:scalability_mode",
    "../../../api/video_codecs:video_codecs_api",
    "../../../modules/video_coding:video_codec_interface",
    "../../../modules/video_coding:video_coding_utility",
    "../../../rtc_base:checks",
    "../../../rtc_base/system:rtc_export",
  ]
}

if (rtc_include_tests) {
  rtc_library("scalability_structure_tests") {
    testonly = true
    sources = [
      "scalability_mode_util_unittest.cc",
      "scalability_structure_full_svc_unittest.cc",
      "scalability_structure_key_svc_unittest.cc",
      "scalability_structure_l2t2_key_shift_unittest.cc",
      "scalability_structure_test_helpers.cc",
      "scalability_structure_test_helpers.h",
      "scalability_structure_unittest.cc",
    ]
    deps = [
      ":scalability_mode_util",
      ":scalability_structures",
      ":scalable_video_controller",
      ":simulcast_to_svc_converter",
      "..:chain_diff_calculator",
      "..:frame_dependencies_calculator",
      "../../../api:array_view",
      "../../../api/transport/rtp:dependency_descriptor",
      "../../../api/video:video_bitrate_allocation",
      "../../../api/video:video_frame_type",
      "../../../api/video_codecs:scalability_mode",
      "../../../common_video/generic_frame_descriptor",
      "../../../rtc_base:checks",
      "../../../rtc_base:stringutils",
      "../../../test:test_support",
      "//third_party/abseil-cpp/absl/strings:string_view",
    ]
  }

  rtc_library("svc_rate_allocator_tests") {
    testonly = true
    sources = [ "svc_rate_allocator_unittest.cc" ]
    deps = [
      ":svc_rate_allocator",
      "..:webrtc_vp9_helpers",
      "../../../api:field_trials",
      "../../../api/units:data_rate",
      "../../../api/video:video_bitrate_allocation",
      "../../../api/video:video_bitrate_allocator",
      "../../../api/video:video_codec_constants",
      "../../../api/video:video_frame",
      "../../../api/video_codecs:scalability_mode",
      "../../../api/video_codecs:video_codecs_api",
      "../../../rtc_base:checks",
      "../../../test:create_test_field_trials",
      "../../../test:test_support",
      "../codecs/av1:av1_svc_config",
      "//third_party/abseil-cpp/absl/container:inlined_vector",
    ]
  }

  rtc_library("simulcast_to_svc_converter_tests") {
    testonly = true
    sources = [ "simulcast_to_svc_converter_unittest.cc" ]
    deps = [
      ":scalability_structures",
      ":scalable_video_controller",
      ":simulcast_to_svc_converter",
      "..:video_codec_interface",
      "../../../api/video:encoded_image",
      "../../../api/video:video_bitrate_allocation",
      "../../../api/video:video_frame",
      "../../../api/video_codecs:scalability_mode",
      "../../../api/video_codecs:video_codecs_api",
      "../../../rtc_base:checks",
      "../../../test:test_support",
    ]
  }
}
