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 "modules/include/module_common_types.h"
12
13 #include <string.h> // memcmp
14
15 #include "test/gtest.h"
16
17 namespace webrtc {
18
19 namespace {
20
AllSamplesAre(int16_t sample,const AudioFrame & frame)21 bool AllSamplesAre(int16_t sample, const AudioFrame& frame) {
22 const int16_t* frame_data = frame.data();
23 for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; i++) {
24 if (frame_data[i] != sample) {
25 return false;
26 }
27 }
28 return true;
29 }
30
31 constexpr uint32_t kTimestamp = 27;
32 constexpr int kSampleRateHz = 16000;
33 constexpr size_t kNumChannels = 1;
34 constexpr size_t kSamplesPerChannel = kSampleRateHz / 100;
35
36 } // namespace
37
TEST(AudioFrameTest,FrameStartsMuted)38 TEST(AudioFrameTest, FrameStartsMuted) {
39 AudioFrame frame;
40 EXPECT_TRUE(frame.muted());
41 EXPECT_TRUE(AllSamplesAre(0, frame));
42 }
43
TEST(AudioFrameTest,UnmutedFrameIsInitiallyZeroed)44 TEST(AudioFrameTest, UnmutedFrameIsInitiallyZeroed) {
45 AudioFrame frame;
46 frame.mutable_data();
47 EXPECT_FALSE(frame.muted());
48 EXPECT_TRUE(AllSamplesAre(0, frame));
49 }
50
TEST(AudioFrameTest,MutedFrameBufferIsZeroed)51 TEST(AudioFrameTest, MutedFrameBufferIsZeroed) {
52 AudioFrame frame;
53 int16_t* frame_data = frame.mutable_data();
54 for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; i++) {
55 frame_data[i] = 17;
56 }
57 ASSERT_TRUE(AllSamplesAre(17, frame));
58 frame.Mute();
59 EXPECT_TRUE(frame.muted());
60 EXPECT_TRUE(AllSamplesAre(0, frame));
61 }
62
TEST(AudioFrameTest,UpdateFrame)63 TEST(AudioFrameTest, UpdateFrame) {
64 AudioFrame frame;
65 int16_t samples[kNumChannels * kSamplesPerChannel] = {17};
66 frame.UpdateFrame(kTimestamp, samples, kSamplesPerChannel, kSampleRateHz,
67 AudioFrame::kPLC, AudioFrame::kVadActive, kNumChannels);
68
69 EXPECT_EQ(kTimestamp, frame.timestamp_);
70 EXPECT_EQ(kSamplesPerChannel, frame.samples_per_channel_);
71 EXPECT_EQ(kSampleRateHz, frame.sample_rate_hz_);
72 EXPECT_EQ(AudioFrame::kPLC, frame.speech_type_);
73 EXPECT_EQ(AudioFrame::kVadActive, frame.vad_activity_);
74 EXPECT_EQ(kNumChannels, frame.num_channels_);
75
76 EXPECT_FALSE(frame.muted());
77 EXPECT_EQ(0, memcmp(samples, frame.data(), sizeof(samples)));
78
79 frame.UpdateFrame(kTimestamp, nullptr /* data*/, kSamplesPerChannel,
80 kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive,
81 kNumChannels);
82 EXPECT_TRUE(frame.muted());
83 EXPECT_TRUE(AllSamplesAre(0, frame));
84 }
85
TEST(AudioFrameTest,CopyFrom)86 TEST(AudioFrameTest, CopyFrom) {
87 AudioFrame frame1;
88 AudioFrame frame2;
89
90 int16_t samples[kNumChannels * kSamplesPerChannel] = {17};
91 frame2.UpdateFrame(kTimestamp, samples, kSamplesPerChannel,
92 kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive,
93 kNumChannels);
94 frame1.CopyFrom(frame2);
95
96 EXPECT_EQ(frame2.timestamp_, frame1.timestamp_);
97 EXPECT_EQ(frame2.samples_per_channel_, frame1.samples_per_channel_);
98 EXPECT_EQ(frame2.sample_rate_hz_, frame1.sample_rate_hz_);
99 EXPECT_EQ(frame2.speech_type_, frame1.speech_type_);
100 EXPECT_EQ(frame2.vad_activity_, frame1.vad_activity_);
101 EXPECT_EQ(frame2.num_channels_, frame1.num_channels_);
102
103 EXPECT_EQ(frame2.muted(), frame1.muted());
104 EXPECT_EQ(0, memcmp(frame2.data(), frame1.data(), sizeof(samples)));
105
106 frame2.UpdateFrame(kTimestamp, nullptr /* data */, kSamplesPerChannel,
107 kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive,
108 kNumChannels);
109 frame1.CopyFrom(frame2);
110
111 EXPECT_EQ(frame2.muted(), frame1.muted());
112 EXPECT_EQ(0, memcmp(frame2.data(), frame1.data(), sizeof(samples)));
113 }
114
TEST(IsNewerSequenceNumber,Equal)115 TEST(IsNewerSequenceNumber, Equal) {
116 EXPECT_FALSE(IsNewerSequenceNumber(0x0001, 0x0001));
117 }
118
TEST(IsNewerSequenceNumber,NoWrap)119 TEST(IsNewerSequenceNumber, NoWrap) {
120 EXPECT_TRUE(IsNewerSequenceNumber(0xFFFF, 0xFFFE));
121 EXPECT_TRUE(IsNewerSequenceNumber(0x0001, 0x0000));
122 EXPECT_TRUE(IsNewerSequenceNumber(0x0100, 0x00FF));
123 }
124
TEST(IsNewerSequenceNumber,ForwardWrap)125 TEST(IsNewerSequenceNumber, ForwardWrap) {
126 EXPECT_TRUE(IsNewerSequenceNumber(0x0000, 0xFFFF));
127 EXPECT_TRUE(IsNewerSequenceNumber(0x0000, 0xFF00));
128 EXPECT_TRUE(IsNewerSequenceNumber(0x00FF, 0xFFFF));
129 EXPECT_TRUE(IsNewerSequenceNumber(0x00FF, 0xFF00));
130 }
131
TEST(IsNewerSequenceNumber,BackwardWrap)132 TEST(IsNewerSequenceNumber, BackwardWrap) {
133 EXPECT_FALSE(IsNewerSequenceNumber(0xFFFF, 0x0000));
134 EXPECT_FALSE(IsNewerSequenceNumber(0xFF00, 0x0000));
135 EXPECT_FALSE(IsNewerSequenceNumber(0xFFFF, 0x00FF));
136 EXPECT_FALSE(IsNewerSequenceNumber(0xFF00, 0x00FF));
137 }
138
TEST(IsNewerSequenceNumber,HalfWayApart)139 TEST(IsNewerSequenceNumber, HalfWayApart) {
140 EXPECT_TRUE(IsNewerSequenceNumber(0x8000, 0x0000));
141 EXPECT_FALSE(IsNewerSequenceNumber(0x0000, 0x8000));
142 }
143
TEST(IsNewerTimestamp,Equal)144 TEST(IsNewerTimestamp, Equal) {
145 EXPECT_FALSE(IsNewerTimestamp(0x00000001, 0x000000001));
146 }
147
TEST(IsNewerTimestamp,NoWrap)148 TEST(IsNewerTimestamp, NoWrap) {
149 EXPECT_TRUE(IsNewerTimestamp(0xFFFFFFFF, 0xFFFFFFFE));
150 EXPECT_TRUE(IsNewerTimestamp(0x00000001, 0x00000000));
151 EXPECT_TRUE(IsNewerTimestamp(0x00010000, 0x0000FFFF));
152 }
153
TEST(IsNewerTimestamp,ForwardWrap)154 TEST(IsNewerTimestamp, ForwardWrap) {
155 EXPECT_TRUE(IsNewerTimestamp(0x00000000, 0xFFFFFFFF));
156 EXPECT_TRUE(IsNewerTimestamp(0x00000000, 0xFFFF0000));
157 EXPECT_TRUE(IsNewerTimestamp(0x0000FFFF, 0xFFFFFFFF));
158 EXPECT_TRUE(IsNewerTimestamp(0x0000FFFF, 0xFFFF0000));
159 }
160
TEST(IsNewerTimestamp,BackwardWrap)161 TEST(IsNewerTimestamp, BackwardWrap) {
162 EXPECT_FALSE(IsNewerTimestamp(0xFFFFFFFF, 0x00000000));
163 EXPECT_FALSE(IsNewerTimestamp(0xFFFF0000, 0x00000000));
164 EXPECT_FALSE(IsNewerTimestamp(0xFFFFFFFF, 0x0000FFFF));
165 EXPECT_FALSE(IsNewerTimestamp(0xFFFF0000, 0x0000FFFF));
166 }
167
TEST(IsNewerTimestamp,HalfWayApart)168 TEST(IsNewerTimestamp, HalfWayApart) {
169 EXPECT_TRUE(IsNewerTimestamp(0x80000000, 0x00000000));
170 EXPECT_FALSE(IsNewerTimestamp(0x00000000, 0x80000000));
171 }
172
TEST(LatestSequenceNumber,NoWrap)173 TEST(LatestSequenceNumber, NoWrap) {
174 EXPECT_EQ(0xFFFFu, LatestSequenceNumber(0xFFFF, 0xFFFE));
175 EXPECT_EQ(0x0001u, LatestSequenceNumber(0x0001, 0x0000));
176 EXPECT_EQ(0x0100u, LatestSequenceNumber(0x0100, 0x00FF));
177
178 EXPECT_EQ(0xFFFFu, LatestSequenceNumber(0xFFFE, 0xFFFF));
179 EXPECT_EQ(0x0001u, LatestSequenceNumber(0x0000, 0x0001));
180 EXPECT_EQ(0x0100u, LatestSequenceNumber(0x00FF, 0x0100));
181 }
182
TEST(LatestSequenceNumber,Wrap)183 TEST(LatestSequenceNumber, Wrap) {
184 EXPECT_EQ(0x0000u, LatestSequenceNumber(0x0000, 0xFFFF));
185 EXPECT_EQ(0x0000u, LatestSequenceNumber(0x0000, 0xFF00));
186 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0x00FF, 0xFFFF));
187 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0x00FF, 0xFF00));
188
189 EXPECT_EQ(0x0000u, LatestSequenceNumber(0xFFFF, 0x0000));
190 EXPECT_EQ(0x0000u, LatestSequenceNumber(0xFF00, 0x0000));
191 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0xFFFF, 0x00FF));
192 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0xFF00, 0x00FF));
193 }
194
TEST(LatestTimestamp,NoWrap)195 TEST(LatestTimestamp, NoWrap) {
196 EXPECT_EQ(0xFFFFFFFFu, LatestTimestamp(0xFFFFFFFF, 0xFFFFFFFE));
197 EXPECT_EQ(0x00000001u, LatestTimestamp(0x00000001, 0x00000000));
198 EXPECT_EQ(0x00010000u, LatestTimestamp(0x00010000, 0x0000FFFF));
199 }
200
TEST(LatestTimestamp,Wrap)201 TEST(LatestTimestamp, Wrap) {
202 EXPECT_EQ(0x00000000u, LatestTimestamp(0x00000000, 0xFFFFFFFF));
203 EXPECT_EQ(0x00000000u, LatestTimestamp(0x00000000, 0xFFFF0000));
204 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0x0000FFFF, 0xFFFFFFFF));
205 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0x0000FFFF, 0xFFFF0000));
206
207 EXPECT_EQ(0x00000000u, LatestTimestamp(0xFFFFFFFF, 0x00000000));
208 EXPECT_EQ(0x00000000u, LatestTimestamp(0xFFFF0000, 0x00000000));
209 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0xFFFFFFFF, 0x0000FFFF));
210 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0xFFFF0000, 0x0000FFFF));
211 }
212
213
TEST(SequenceNumberUnwrapper,Limits)214 TEST(SequenceNumberUnwrapper, Limits) {
215 SequenceNumberUnwrapper unwrapper;
216
217 EXPECT_EQ(0, unwrapper.Unwrap(0));
218 EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
219 // Delta is exactly 0x8000 but current is lower than input, wrap backwards.
220 EXPECT_EQ(0, unwrapper.Unwrap(0));
221
222 EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
223 EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
224 EXPECT_EQ(0x10000, unwrapper.Unwrap(0));
225 EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
226 EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
227 EXPECT_EQ(0, unwrapper.Unwrap(0));
228
229 // Don't allow negative values.
230 EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
231 }
232
TEST(SequenceNumberUnwrapper,ForwardWraps)233 TEST(SequenceNumberUnwrapper, ForwardWraps) {
234 int64_t seq = 0;
235 SequenceNumberUnwrapper unwrapper;
236
237 const int kMaxIncrease = 0x8000 - 1;
238 const int kNumWraps = 4;
239 for (int i = 0; i < kNumWraps * 2; ++i) {
240 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
241 EXPECT_EQ(seq, unwrapped);
242 seq += kMaxIncrease;
243 }
244
245 unwrapper.UpdateLast(0);
246 for (int seq = 0; seq < kNumWraps * 0xFFFF; ++seq) {
247 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
248 EXPECT_EQ(seq, unwrapped);
249 }
250 }
251
TEST(SequenceNumberUnwrapper,BackwardWraps)252 TEST(SequenceNumberUnwrapper, BackwardWraps) {
253 SequenceNumberUnwrapper unwrapper;
254
255 const int kMaxDecrease = 0x8000 - 1;
256 const int kNumWraps = 4;
257 int64_t seq = kNumWraps * 2 * kMaxDecrease;
258 unwrapper.UpdateLast(seq);
259 for (int i = kNumWraps * 2; i >= 0; --i) {
260 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
261 EXPECT_EQ(seq, unwrapped);
262 seq -= kMaxDecrease;
263 }
264
265 seq = kNumWraps * 0xFFFF;
266 unwrapper.UpdateLast(seq);
267 for (; seq >= 0; --seq) {
268 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
269 EXPECT_EQ(seq, unwrapped);
270 }
271 }
272
TEST(TimestampUnwrapper,Limits)273 TEST(TimestampUnwrapper, Limits) {
274 TimestampUnwrapper unwrapper;
275
276 EXPECT_EQ(0, unwrapper.Unwrap(0));
277 EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
278 // Delta is exactly 0x80000000 but current is lower than input, wrap
279 // backwards.
280 EXPECT_EQ(0, unwrapper.Unwrap(0));
281
282 EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
283 EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
284 EXPECT_EQ(0x100000000, unwrapper.Unwrap(0x00000000));
285 EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
286 EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
287 EXPECT_EQ(0, unwrapper.Unwrap(0));
288
289 // Don't allow negative values.
290 EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
291 }
292
TEST(TimestampUnwrapper,ForwardWraps)293 TEST(TimestampUnwrapper, ForwardWraps) {
294 int64_t ts = 0;
295 TimestampUnwrapper unwrapper;
296
297 const int64_t kMaxIncrease = 0x80000000 - 1;
298 const int kNumWraps = 4;
299 for (int i = 0; i < kNumWraps * 2; ++i) {
300 int64_t unwrapped =
301 unwrapper.Unwrap(static_cast<uint32_t>(ts & 0xFFFFFFFF));
302 EXPECT_EQ(ts, unwrapped);
303 ts += kMaxIncrease;
304 }
305 }
306
TEST(TimestampUnwrapper,BackwardWraps)307 TEST(TimestampUnwrapper, BackwardWraps) {
308 TimestampUnwrapper unwrapper;
309
310 const int64_t kMaxDecrease = 0x80000000 - 1;
311 const int kNumWraps = 4;
312 int64_t ts = kNumWraps * 2 * kMaxDecrease;
313 unwrapper.UpdateLast(ts);
314 for (int i = 0; i <= kNumWraps * 2; ++i) {
315 int64_t unwrapped =
316 unwrapper.Unwrap(static_cast<uint32_t>(ts & 0xFFFFFFFF));
317 EXPECT_EQ(ts, unwrapped);
318 ts -= kMaxDecrease;
319 }
320 }
321
322 } // namespace webrtc
323