blob: 6027a4d0e1ac6305120f8ae29f478fef1647a93d [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#ifndef WEBRTC_CODEC_PCM16
86 EXPECT_TRUE(false) << "PCM16 needs to be activated to run this test\n");
87 return;
88#endif
89 EXPECT_EQ(0, RegisterSendCodec('A', kNameL16, 8000));
90 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 8000));
91 EXPECT_EQ(0, RegisterSendCodec('A', kNameRED));
92 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
93 EXPECT_EQ(0, _acmA->SetREDStatus(true));
94 EXPECT_TRUE(_acmA->REDStatus());
95
96 OpenOutFile(_testCntr);
97 Run();
98 _outFileB.Close();
99
100 RegisterSendCodec('A', kNamePCMU, 8000);
101 // Switch to another 8 kHz codec, RED should remain switched on.
102 EXPECT_TRUE(_acmA->REDStatus());
103 OpenOutFile(_testCntr);
104 Run();
105 _outFileB.Close();
106
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000107#ifndef WEBRTC_CODEC_G722
108 EXPECT_TRUE(false);
109 printf("G722 needs to be activated to run this test\n");
110 return;
111#endif
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000112 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722, 16000));
113 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
114
115#ifdef SUPPORT_RED_WB
116 // Switch codec, RED should remain.
117 EXPECT_TRUE(_acmA->REDStatus());
118#else
119 // Switch to a 16 kHz codec, RED should have been switched off.
120 EXPECT_FALSE(_acmA->REDStatus());
121#endif
122
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000123 OpenOutFile(_testCntr);
124 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
125 EXPECT_EQ(0, _acmA->SetREDStatus(false));
126 EXPECT_FALSE(_acmA->REDStatus());
127 Run();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000128#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000129 EXPECT_EQ(0, _acmA->SetREDStatus(true));
130 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000131#else
132 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
133 EXPECT_FALSE(_acmA->REDStatus());
134#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000135 Run();
136 _outFileB.Close();
137
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000138 RegisterSendCodec('A', kNameISAC, 16000);
139
140#ifdef SUPPORT_RED_WB
141 // Switch codec, RED should remain.
142 EXPECT_TRUE(_acmA->REDStatus());
143#else
144 EXPECT_FALSE(_acmA->REDStatus());
145#endif
146
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000147 OpenOutFile(_testCntr);
148 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
149 EXPECT_EQ(0, _acmA->SetREDStatus(false));
150 EXPECT_FALSE(_acmA->REDStatus());
151 Run();
152 _outFileB.Close();
153
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000154#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000155 EXPECT_EQ(0, _acmA->SetREDStatus(true));
156 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000157#else
158 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
159 EXPECT_FALSE(_acmA->REDStatus());
160#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000161 OpenOutFile(_testCntr);
162 Run();
163 _outFileB.Close();
164
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000165 RegisterSendCodec('A', kNameISAC, 32000);
166
167#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
168 // Switch codec, RED should remain.
169 EXPECT_TRUE(_acmA->REDStatus());
170#else
171 // Switch to a 32 kHz codec, RED should have been switched off.
172 EXPECT_FALSE(_acmA->REDStatus());
173#endif
174
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000175 OpenOutFile(_testCntr);
176 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
177 EXPECT_EQ(0, _acmA->SetREDStatus(false));
178 EXPECT_FALSE(_acmA->REDStatus());
179 Run();
180 _outFileB.Close();
181
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000182#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000183 EXPECT_EQ(0, _acmA->SetREDStatus(true));
184 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000185#else
186 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
187 EXPECT_FALSE(_acmA->REDStatus());
188#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000189 OpenOutFile(_testCntr);
190 Run();
191 _outFileB.Close();
192
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000193 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000194 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000195
196#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
197 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000198 EXPECT_EQ(0, _acmA->SetREDStatus(true));
199 EXPECT_TRUE(_acmA->REDStatus());
200 Run();
201
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000202 RegisterSendCodec('A', kNameISAC, 16000);
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, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000207 EXPECT_TRUE(_acmA->REDStatus());
208 Run();
209
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000210 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000211 EXPECT_TRUE(_acmA->REDStatus());
212 Run();
213 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000214#else
215 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
216 EXPECT_FALSE(_acmA->REDStatus());
217#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000218
219 _channelA2B->SetFECTestWithPacketLoss(true);
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000220 // Following tests are under packet losses.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000221
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000222 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722));
223 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
224
225#if defined(SUPPORT_RED_WB) && defined(SUPPORT_RED_SWB)
226 // Switch codec, RED should remain.
227 EXPECT_TRUE(_acmA->REDStatus());
228#else
229 // Switch to a 16 kHz codec, RED should have been switched off.
230 EXPECT_FALSE(_acmA->REDStatus());
231#endif
232
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000233 OpenOutFile(_testCntr);
234 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
235 EXPECT_EQ(0, _acmA->SetREDStatus(false));
236 EXPECT_FALSE(_acmA->REDStatus());
237 Run();
238 _outFileB.Close();
239
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000240#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000241 EXPECT_EQ(0, _acmA->SetREDStatus(true));
242 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000243#else
244 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
245 EXPECT_FALSE(_acmA->REDStatus());
246#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000247 OpenOutFile(_testCntr);
248 Run();
249 _outFileB.Close();
250
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000251 RegisterSendCodec('A', kNameISAC, 16000);
252
253#ifdef SUPPORT_RED_WB
254 // Switch codec, RED should remain.
255 EXPECT_TRUE(_acmA->REDStatus());
256#else
257 // Switch to a 16 kHz codec, RED should have been switched off.
258 EXPECT_FALSE(_acmA->REDStatus());
259#endif
260
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000261 OpenOutFile(_testCntr);
262 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
263 EXPECT_EQ(0, _acmA->SetREDStatus(false));
264 EXPECT_FALSE(_acmA->REDStatus());
265 Run();
266 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000267#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000268 EXPECT_EQ(0, _acmA->SetREDStatus(true));
269 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000270#else
271 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
272 EXPECT_FALSE(_acmA->REDStatus());
273#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000274 OpenOutFile(_testCntr);
275 Run();
276 _outFileB.Close();
277
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000278 RegisterSendCodec('A', kNameISAC, 32000);
279
280#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
281 // Switch codec, RED should remain.
282 EXPECT_TRUE(_acmA->REDStatus());
283#else
284 // Switch to a 32 kHz codec, RED should have been switched off.
285 EXPECT_FALSE(_acmA->REDStatus());
286#endif
287
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000288 OpenOutFile(_testCntr);
289 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
290 EXPECT_EQ(0, _acmA->SetREDStatus(false));
291 EXPECT_FALSE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000292#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000293 EXPECT_EQ(0, _acmA->SetREDStatus(true));
294 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000295#else
296 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
297 EXPECT_FALSE(_acmA->REDStatus());
298#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000299 OpenOutFile(_testCntr);
300 Run();
301 _outFileB.Close();
302
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000303 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000304 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000305#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
306 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000307 EXPECT_EQ(0, _acmA->SetREDStatus(true));
308 EXPECT_TRUE(_acmA->REDStatus());
309 Run();
310
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000311 RegisterSendCodec('A', kNameISAC, 16000);
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, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000316 EXPECT_TRUE(_acmA->REDStatus());
317 Run();
318
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000319 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000320 EXPECT_TRUE(_acmA->REDStatus());
321 Run();
322 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000323#else
324 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
325 EXPECT_FALSE(_acmA->REDStatus());
326#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000327
328#ifndef WEBRTC_CODEC_OPUS
329 EXPECT_TRUE(false);
330 printf("Opus needs to be activated to run this test\n");
331 return;
332#endif
333
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000334 RegisterSendCodec('A', kNameOPUS, 48000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000335
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000336#if defined(SUPPORT_RED_FB) && defined(SUPPORT_RED_SWB) &&\
337 defined(SUPPORT_RED_WB)
338 // Switch to codec, RED should remain switched on.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000339 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000340#else
341 EXPECT_FALSE(_acmA->REDStatus());
342#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000343
344 // _channelA2B imposes 25% packet loss rate.
345 EXPECT_EQ(0, _acmA->SetPacketLossRate(25));
346
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000347#ifdef SUPPORT_RED_FB
348 EXPECT_EQ(0, _acmA->SetREDStatus(true));
349 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000350 // Codec FEC and RED are mutually exclusive.
351 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
352
353 EXPECT_EQ(0, _acmA->SetREDStatus(false));
354 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
355
356 // Codec FEC and RED are mutually exclusive.
357 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000358#else
359 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
360 EXPECT_FALSE(_acmA->REDStatus());
361 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
362#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000363
364 EXPECT_TRUE(_acmA->CodecFEC());
365 OpenOutFile(_testCntr);
366 Run();
367
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000368 // Switch to L16 with RED.
369 RegisterSendCodec('A', kNameL16, 8000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000370 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
371
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000372 // L16 does not support FEC, so FEC should be turned off automatically.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000373 EXPECT_FALSE(_acmA->CodecFEC());
374
375 EXPECT_EQ(0, _acmA->SetREDStatus(true));
376 EXPECT_TRUE(_acmA->REDStatus());
377 Run();
378
379 // Switch to Opus again.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000380 RegisterSendCodec('A', kNameOPUS, 48000);
381#ifdef SUPPORT_RED_FB
382 // Switch to codec, RED should remain switched on.
383 EXPECT_TRUE(_acmA->REDStatus());
384#else
385 EXPECT_FALSE(_acmA->REDStatus());
386#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000387 EXPECT_EQ(0, _acmA->SetREDStatus(false));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000388 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000389 Run();
390
391 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
392 _outFileB.Close();
393
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000394 // Codecs does not support internal FEC, cannot enable FEC.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000395 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000396 EXPECT_FALSE(_acmA->REDStatus());
397 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
398 EXPECT_FALSE(_acmA->CodecFEC());
399
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000400 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000401 EXPECT_FALSE(_acmA->REDStatus());
402 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
403 EXPECT_FALSE(_acmA->CodecFEC());
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000404
405 // Codecs does not support internal FEC, disable FEC does not trigger failure.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000406 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000407 EXPECT_FALSE(_acmA->REDStatus());
408 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
409 EXPECT_FALSE(_acmA->CodecFEC());
410
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000411 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000412 EXPECT_FALSE(_acmA->REDStatus());
413 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
414 EXPECT_FALSE(_acmA->CodecFEC());
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000415}
416
417int32_t TestRedFec::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
418 return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
419}
420
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000421int16_t TestRedFec::RegisterSendCodec(char side, const char* codecName,
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000422 int32_t samplingFreqHz) {
423 std::cout << std::flush;
424 AudioCodingModule* myACM;
425 switch (side) {
426 case 'A': {
427 myACM = _acmA.get();
428 break;
429 }
430 case 'B': {
431 myACM = _acmB.get();
432 break;
433 }
434 default:
435 return -1;
436 }
437
438 if (myACM == NULL) {
439 assert(false);
440 return -1;
441 }
442 CodecInst myCodecParam;
443 EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
444 samplingFreqHz, 1), -1);
445 EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
446
447 // Initialization was successful.
448 return 0;
449}
450
451void TestRedFec::Run() {
452 AudioFrame audioFrame;
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000453 int32_t outFreqHzB = _outFileB.SamplingFrequency();
454
455 while (!_inFileA.EndOfFile()) {
456 EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
henrik.lundin@webrtc.orgf56c1622015-03-02 12:29:30 +0000457 EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000458 EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame));
459 _outFileB.Write10MsData(audioFrame.data_, audioFrame.samples_per_channel_);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000460 }
461 _inFileA.Rewind();
462}
463
464void TestRedFec::OpenOutFile(int16_t test_number) {
465 std::string file_name;
466 std::stringstream file_stream;
467 file_stream << webrtc::test::OutputPath();
468 file_stream << "TestRedFec_outFile_";
469 file_stream << test_number << ".pcm";
470 file_name = file_stream.str();
471 _outFileB.Open(file_name, 16000, "wb");
472}
473
474} // namespace webrtc