blob: a48b2ebdfec97d24a8f8c24537de6aa8f50ed576 [file] [log] [blame]
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +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/main/test/TestRedFec.h"
12
13#include <assert.h>
14
15#include "webrtc/common.h"
16#include "webrtc/common_types.h"
17#include "webrtc/engine_configurations.h"
18#include "webrtc/modules/audio_coding/main/interface/audio_coding_module_typedefs.h"
19#include "webrtc/modules/audio_coding/main/test/utility.h"
20#include "webrtc/system_wrappers/interface/trace.h"
21#include "webrtc/test/testsupport/fileutils.h"
22
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000023#ifdef SUPPORT_RED_WB
24#undef SUPPORT_RED_WB
25#endif
26
27#ifdef SUPPORT_RED_SWB
28#undef SUPPORT_RED_SWB
29#endif
30
31#ifdef SUPPORT_RED_FB
32#undef SUPPORT_RED_FB
33#endif
34
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000035namespace webrtc {
36
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000037namespace {
38 const char kNameL16[] = "L16";
39 const char kNamePCMU[] = "PCMU";
40 const char kNameISAC[] = "ISAC";
41 const char kNameG722[] = "G722";
42 const char kNameOPUS[] = "opus";
43 const char kNameCN[] = "CN";
44 const char kNameRED[] = "RED";
45}
46
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000047TestRedFec::TestRedFec()
48 : _acmA(AudioCodingModule::Create(0)),
49 _acmB(AudioCodingModule::Create(1)),
50 _channelA2B(NULL),
51 _testCntr(0) {
52}
53
54TestRedFec::~TestRedFec() {
55 if (_channelA2B != NULL) {
56 delete _channelA2B;
57 _channelA2B = NULL;
58 }
59}
60
61void TestRedFec::Perform() {
62 const std::string file_name = webrtc::test::ResourcePath(
63 "audio_coding/testfile32kHz", "pcm");
64 _inFileA.Open(file_name, 32000, "rb");
65
66 ASSERT_EQ(0, _acmA->InitializeReceiver());
67 ASSERT_EQ(0, _acmB->InitializeReceiver());
68
69 uint8_t numEncoders = _acmA->NumberOfCodecs();
70 CodecInst myCodecParam;
71 for (uint8_t n = 0; n < numEncoders; n++) {
72 EXPECT_EQ(0, _acmB->Codec(n, &myCodecParam));
73 // Default number of channels is 2 for opus, so we change to 1 in this test.
74 if (!strcmp(myCodecParam.plname, "opus")) {
75 myCodecParam.channels = 1;
76 }
77 EXPECT_EQ(0, _acmB->RegisterReceiveCodec(myCodecParam));
78 }
79
80 // Create and connect the channel
81 _channelA2B = new Channel;
82 _acmA->RegisterTransportCallback(_channelA2B);
83 _channelA2B->RegisterReceiverACM(_acmB.get());
84
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000085 EXPECT_EQ(0, RegisterSendCodec('A', kNameL16, 8000));
86 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 8000));
87 EXPECT_EQ(0, RegisterSendCodec('A', kNameRED));
88 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
89 EXPECT_EQ(0, _acmA->SetREDStatus(true));
90 EXPECT_TRUE(_acmA->REDStatus());
91
92 OpenOutFile(_testCntr);
93 Run();
94 _outFileB.Close();
95
96 RegisterSendCodec('A', kNamePCMU, 8000);
97 // Switch to another 8 kHz codec, RED should remain switched on.
98 EXPECT_TRUE(_acmA->REDStatus());
99 OpenOutFile(_testCntr);
100 Run();
101 _outFileB.Close();
102
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000103#ifndef WEBRTC_CODEC_G722
104 EXPECT_TRUE(false);
105 printf("G722 needs to be activated to run this test\n");
106 return;
107#endif
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000108 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722, 16000));
109 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
110
111#ifdef SUPPORT_RED_WB
112 // Switch codec, RED should remain.
113 EXPECT_TRUE(_acmA->REDStatus());
114#else
115 // Switch to a 16 kHz codec, RED should have been switched off.
116 EXPECT_FALSE(_acmA->REDStatus());
117#endif
118
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000119 OpenOutFile(_testCntr);
120 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
121 EXPECT_EQ(0, _acmA->SetREDStatus(false));
122 EXPECT_FALSE(_acmA->REDStatus());
123 Run();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000124#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000125 EXPECT_EQ(0, _acmA->SetREDStatus(true));
126 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000127#else
128 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
129 EXPECT_FALSE(_acmA->REDStatus());
130#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000131 Run();
132 _outFileB.Close();
133
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000134 RegisterSendCodec('A', kNameISAC, 16000);
135
136#ifdef SUPPORT_RED_WB
137 // Switch codec, RED should remain.
138 EXPECT_TRUE(_acmA->REDStatus());
139#else
140 EXPECT_FALSE(_acmA->REDStatus());
141#endif
142
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000143 OpenOutFile(_testCntr);
144 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
145 EXPECT_EQ(0, _acmA->SetREDStatus(false));
146 EXPECT_FALSE(_acmA->REDStatus());
147 Run();
148 _outFileB.Close();
149
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000150#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000151 EXPECT_EQ(0, _acmA->SetREDStatus(true));
152 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000153#else
154 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
155 EXPECT_FALSE(_acmA->REDStatus());
156#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000157 OpenOutFile(_testCntr);
158 Run();
159 _outFileB.Close();
160
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000161 RegisterSendCodec('A', kNameISAC, 32000);
162
163#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
164 // Switch codec, RED should remain.
165 EXPECT_TRUE(_acmA->REDStatus());
166#else
167 // Switch to a 32 kHz codec, RED should have been switched off.
168 EXPECT_FALSE(_acmA->REDStatus());
169#endif
170
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000171 OpenOutFile(_testCntr);
172 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
173 EXPECT_EQ(0, _acmA->SetREDStatus(false));
174 EXPECT_FALSE(_acmA->REDStatus());
175 Run();
176 _outFileB.Close();
177
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000178#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000179 EXPECT_EQ(0, _acmA->SetREDStatus(true));
180 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000181#else
182 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
183 EXPECT_FALSE(_acmA->REDStatus());
184#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000185 OpenOutFile(_testCntr);
186 Run();
187 _outFileB.Close();
188
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000189 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000190 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000191
192#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
193 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000194 EXPECT_EQ(0, _acmA->SetREDStatus(true));
195 EXPECT_TRUE(_acmA->REDStatus());
196 Run();
197
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000198 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000199 EXPECT_TRUE(_acmA->REDStatus());
200 Run();
201
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000202 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000203 EXPECT_TRUE(_acmA->REDStatus());
204 Run();
205
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000206 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000207 EXPECT_TRUE(_acmA->REDStatus());
208 Run();
209 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000210#else
211 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
212 EXPECT_FALSE(_acmA->REDStatus());
213#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000214
215 _channelA2B->SetFECTestWithPacketLoss(true);
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000216 // Following tests are under packet losses.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000217
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000218 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722));
219 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
220
221#if defined(SUPPORT_RED_WB) && defined(SUPPORT_RED_SWB)
222 // Switch codec, RED should remain.
223 EXPECT_TRUE(_acmA->REDStatus());
224#else
225 // Switch to a 16 kHz codec, RED should have been switched off.
226 EXPECT_FALSE(_acmA->REDStatus());
227#endif
228
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000229 OpenOutFile(_testCntr);
230 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
231 EXPECT_EQ(0, _acmA->SetREDStatus(false));
232 EXPECT_FALSE(_acmA->REDStatus());
233 Run();
234 _outFileB.Close();
235
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000236#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000237 EXPECT_EQ(0, _acmA->SetREDStatus(true));
238 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000239#else
240 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
241 EXPECT_FALSE(_acmA->REDStatus());
242#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000243 OpenOutFile(_testCntr);
244 Run();
245 _outFileB.Close();
246
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000247 RegisterSendCodec('A', kNameISAC, 16000);
248
249#ifdef SUPPORT_RED_WB
250 // Switch codec, RED should remain.
251 EXPECT_TRUE(_acmA->REDStatus());
252#else
253 // Switch to a 16 kHz codec, RED should have been switched off.
254 EXPECT_FALSE(_acmA->REDStatus());
255#endif
256
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000257 OpenOutFile(_testCntr);
258 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
259 EXPECT_EQ(0, _acmA->SetREDStatus(false));
260 EXPECT_FALSE(_acmA->REDStatus());
261 Run();
262 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000263#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000264 EXPECT_EQ(0, _acmA->SetREDStatus(true));
265 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000266#else
267 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
268 EXPECT_FALSE(_acmA->REDStatus());
269#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000270 OpenOutFile(_testCntr);
271 Run();
272 _outFileB.Close();
273
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000274 RegisterSendCodec('A', kNameISAC, 32000);
275
276#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
277 // Switch codec, RED should remain.
278 EXPECT_TRUE(_acmA->REDStatus());
279#else
280 // Switch to a 32 kHz codec, RED should have been switched off.
281 EXPECT_FALSE(_acmA->REDStatus());
282#endif
283
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000284 OpenOutFile(_testCntr);
285 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
286 EXPECT_EQ(0, _acmA->SetREDStatus(false));
287 EXPECT_FALSE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000288#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000289 EXPECT_EQ(0, _acmA->SetREDStatus(true));
290 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000291#else
292 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
293 EXPECT_FALSE(_acmA->REDStatus());
294#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000295 OpenOutFile(_testCntr);
296 Run();
297 _outFileB.Close();
298
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000299 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000300 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000301#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
302 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000303 EXPECT_EQ(0, _acmA->SetREDStatus(true));
304 EXPECT_TRUE(_acmA->REDStatus());
305 Run();
306
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000307 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000308 EXPECT_TRUE(_acmA->REDStatus());
309 Run();
310
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000311 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000312 EXPECT_TRUE(_acmA->REDStatus());
313 Run();
314
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000315 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000316 EXPECT_TRUE(_acmA->REDStatus());
317 Run();
318 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000319#else
320 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
321 EXPECT_FALSE(_acmA->REDStatus());
322#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000323
324#ifndef WEBRTC_CODEC_OPUS
325 EXPECT_TRUE(false);
326 printf("Opus needs to be activated to run this test\n");
327 return;
328#endif
329
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000330 RegisterSendCodec('A', kNameOPUS, 48000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000331
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000332#if defined(SUPPORT_RED_FB) && defined(SUPPORT_RED_SWB) &&\
333 defined(SUPPORT_RED_WB)
334 // Switch to codec, RED should remain switched on.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000335 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000336#else
337 EXPECT_FALSE(_acmA->REDStatus());
338#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000339
340 // _channelA2B imposes 25% packet loss rate.
341 EXPECT_EQ(0, _acmA->SetPacketLossRate(25));
342
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000343#ifdef SUPPORT_RED_FB
344 EXPECT_EQ(0, _acmA->SetREDStatus(true));
345 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000346 // Codec FEC and RED are mutually exclusive.
347 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
348
349 EXPECT_EQ(0, _acmA->SetREDStatus(false));
350 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
351
352 // Codec FEC and RED are mutually exclusive.
353 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000354#else
355 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
356 EXPECT_FALSE(_acmA->REDStatus());
357 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
358#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000359
360 EXPECT_TRUE(_acmA->CodecFEC());
361 OpenOutFile(_testCntr);
362 Run();
363
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000364 // Switch to L16 with RED.
365 RegisterSendCodec('A', kNameL16, 8000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000366 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
367
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000368 // L16 does not support FEC, so FEC should be turned off automatically.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000369 EXPECT_FALSE(_acmA->CodecFEC());
370
371 EXPECT_EQ(0, _acmA->SetREDStatus(true));
372 EXPECT_TRUE(_acmA->REDStatus());
373 Run();
374
375 // Switch to Opus again.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000376 RegisterSendCodec('A', kNameOPUS, 48000);
377#ifdef SUPPORT_RED_FB
378 // Switch to codec, RED should remain switched on.
379 EXPECT_TRUE(_acmA->REDStatus());
380#else
381 EXPECT_FALSE(_acmA->REDStatus());
382#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000383 EXPECT_EQ(0, _acmA->SetREDStatus(false));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000384 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000385 Run();
386
387 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
388 _outFileB.Close();
389
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000390 // Codecs does not support internal FEC, cannot enable FEC.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000391 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000392 EXPECT_FALSE(_acmA->REDStatus());
393 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
394 EXPECT_FALSE(_acmA->CodecFEC());
395
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000396 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000397 EXPECT_FALSE(_acmA->REDStatus());
398 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
399 EXPECT_FALSE(_acmA->CodecFEC());
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000400
401 // Codecs does not support internal FEC, disable FEC does not trigger failure.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000402 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000403 EXPECT_FALSE(_acmA->REDStatus());
404 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
405 EXPECT_FALSE(_acmA->CodecFEC());
406
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000407 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000408 EXPECT_FALSE(_acmA->REDStatus());
409 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
410 EXPECT_FALSE(_acmA->CodecFEC());
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000411}
412
413int32_t TestRedFec::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
414 return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
415}
416
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000417int16_t TestRedFec::RegisterSendCodec(char side, const char* codecName,
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000418 int32_t samplingFreqHz) {
419 std::cout << std::flush;
420 AudioCodingModule* myACM;
421 switch (side) {
422 case 'A': {
423 myACM = _acmA.get();
424 break;
425 }
426 case 'B': {
427 myACM = _acmB.get();
428 break;
429 }
430 default:
431 return -1;
432 }
433
434 if (myACM == NULL) {
435 assert(false);
436 return -1;
437 }
438 CodecInst myCodecParam;
439 EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
440 samplingFreqHz, 1), -1);
441 EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
442
443 // Initialization was successful.
444 return 0;
445}
446
447void TestRedFec::Run() {
448 AudioFrame audioFrame;
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000449 int32_t outFreqHzB = _outFileB.SamplingFrequency();
450
451 while (!_inFileA.EndOfFile()) {
452 EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
henrik.lundin@webrtc.orgf56c1622015-03-02 12:29:30 +0000453 EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000454 EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame));
455 _outFileB.Write10MsData(audioFrame.data_, audioFrame.samples_per_channel_);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000456 }
457 _inFileA.Rewind();
458}
459
460void TestRedFec::OpenOutFile(int16_t test_number) {
461 std::string file_name;
462 std::stringstream file_stream;
463 file_stream << webrtc::test::OutputPath();
464 file_stream << "TestRedFec_outFile_";
465 file_stream << test_number << ".pcm";
466 file_name = file_stream.str();
467 _outFileB.Open(file_name, 16000, "wb");
468}
469
470} // namespace webrtc