15
15
namespace {
16
16
17
17
// Callback Function to add 3 to every sample in the signal.
18
- class SimpleBlockerCallback : public webrtc ::BlockerCallback {
18
+ class PlusThreeBlockerCallback : public webrtc ::BlockerCallback {
19
19
public:
20
20
virtual void ProcessBlock (const float * const * input,
21
21
int num_frames,
@@ -30,6 +30,22 @@ class SimpleBlockerCallback : public webrtc::BlockerCallback {
30
30
}
31
31
};
32
32
33
+ // No-op Callback Function.
34
+ class CopyBlockerCallback : public webrtc ::BlockerCallback {
35
+ public:
36
+ virtual void ProcessBlock (const float * const * input,
37
+ int num_frames,
38
+ int num_input_channels,
39
+ int num_output_channels,
40
+ float * const * output) OVERRIDE {
41
+ for (int i = 0 ; i < num_output_channels; ++i) {
42
+ for (int j = 0 ; j < num_frames; ++j) {
43
+ output[i][j] = input[i][j];
44
+ }
45
+ }
46
+ }
47
+ };
48
+
33
49
} // namespace
34
50
35
51
namespace webrtc {
@@ -75,6 +91,21 @@ class BlockerTest : public ::testing::Test {
75
91
}
76
92
}
77
93
94
+ void ValidateInitialDelay (const float * const * output,
95
+ int num_channels,
96
+ int num_frames,
97
+ int initial_delay) {
98
+ for (int i = 0 ; i < num_channels; ++i) {
99
+ for (int j = 0 ; j < num_frames; ++j) {
100
+ if (j < initial_delay) {
101
+ EXPECT_FLOAT_EQ (output[i][j], 0 .f );
102
+ } else {
103
+ EXPECT_GT (output[i][j], 0 .f );
104
+ }
105
+ }
106
+ }
107
+ }
108
+
78
109
static void CopyTo (float * const * dst,
79
110
int start_index_dst,
80
111
int start_index_src,
@@ -104,8 +135,8 @@ TEST_F(BlockerTest, TestBlockerMutuallyPrimeChunkandBlockSize) {
104
135
const ChannelBuffer<float > input_cb (kInput [0 ], kNumFrames , kNumInputChannels );
105
136
106
137
const float kExpectedOutput [kNumInputChannels ][kNumFrames ] = {
107
- {6 , 6 , 12 , 12 , 20 , 20 , 20 , 20 , 20 , 20 },
108
- {6 , 6 , 12 , 12 , 28 , 28 , 28 , 28 , 28 , 28 }};
138
+ {6 , 6 , 12 , 20 , 20 , 20 , 20 , 20 , 20 , 20 },
139
+ {6 , 6 , 12 , 28 , 28 , 28 , 28 , 28 , 28 , 28 }};
109
140
const ChannelBuffer<float > expected_output_cb (
110
141
kExpectedOutput [0 ], kNumFrames , kNumInputChannels );
111
142
@@ -115,7 +146,7 @@ TEST_F(BlockerTest, TestBlockerMutuallyPrimeChunkandBlockSize) {
115
146
ChannelBuffer<float > input_chunk_cb (kChunkSize , kNumInputChannels );
116
147
ChannelBuffer<float > output_chunk_cb (kChunkSize , kNumOutputChannels );
117
148
118
- SimpleBlockerCallback callback;
149
+ PlusThreeBlockerCallback callback;
119
150
Blocker blocker (kChunkSize ,
120
151
kBlockSize ,
121
152
kNumInputChannels ,
@@ -154,19 +185,19 @@ TEST_F(BlockerTest, TestBlockerMutuallyPrimeShiftAndBlockSize) {
154
185
{3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 }};
155
186
const ChannelBuffer<float > input_cb (kInput [0 ], kNumFrames , kNumInputChannels );
156
187
157
- const float kExpectedOutput [kNumInputChannels ][kNumFrames ] = {
158
- {6 , 6 , 6 , 12 , 10 , 10 , 20 , 10 , 10 , 20 , 10 , 10 },
159
- {6 , 6 , 6 , 12 , 14 , 14 , 28 , 14 , 14 , 28 , 14 , 14 }};
188
+ const float kExpectedOutput [kNumOutputChannels ][kNumFrames ] = {
189
+ {6 , 10 , 10 , 20 , 10 , 10 , 20 , 10 , 10 , 20 , 10 , 10 },
190
+ {6 , 14 , 14 , 28 , 14 , 14 , 28 , 14 , 14 , 28 , 14 , 14 }};
160
191
const ChannelBuffer<float > expected_output_cb (
161
- kExpectedOutput [0 ], kNumFrames , kNumInputChannels );
192
+ kExpectedOutput [0 ], kNumFrames , kNumOutputChannels );
162
193
163
194
const float kWindow [kBlockSize ] = {2 .f , 2 .f , 2 .f , 2 .f };
164
195
165
196
ChannelBuffer<float > actual_output_cb (kNumFrames , kNumOutputChannels );
166
197
ChannelBuffer<float > input_chunk_cb (kChunkSize , kNumInputChannels );
167
198
ChannelBuffer<float > output_chunk_cb (kChunkSize , kNumOutputChannels );
168
199
169
- SimpleBlockerCallback callback;
200
+ PlusThreeBlockerCallback callback;
170
201
Blocker blocker (kChunkSize ,
171
202
kBlockSize ,
172
203
kNumInputChannels ,
@@ -205,19 +236,19 @@ TEST_F(BlockerTest, TestBlockerNoOverlap) {
205
236
{3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 }};
206
237
const ChannelBuffer<float > input_cb (kInput [0 ], kNumFrames , kNumInputChannels );
207
238
208
- const float kExpectedOutput [kNumInputChannels ][kNumFrames ] = {
209
- {6 , 6 , 6 , 6 , 10 , 10 , 10 , 10 , 10 , 10 , 10 , 10 },
210
- {6 , 6 , 6 , 6 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 }};
239
+ const float kExpectedOutput [kNumOutputChannels ][kNumFrames ] = {
240
+ {10 , 10 , 10 , 10 , 10 , 10 , 10 , 10 , 10 , 10 , 10 , 10 },
241
+ {14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 }};
211
242
const ChannelBuffer<float > expected_output_cb (
212
- kExpectedOutput [0 ], kNumFrames , kNumInputChannels );
243
+ kExpectedOutput [0 ], kNumFrames , kNumOutputChannels );
213
244
214
245
const float kWindow [kBlockSize ] = {2 .f , 2 .f , 2 .f , 2 .f };
215
246
216
247
ChannelBuffer<float > actual_output_cb (kNumFrames , kNumOutputChannels );
217
248
ChannelBuffer<float > input_chunk_cb (kChunkSize , kNumInputChannels );
218
249
ChannelBuffer<float > output_chunk_cb (kChunkSize , kNumOutputChannels );
219
250
220
- SimpleBlockerCallback callback;
251
+ PlusThreeBlockerCallback callback;
221
252
Blocker blocker (kChunkSize ,
222
253
kBlockSize ,
223
254
kNumInputChannels ,
@@ -242,4 +273,63 @@ TEST_F(BlockerTest, TestBlockerNoOverlap) {
242
273
kNumFrames );
243
274
}
244
275
276
+ TEST_F (BlockerTest, InitialDelaysAreMinimum) {
277
+ const int kNumInputChannels = 3 ;
278
+ const int kNumOutputChannels = 2 ;
279
+ const int kNumFrames = 1280 ;
280
+ const int kChunkSize [] =
281
+ {80 , 80 , 80 , 80 , 80 , 80 , 160 , 160 , 160 , 160 , 160 , 160 };
282
+ const int kBlockSize [] =
283
+ {64 , 64 , 64 , 128 , 128 , 128 , 128 , 128 , 128 , 256 , 256 , 256 };
284
+ const int kShiftAmount [] =
285
+ {16 , 32 , 64 , 32 , 64 , 128 , 32 , 64 , 128 , 64 , 128 , 256 };
286
+ const int kInitialDelay [] =
287
+ {48 , 48 , 48 , 112 , 112 , 112 , 96 , 96 , 96 , 224 , 224 , 224 };
288
+
289
+ float input[kNumInputChannels ][kNumFrames ];
290
+ for (int i = 0 ; i < kNumInputChannels ; ++i) {
291
+ for (int j = 0 ; j < kNumFrames ; ++j) {
292
+ input[i][j] = i + 1 ;
293
+ }
294
+ }
295
+ const ChannelBuffer<float > input_cb (input[0 ], kNumFrames , kNumInputChannels );
296
+
297
+ ChannelBuffer<float > output_cb (kNumFrames , kNumOutputChannels );
298
+
299
+ CopyBlockerCallback callback;
300
+
301
+ for (size_t i = 0 ; i < (sizeof (kChunkSize ) / sizeof (*kChunkSize )); ++i) {
302
+ scoped_ptr<float []> window (new float [kBlockSize [i]]);
303
+ for (int j = 0 ; j < kBlockSize [i]; ++j) {
304
+ window[j] = 1 .f ;
305
+ }
306
+
307
+ ChannelBuffer<float > input_chunk_cb (kChunkSize [i], kNumInputChannels );
308
+ ChannelBuffer<float > output_chunk_cb (kChunkSize [i], kNumOutputChannels );
309
+
310
+ Blocker blocker (kChunkSize [i],
311
+ kBlockSize [i],
312
+ kNumInputChannels ,
313
+ kNumOutputChannels ,
314
+ window.get (),
315
+ kShiftAmount [i],
316
+ &callback);
317
+
318
+ RunTest (&blocker,
319
+ kChunkSize [i],
320
+ kNumFrames ,
321
+ input_cb.channels (),
322
+ input_chunk_cb.channels (),
323
+ output_cb.channels (),
324
+ output_chunk_cb.channels (),
325
+ kNumInputChannels ,
326
+ kNumOutputChannels );
327
+
328
+ ValidateInitialDelay (output_cb.channels (),
329
+ kNumOutputChannels ,
330
+ kNumFrames ,
331
+ kInitialDelay [i]);
332
+ }
333
+ }
334
+
245
335
} // namespace webrtc
0 commit comments