xref: /aosp_15_r20/external/webrtc/modules/audio_coding/neteq/reorder_optimizer_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2021 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/reorder_optimizer.h"
12 
13 #include "test/gtest.h"
14 
15 namespace webrtc {
16 
17 namespace {
18 
19 constexpr int kForgetFactor = 32745;  // 0.9993 in Q15.
20 constexpr int kMsPerLossPercent = 20;
21 constexpr int kStartForgetWeight = 1;
22 
23 }  // namespace
24 
TEST(ReorderOptimizerTest,OnlyIncreaseDelayForReorderedPackets)25 TEST(ReorderOptimizerTest, OnlyIncreaseDelayForReorderedPackets) {
26   ReorderOptimizer reorder_optimizer(kForgetFactor, kMsPerLossPercent,
27                                      kStartForgetWeight);
28   EXPECT_FALSE(reorder_optimizer.GetOptimalDelayMs());
29 
30   // Delay should not increase for in-order packets.
31   reorder_optimizer.Update(60, /*reordered=*/false, 0);
32   EXPECT_EQ(reorder_optimizer.GetOptimalDelayMs(), 20);
33 
34   reorder_optimizer.Update(100, /*reordered=*/false, 0);
35   EXPECT_EQ(reorder_optimizer.GetOptimalDelayMs(), 20);
36 
37   reorder_optimizer.Update(80, /*reordered=*/true, 0);
38   EXPECT_EQ(reorder_optimizer.GetOptimalDelayMs(), 100);
39 }
40 
TEST(ReorderOptimizerTest,AvoidIncreasingDelayWhenProbabilityIsLow)41 TEST(ReorderOptimizerTest, AvoidIncreasingDelayWhenProbabilityIsLow) {
42   ReorderOptimizer reorder_optimizer(kForgetFactor, kMsPerLossPercent,
43                                      kStartForgetWeight);
44 
45   reorder_optimizer.Update(40, /*reordered=*/true, 0);
46   reorder_optimizer.Update(40, /*reordered=*/true, 0);
47   reorder_optimizer.Update(40, /*reordered=*/true, 0);
48   EXPECT_EQ(reorder_optimizer.GetOptimalDelayMs(), 60);
49 
50   // The cost of the delay is too high relative the probability.
51   reorder_optimizer.Update(600, /*reordered=*/true, 0);
52   EXPECT_EQ(reorder_optimizer.GetOptimalDelayMs(), 60);
53 }
54 
TEST(ReorderOptimizerTest,BaseDelayIsSubtractedFromCost)55 TEST(ReorderOptimizerTest, BaseDelayIsSubtractedFromCost) {
56   constexpr int kBaseDelayMs = 200;
57   ReorderOptimizer reorder_optimizer(kForgetFactor, kMsPerLossPercent,
58                                      kStartForgetWeight);
59 
60   reorder_optimizer.Update(40, /*reordered=*/true, kBaseDelayMs);
61   reorder_optimizer.Update(40, /*reordered=*/true, kBaseDelayMs);
62   reorder_optimizer.Update(40, /*reordered=*/true, kBaseDelayMs);
63   EXPECT_EQ(reorder_optimizer.GetOptimalDelayMs(), 60);
64 
65   // The cost of the delay is too high relative the probability.
66   reorder_optimizer.Update(600, /*reordered=*/true, kBaseDelayMs);
67   EXPECT_EQ(reorder_optimizer.GetOptimalDelayMs(), 620);
68 }
69 
70 }  // namespace webrtc
71