1 /*
2  *  Copyright (c) 2013 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 "webrtc/modules/audio_processing/transient/dyadic_decimator.h"
12 
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 namespace webrtc {
16 
17 static const size_t kEvenBufferLength = 6;
18 static const size_t kOddBufferLength = 5;
19 static const size_t kOutBufferLength = 3;
20 
21 int16_t const test_buffer_even_len[] = {0, 1, 2, 3, 4, 5};
22 int16_t const test_buffer_odd_len[]  = {0, 1, 2, 3, 4};
23 int16_t test_buffer_out[kOutBufferLength];
24 
TEST(DyadicDecimatorTest,GetOutLengthToDyadicDecimate)25 TEST(DyadicDecimatorTest, GetOutLengthToDyadicDecimate) {
26   EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, false));
27   EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, true));
28   EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(5, false));
29   EXPECT_EQ(2u, GetOutLengthToDyadicDecimate(5, true));
30 }
31 
32 
TEST(DyadicDecimatorTest,DyadicDecimateErrorValues)33 TEST(DyadicDecimatorTest, DyadicDecimateErrorValues) {
34   size_t out_samples = 0;
35 
36   out_samples = DyadicDecimate(static_cast<int16_t*>(NULL),
37                                kEvenBufferLength,
38                                false,  // Even sequence.
39                                test_buffer_out,
40                                kOutBufferLength);
41   EXPECT_EQ(0u, out_samples);
42 
43   out_samples = DyadicDecimate(test_buffer_even_len,
44                                kEvenBufferLength,
45                                false,  // Even sequence.
46                                static_cast<int16_t*>(NULL),
47                                kOutBufferLength);
48   EXPECT_EQ(0u, out_samples);
49 
50   // Less than required |out_length|.
51   out_samples = DyadicDecimate(test_buffer_even_len,
52                                kEvenBufferLength,
53                                false,  // Even sequence.
54                                test_buffer_out,
55                                2);
56   EXPECT_EQ(0u, out_samples);
57 }
58 
TEST(DyadicDecimatorTest,DyadicDecimateEvenLengthEvenSequence)59 TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthEvenSequence) {
60   size_t expected_out_samples =
61       GetOutLengthToDyadicDecimate(kEvenBufferLength, false);
62 
63   size_t out_samples = DyadicDecimate(test_buffer_even_len,
64                                       kEvenBufferLength,
65                                       false,  // Even sequence.
66                                       test_buffer_out,
67                                       kOutBufferLength);
68 
69   EXPECT_EQ(expected_out_samples, out_samples);
70 
71   EXPECT_EQ(0, test_buffer_out[0]);
72   EXPECT_EQ(2, test_buffer_out[1]);
73   EXPECT_EQ(4, test_buffer_out[2]);
74 }
75 
TEST(DyadicDecimatorTest,DyadicDecimateEvenLengthOddSequence)76 TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthOddSequence) {
77   size_t expected_out_samples =
78       GetOutLengthToDyadicDecimate(kEvenBufferLength, true);
79 
80   size_t out_samples = DyadicDecimate(test_buffer_even_len,
81                                       kEvenBufferLength,
82                                       true,  // Odd sequence.
83                                       test_buffer_out,
84                                       kOutBufferLength);
85 
86   EXPECT_EQ(expected_out_samples, out_samples);
87 
88   EXPECT_EQ(1, test_buffer_out[0]);
89   EXPECT_EQ(3, test_buffer_out[1]);
90   EXPECT_EQ(5, test_buffer_out[2]);
91 }
92 
TEST(DyadicDecimatorTest,DyadicDecimateOddLengthEvenSequence)93 TEST(DyadicDecimatorTest, DyadicDecimateOddLengthEvenSequence) {
94   size_t expected_out_samples =
95       GetOutLengthToDyadicDecimate(kOddBufferLength, false);
96 
97   size_t out_samples = DyadicDecimate(test_buffer_odd_len,
98                                       kOddBufferLength,
99                                       false,  // Even sequence.
100                                       test_buffer_out,
101                                       kOutBufferLength);
102 
103   EXPECT_EQ(expected_out_samples, out_samples);
104 
105   EXPECT_EQ(0, test_buffer_out[0]);
106   EXPECT_EQ(2, test_buffer_out[1]);
107   EXPECT_EQ(4, test_buffer_out[2]);
108 }
109 
TEST(DyadicDecimatorTest,DyadicDecimateOddLengthOddSequence)110 TEST(DyadicDecimatorTest, DyadicDecimateOddLengthOddSequence) {
111   size_t expected_out_samples =
112       GetOutLengthToDyadicDecimate(kOddBufferLength, true);
113 
114   size_t out_samples = DyadicDecimate(test_buffer_odd_len,
115                                       kOddBufferLength,
116                                       true,  // Odd sequence.
117                                       test_buffer_out,
118                                       kOutBufferLength);
119 
120   EXPECT_EQ(expected_out_samples, out_samples);
121 
122   EXPECT_EQ(1, test_buffer_out[0]);
123   EXPECT_EQ(3, test_buffer_out[1]);
124 }
125 
126 }  // namespace webrtc
127