# 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_source_set("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",
    "//third_party/abseil-cpp/absl/algorithm:container",
    "//third_party/abseil-cpp/absl/strings:string_view",
  ]
}

rtc_source_set("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",
    "../../../common_video/generic_frame_descriptor",
    "../../../rtc_base:checks",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
  ]
}

rtc_source_set("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_source_set("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",
    "../../../rtc_base/experiments:stable_target_rate_experiment",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
  ]
}

rtc_source_set("simulcast_to_svc_converter") {
  sources = [
    "simulcast_to_svc_converter.cc",
    "simulcast_to_svc_converter.h",
  ]
  deps = [
    ":scalability_mode_util",
    ":scalability_structures",
    ":scalable_video_controller",
    "../../../api/video:encoded_image",
    "../../../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_source_set("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:stringutils",
      "../../../test:test_support",
      "//third_party/abseil-cpp/absl/strings:string_view",
    ]
  }

  rtc_source_set("svc_rate_allocator_tests") {
    testonly = true
    sources = [ "svc_rate_allocator_unittest.cc" ]
    deps = [
      ":svc_rate_allocator",
      "..:webrtc_vp9_helpers",
      "../../../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:explicit_key_value_config",
      "../../../test:test_support",
      "../codecs/av1:av1_svc_config",
      "//third_party/abseil-cpp/absl/container:inlined_vector",
    ]
  }

  rtc_source_set("simulcast_to_svc_converter_tests") {
    testonly = true
    sources = [ "simulcast_to_svc_converter_unittest.cc" ]
    deps = [
      ":scalability_structures",
      ":scalable_video_controller",
      ":simulcast_to_svc_converter",
      "../../../rtc_base:checks",
      "../../../test:test_support",
    ]
  }
}
