tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

delay_constraints_unittest.cc (8188B)


      1 /*
      2 *  Copyright (c) 2024 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "modules/audio_coding/neteq/delay_constraints.h"
     12 
     13 #include "rtc_base/checks.h"
     14 #include "test/gtest.h"
     15 
     16 namespace webrtc {
     17 namespace {
     18 
     19 constexpr int kMaxNumberOfPackets = 200;
     20 constexpr int kFrameSizeMs = 20;
     21 constexpr int kMaxBufferSizeMs = kMaxNumberOfPackets * kFrameSizeMs;
     22 
     23 TEST(DelayConstraintsTest, NoConstraints) {
     24  DelayConstraints constraints(kMaxNumberOfPackets, 0);
     25  EXPECT_EQ(constraints.Clamp(100), 100);
     26  EXPECT_EQ(constraints.Clamp(0), 0);
     27 }
     28 
     29 TEST(DelayConstraintsTest, MaxDelay) {
     30  DelayConstraints constraints(kMaxNumberOfPackets, 0);
     31  constexpr int kMaxDelayMs = 60;
     32  EXPECT_TRUE(constraints.SetMaximumDelay(kMaxDelayMs));
     33  EXPECT_EQ(constraints.Clamp(100), kMaxDelayMs);
     34 }
     35 
     36 TEST(DelayConstraintsTest, MinDelay) {
     37  DelayConstraints constraints(kMaxNumberOfPackets, 0);
     38  constexpr int kMinDelayMs = 7 * kFrameSizeMs;
     39  constraints.SetMinimumDelay(kMinDelayMs);
     40  EXPECT_EQ(constraints.Clamp(20), kMinDelayMs);
     41 }
     42 
     43 TEST(DelayConstraintsTest, BaseMinimumDelayCheckValidRange) {
     44  DelayConstraints constraints(kMaxNumberOfPackets, 0);
     45  // Base minimum delay should be between [0, 10000] milliseconds.
     46  EXPECT_FALSE(constraints.SetBaseMinimumDelay(-1));
     47  EXPECT_FALSE(constraints.SetBaseMinimumDelay(10001));
     48  EXPECT_EQ(constraints.GetBaseMinimumDelay(), 0);
     49 
     50  EXPECT_TRUE(constraints.SetBaseMinimumDelay(7999));
     51  EXPECT_EQ(constraints.GetBaseMinimumDelay(), 7999);
     52 }
     53 
     54 TEST(DelayConstraintsTest, BaseMinimumDelayLowerThanMinimumDelay) {
     55  DelayConstraints constraints(kMaxNumberOfPackets, 0);
     56  constexpr int kBaseMinimumDelayMs = 100;
     57  constexpr int kMinimumDelayMs = 200;
     58 
     59  // Base minimum delay sets lower bound on minimum. That is why when base
     60  // minimum delay is lower than minimum delay we use minimum delay.
     61  RTC_DCHECK_LT(kBaseMinimumDelayMs, kMinimumDelayMs);
     62 
     63  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs));
     64  EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs));
     65  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
     66 }
     67 
     68 TEST(DelayConstraintsTest, BaseMinimumDelayGreaterThanMinimumDelay) {
     69  DelayConstraints constraints(kMaxNumberOfPackets, 0);
     70  constexpr int kBaseMinimumDelayMs = 70;
     71  constexpr int kMinimumDelayMs = 30;
     72 
     73  // Base minimum delay sets lower bound on minimum. That is why when base
     74  // minimum delay is greater than minimum delay we use base minimum delay.
     75  RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
     76 
     77  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs));
     78  EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs));
     79  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(),
     80            kBaseMinimumDelayMs);
     81 }
     82 
     83 TEST(DelayConstraintsTest, BaseMinimumDelayGreaterThanBufferSize) {
     84  DelayConstraints constraints(kMaxNumberOfPackets, 0);
     85  constexpr int kBaseMinimumDelayMs = kMaxBufferSizeMs + 1;
     86  constexpr int kMinimumDelayMs = 12;
     87  constexpr int kMaximumDelayMs = 20;
     88  constexpr int kMaxBufferSizeMsQ75 = 3 * kMaxBufferSizeMs / 4;
     89  EXPECT_TRUE(constraints.SetPacketAudioLength(kFrameSizeMs));
     90 
     91  EXPECT_TRUE(constraints.SetMaximumDelay(kMaximumDelayMs));
     92 
     93  // Base minimum delay is greater than minimum delay, that is why we clamp
     94  // it to current the highest possible value which is maximum delay.
     95  RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
     96  RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaxBufferSizeMs);
     97  RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
     98  RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMsQ75);
     99 
    100  EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs));
    101  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs));
    102 
    103  // Unset maximum value.
    104  EXPECT_TRUE(constraints.SetMaximumDelay(0));
    105 
    106  // With maximum value unset, the highest possible value now is 75% of
    107  // currently possible maximum buffer size.
    108  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(),
    109            kMaxBufferSizeMsQ75);
    110 }
    111 
    112 TEST(DelayConstraintsTest, BaseMinimumDelayGreaterThanMaximumDelay) {
    113  DelayConstraints constraints(kMaxNumberOfPackets, 0);
    114  constexpr int kMaximumDelayMs = 400;
    115  constexpr int kBaseMinimumDelayMs = kMaximumDelayMs + 1;
    116  constexpr int kMinimumDelayMs = 20;
    117 
    118  // Base minimum delay is greater than minimum delay, that is why we clamp
    119  // it to current the highest possible value which is kMaximumDelayMs.
    120  RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
    121  RTC_DCHECK_GT(kBaseMinimumDelayMs, kMaximumDelayMs);
    122  RTC_DCHECK_LT(kMaximumDelayMs, kMaxBufferSizeMs);
    123 
    124  EXPECT_TRUE(constraints.SetMaximumDelay(kMaximumDelayMs));
    125  EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs));
    126  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs));
    127  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMaximumDelayMs);
    128 }
    129 
    130 TEST(DelayConstraintsTest, BaseMinimumDelayLowerThanMaxSize) {
    131  DelayConstraints constraints(kMaxNumberOfPackets, 0);
    132  constexpr int kMaximumDelayMs = 400;
    133  constexpr int kBaseMinimumDelayMs = kMaximumDelayMs - 1;
    134  constexpr int kMinimumDelayMs = 20;
    135 
    136  // Base minimum delay is greater than minimum delay, and lower than maximum
    137  // delays that is why it is used.
    138  RTC_DCHECK_GT(kBaseMinimumDelayMs, kMinimumDelayMs);
    139  RTC_DCHECK_LT(kBaseMinimumDelayMs, kMaximumDelayMs);
    140 
    141  EXPECT_TRUE(constraints.SetMaximumDelay(kMaximumDelayMs));
    142  EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs));
    143  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs));
    144  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(),
    145            kBaseMinimumDelayMs);
    146 }
    147 
    148 TEST(DelayConstraintsTest, MinimumDelayMemorization) {
    149  DelayConstraints constraints(kMaxNumberOfPackets, 0);
    150  // Check that when we increase base minimum delay to value higher than
    151  // minimum delay then minimum delay is still memorized. This allows to
    152  // restore effective minimum delay to memorized minimum delay value when we
    153  // decrease base minimum delay.
    154  constexpr int kBaseMinimumDelayMsLow = 10;
    155  constexpr int kMinimumDelayMs = 20;
    156  constexpr int kBaseMinimumDelayMsHigh = 30;
    157 
    158  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
    159  EXPECT_TRUE(constraints.SetMinimumDelay(kMinimumDelayMs));
    160  // Minimum delay is used as it is higher than base minimum delay.
    161  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
    162 
    163  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMsHigh));
    164  // Base minimum delay is used as it is now higher than minimum delay.
    165  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(),
    166            kBaseMinimumDelayMsHigh);
    167 
    168  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMsLow));
    169  // Check that minimum delay is memorized and is used again.
    170  EXPECT_EQ(constraints.effective_minimum_delay_ms_for_test(), kMinimumDelayMs);
    171 }
    172 
    173 TEST(DelayConstraintsTest, BaseMinimumDelay) {
    174  DelayConstraints constraints(kMaxNumberOfPackets, 0);
    175  constexpr int kBaseMinimumDelayMs = 7 * kFrameSizeMs;
    176  EXPECT_TRUE(constraints.SetBaseMinimumDelay(kBaseMinimumDelayMs));
    177  EXPECT_EQ(constraints.GetBaseMinimumDelay(), kBaseMinimumDelayMs);
    178  EXPECT_EQ(constraints.Clamp(20), kBaseMinimumDelayMs);
    179 }
    180 
    181 TEST(DelayConstraintsTest, Failures) {
    182  DelayConstraints constraints(kMaxNumberOfPackets, 0);
    183  // Wrong packet size.
    184  EXPECT_FALSE(constraints.SetPacketAudioLength(0));
    185  EXPECT_FALSE(constraints.SetPacketAudioLength(-1));
    186 
    187  // Minimum delay higher than a maximum delay is not accepted.
    188  EXPECT_TRUE(constraints.SetMaximumDelay(20));
    189  EXPECT_FALSE(constraints.SetMinimumDelay(40));
    190 
    191  // Maximum delay less than minimum delay is not accepted.
    192  EXPECT_TRUE(constraints.SetMaximumDelay(100));
    193  EXPECT_TRUE(constraints.SetMinimumDelay(80));
    194  EXPECT_FALSE(constraints.SetMaximumDelay(60));
    195 }
    196 
    197 }  // namespace
    198 }  // namespace webrtc