blob: 1aafa22ab8883139a8550d77f7db42905196b38f [file] [log] [blame]
henrik.lundin@webrtc.org9a400812013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2012 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_coding/neteq4/sync_buffer.h"
12
13#include "gtest/gtest.h"
14
15namespace webrtc {
16
17TEST(SyncBuffer, CreateAndDestroy) {
18 // Create a SyncBuffer with two channels and 10 samples each.
19 static const size_t kLen = 10;
20 static const size_t kChannels = 2;
21 SyncBuffer sync_buffer(kChannels, kLen);
22 EXPECT_EQ(kChannels, sync_buffer.Channels());
23 EXPECT_EQ(kLen, sync_buffer.Size());
24 // When the buffer is empty, the next index to play out is at the end.
25 EXPECT_EQ(kLen, sync_buffer.next_index());
26 // Verify that all elements are zero.
27 for (size_t channel = 0; channel < kChannels; ++channel) {
28 for (size_t i = 0; i < kLen; ++i) {
29 EXPECT_EQ(0, sync_buffer[channel][i]);
30 }
31 }
32}
33
34TEST(SyncBuffer, SetNextIndex) {
35 // Create a SyncBuffer with two channels and 100 samples each.
36 static const size_t kLen = 100;
37 static const size_t kChannels = 2;
38 SyncBuffer sync_buffer(kChannels, kLen);
39 sync_buffer.set_next_index(0);
40 EXPECT_EQ(0u, sync_buffer.next_index());
41 sync_buffer.set_next_index(kLen / 2);
42 EXPECT_EQ(kLen / 2, sync_buffer.next_index());
43 sync_buffer.set_next_index(kLen);
44 EXPECT_EQ(kLen, sync_buffer.next_index());
45 // Try to set larger than the buffer size; should cap at buffer size.
46 sync_buffer.set_next_index(kLen + 1);
47 EXPECT_EQ(kLen, sync_buffer.next_index());
48}
49
50TEST(SyncBuffer, PushBackAndFlush) {
51 // Create a SyncBuffer with two channels and 100 samples each.
52 static const size_t kLen = 100;
53 static const size_t kChannels = 2;
54 SyncBuffer sync_buffer(kChannels, kLen);
55 static const size_t kNewLen = 10;
henrik.lundin@webrtc.org0e9c3992013-09-30 20:38:44 +000056 AudioMultiVector new_data(kChannels, kNewLen);
henrik.lundin@webrtc.org9a400812013-01-29 12:09:21 +000057 // Populate |new_data|.
58 for (size_t channel = 0; channel < kChannels; ++channel) {
59 for (size_t i = 0; i < kNewLen; ++i) {
60 new_data[channel][i] = i;
61 }
62 }
63 // Push back |new_data| into |sync_buffer|. This operation should pop out
64 // data from the front of |sync_buffer|, so that the size of the buffer
65 // remains the same. The |next_index_| should also move with the same length.
66 sync_buffer.PushBack(new_data);
67 ASSERT_EQ(kLen, sync_buffer.Size());
68 // Verify that |next_index_| moved accordingly.
69 EXPECT_EQ(kLen - kNewLen, sync_buffer.next_index());
70 // Verify the new contents.
71 for (size_t channel = 0; channel < kChannels; ++channel) {
72 for (size_t i = 0; i < kNewLen; ++i) {
73 EXPECT_EQ(new_data[channel][i],
74 sync_buffer[channel][sync_buffer.next_index() + i]);
75 }
76 }
77
78 // Now flush the buffer, and verify that it is all zeros, and that next_index
79 // points to the end.
80 sync_buffer.Flush();
81 ASSERT_EQ(kLen, sync_buffer.Size());
82 EXPECT_EQ(kLen, sync_buffer.next_index());
83 for (size_t channel = 0; channel < kChannels; ++channel) {
84 for (size_t i = 0; i < kLen; ++i) {
85 EXPECT_EQ(0, sync_buffer[channel][i]);
86 }
87 }
88}
89
90TEST(SyncBuffer, PushFrontZeros) {
91 // Create a SyncBuffer with two channels and 100 samples each.
92 static const size_t kLen = 100;
93 static const size_t kChannels = 2;
94 SyncBuffer sync_buffer(kChannels, kLen);
95 static const size_t kNewLen = 10;
henrik.lundin@webrtc.org0e9c3992013-09-30 20:38:44 +000096 AudioMultiVector new_data(kChannels, kNewLen);
henrik.lundin@webrtc.org9a400812013-01-29 12:09:21 +000097 // Populate |new_data|.
98 for (size_t channel = 0; channel < kChannels; ++channel) {
99 for (size_t i = 0; i < kNewLen; ++i) {
100 new_data[channel][i] = 1000 + i;
101 }
102 }
103 sync_buffer.PushBack(new_data);
104 EXPECT_EQ(kLen, sync_buffer.Size());
105
106 // Push |kNewLen| - 1 zeros into each channel in the front of the SyncBuffer.
107 sync_buffer.PushFrontZeros(kNewLen - 1);
108 EXPECT_EQ(kLen, sync_buffer.Size()); // Size should remain the same.
109 // Verify that |next_index_| moved accordingly. Should be at the end - 1.
110 EXPECT_EQ(kLen - 1, sync_buffer.next_index());
111 // Verify the zeros.
112 for (size_t channel = 0; channel < kChannels; ++channel) {
113 for (size_t i = 0; i < kNewLen - 1; ++i) {
114 EXPECT_EQ(0, sync_buffer[channel][i]);
115 }
116 }
117 // Verify that the correct data is at the end of the SyncBuffer.
118 for (size_t channel = 0; channel < kChannels; ++channel) {
119 EXPECT_EQ(1000, sync_buffer[channel][sync_buffer.next_index()]);
120 }
121}
122
123TEST(SyncBuffer, GetNextAudioInterleaved) {
124 // Create a SyncBuffer with two channels and 100 samples each.
125 static const size_t kLen = 100;
126 static const size_t kChannels = 2;
127 SyncBuffer sync_buffer(kChannels, kLen);
128 static const size_t kNewLen = 10;
henrik.lundin@webrtc.org0e9c3992013-09-30 20:38:44 +0000129 AudioMultiVector new_data(kChannels, kNewLen);
henrik.lundin@webrtc.org9a400812013-01-29 12:09:21 +0000130 // Populate |new_data|.
131 for (size_t channel = 0; channel < kChannels; ++channel) {
132 for (size_t i = 0; i < kNewLen; ++i) {
133 new_data[channel][i] = i;
134 }
135 }
136 // Push back |new_data| into |sync_buffer|. This operation should pop out
137 // data from the front of |sync_buffer|, so that the size of the buffer
138 // remains the same. The |next_index_| should also move with the same length.
139 sync_buffer.PushBack(new_data);
140
141 // Read to interleaved output. Read in two batches, where each read operation
142 // should automatically update the |net_index_| in the SyncBuffer.
143 int16_t output[kChannels * kNewLen];
144 // Note that |samples_read| is the number of samples read from each channel.
145 // That is, the number of samples written to |output| is
146 // |samples_read| * |kChannels|.
147 size_t samples_read = sync_buffer.GetNextAudioInterleaved(kNewLen / 2,
148 output);
149 samples_read +=
150 sync_buffer.GetNextAudioInterleaved(kNewLen / 2,
151 &output[samples_read * kChannels]);
152 EXPECT_EQ(kNewLen, samples_read);
153
154 // Verify the data.
155 int16_t* output_ptr = output;
156 for (size_t i = 0; i < kNewLen; ++i) {
157 for (size_t channel = 0; channel < kChannels; ++channel) {
158 EXPECT_EQ(new_data[channel][i], *output_ptr);
159 ++output_ptr;
160 }
161 }
162}
163
164} // namespace webrtc