# Copyright (c) 2023 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")

if (!build_with_chromium) {
  group("dvqa") {
    testonly = true

    deps = [ ":pausable_state" ]
  }

  if (rtc_include_tests) {
    group("dvqa_unittests") {
      testonly = true

      deps = [ ":pausable_state_test" ]
    }
  }
}

# These targets contains implementation details of DefaultVideoQualityAnalyzer,
# so headers exported by it shouldn't be used in other places.

rtc_library("pausable_state") {
  visibility = [
    ":dvqa",
    ":pausable_state_test",
    "..:default_video_quality_analyzer_internal",
  ]

  testonly = true
  sources = [
    "pausable_state.cc",
    "pausable_state.h",
  ]

  deps = [
    "../../../../../../api/units:time_delta",
    "../../../../../../api/units:timestamp",
    "../../../../../../rtc_base:checks",
    "../../../../../../system_wrappers",
  ]
}

if (rtc_include_tests) {
  rtc_library("pausable_state_test") {
    testonly = true
    sources = [ "pausable_state_test.cc" ]
    deps = [
      ":pausable_state",
      "../../../../..:test_support",
      "../../../../../../api:time_controller",
      "../../../../../../api/units:time_delta",
      "../../../../../../api/units:timestamp",
      "../../../../../../system_wrappers",
      "../../../../../time_controller",
    ]
  }
}
