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