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_processing/agc2/clipping_predictor_level_buffer.h"
12
13 #include <algorithm>
14
15 #include "test/gmock.h"
16 #include "test/gtest.h"
17
18 namespace webrtc {
19 namespace {
20
21 using ::testing::Eq;
22 using ::testing::Optional;
23
24 class ClippingPredictorLevelBufferParametrization
25 : public ::testing::TestWithParam<int> {
26 protected:
capacity() const27 int capacity() const { return GetParam(); }
28 };
29
TEST_P(ClippingPredictorLevelBufferParametrization,CheckEmptyBufferSize)30 TEST_P(ClippingPredictorLevelBufferParametrization, CheckEmptyBufferSize) {
31 ClippingPredictorLevelBuffer buffer(capacity());
32 EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
33 EXPECT_EQ(buffer.Size(), 0);
34 }
35
TEST_P(ClippingPredictorLevelBufferParametrization,CheckHalfEmptyBufferSize)36 TEST_P(ClippingPredictorLevelBufferParametrization, CheckHalfEmptyBufferSize) {
37 ClippingPredictorLevelBuffer buffer(capacity());
38 for (int i = 0; i < buffer.Capacity() / 2; ++i) {
39 buffer.Push({2, 4});
40 }
41 EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
42 EXPECT_EQ(buffer.Size(), std::max(capacity(), 1) / 2);
43 }
44
TEST_P(ClippingPredictorLevelBufferParametrization,CheckFullBufferSize)45 TEST_P(ClippingPredictorLevelBufferParametrization, CheckFullBufferSize) {
46 ClippingPredictorLevelBuffer buffer(capacity());
47 for (int i = 0; i < buffer.Capacity(); ++i) {
48 buffer.Push({2, 4});
49 }
50 EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
51 EXPECT_EQ(buffer.Size(), std::max(capacity(), 1));
52 }
53
TEST_P(ClippingPredictorLevelBufferParametrization,CheckLargeBufferSize)54 TEST_P(ClippingPredictorLevelBufferParametrization, CheckLargeBufferSize) {
55 ClippingPredictorLevelBuffer buffer(capacity());
56 for (int i = 0; i < 2 * buffer.Capacity(); ++i) {
57 buffer.Push({2, 4});
58 }
59 EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
60 EXPECT_EQ(buffer.Size(), std::max(capacity(), 1));
61 }
62
TEST_P(ClippingPredictorLevelBufferParametrization,CheckSizeAfterReset)63 TEST_P(ClippingPredictorLevelBufferParametrization, CheckSizeAfterReset) {
64 ClippingPredictorLevelBuffer buffer(capacity());
65 buffer.Push({1, 1});
66 buffer.Push({1, 1});
67 buffer.Reset();
68 EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
69 EXPECT_EQ(buffer.Size(), 0);
70 buffer.Push({1, 1});
71 EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
72 EXPECT_EQ(buffer.Size(), 1);
73 }
74
75 INSTANTIATE_TEST_SUITE_P(ClippingPredictorLevelBufferTest,
76 ClippingPredictorLevelBufferParametrization,
77 ::testing::Values(-1, 0, 1, 123));
78
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterFullBuffer)79 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterFullBuffer) {
80 ClippingPredictorLevelBuffer buffer(/*capacity=*/2);
81 buffer.Push({1, 2});
82 buffer.Push({3, 6});
83 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1),
84 Optional(Eq(ClippingPredictorLevelBuffer::Level{3, 6})));
85 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1),
86 Optional(Eq(ClippingPredictorLevelBuffer::Level{1, 2})));
87 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/2),
88 Optional(Eq(ClippingPredictorLevelBuffer::Level{2, 6})));
89 }
90
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterPushBeyondCapacity)91 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterPushBeyondCapacity) {
92 ClippingPredictorLevelBuffer buffer(/*capacity=*/2);
93 buffer.Push({1, 1});
94 buffer.Push({3, 6});
95 buffer.Push({5, 10});
96 buffer.Push({7, 14});
97 buffer.Push({6, 12});
98 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1),
99 Optional(Eq(ClippingPredictorLevelBuffer::Level{6, 12})));
100 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1),
101 Optional(Eq(ClippingPredictorLevelBuffer::Level{7, 14})));
102 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/2),
103 Optional(Eq(ClippingPredictorLevelBuffer::Level{6.5f, 14})));
104 }
105
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterTooFewItems)106 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterTooFewItems) {
107 ClippingPredictorLevelBuffer buffer(/*capacity=*/4);
108 buffer.Push({1, 2});
109 buffer.Push({3, 6});
110 EXPECT_EQ(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/3),
111 absl::nullopt);
112 EXPECT_EQ(buffer.ComputePartialMetrics(/*delay=*/2, /*num_items=*/1),
113 absl::nullopt);
114 }
115
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterReset)116 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterReset) {
117 ClippingPredictorLevelBuffer buffer(/*capacity=*/2);
118 buffer.Push({1, 2});
119 buffer.Reset();
120 buffer.Push({5, 10});
121 buffer.Push({7, 14});
122 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1),
123 Optional(Eq(ClippingPredictorLevelBuffer::Level{7, 14})));
124 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/2),
125 Optional(Eq(ClippingPredictorLevelBuffer::Level{6, 14})));
126 EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1),
127 Optional(Eq(ClippingPredictorLevelBuffer::Level{5, 10})));
128 }
129
130 } // namespace
131 } // namespace webrtc
132