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