blob: dbb238f4998610e50579593b486334dc69713508 [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
kjellander3e6db232015-11-26 04:44:54 -080011#include "webrtc/modules/audio_coding/test/TestRedFec.h"
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000012
13#include <assert.h>
14
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000015#include "webrtc/common_types.h"
16#include "webrtc/engine_configurations.h"
kjellander3e6db232015-11-26 04:44:54 -080017#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
18#include "webrtc/modules/audio_coding/test/utility.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010019#include "webrtc/system_wrappers/include/trace.h"
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000020#include "webrtc/test/testsupport/fileutils.h"
21
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000022#ifdef SUPPORT_RED_WB
23#undef SUPPORT_RED_WB
24#endif
25
26#ifdef SUPPORT_RED_SWB
27#undef SUPPORT_RED_SWB
28#endif
29
30#ifdef SUPPORT_RED_FB
31#undef SUPPORT_RED_FB
32#endif
33
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000034namespace webrtc {
35
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000036namespace {
37 const char kNameL16[] = "L16";
38 const char kNamePCMU[] = "PCMU";
kwiberg98ab3a42015-09-30 21:54:21 -070039 const char kNameCN[] = "CN";
40 const char kNameRED[] = "RED";
41
42 // These three are only used by code #ifdeffed on WEBRTC_CODEC_G722.
43#ifdef WEBRTC_CODEC_G722
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000044 const char kNameISAC[] = "ISAC";
45 const char kNameG722[] = "G722";
46 const char kNameOPUS[] = "opus";
kwiberg98ab3a42015-09-30 21:54:21 -070047#endif
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000048}
49
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000050TestRedFec::TestRedFec()
51 : _acmA(AudioCodingModule::Create(0)),
52 _acmB(AudioCodingModule::Create(1)),
53 _channelA2B(NULL),
54 _testCntr(0) {
55}
56
57TestRedFec::~TestRedFec() {
58 if (_channelA2B != NULL) {
59 delete _channelA2B;
60 _channelA2B = NULL;
61 }
62}
63
64void TestRedFec::Perform() {
65 const std::string file_name = webrtc::test::ResourcePath(
66 "audio_coding/testfile32kHz", "pcm");
67 _inFileA.Open(file_name, 32000, "rb");
68
69 ASSERT_EQ(0, _acmA->InitializeReceiver());
70 ASSERT_EQ(0, _acmB->InitializeReceiver());
71
72 uint8_t numEncoders = _acmA->NumberOfCodecs();
73 CodecInst myCodecParam;
74 for (uint8_t n = 0; n < numEncoders; n++) {
75 EXPECT_EQ(0, _acmB->Codec(n, &myCodecParam));
76 // Default number of channels is 2 for opus, so we change to 1 in this test.
77 if (!strcmp(myCodecParam.plname, "opus")) {
78 myCodecParam.channels = 1;
79 }
80 EXPECT_EQ(0, _acmB->RegisterReceiveCodec(myCodecParam));
81 }
82
83 // Create and connect the channel
84 _channelA2B = new Channel;
85 _acmA->RegisterTransportCallback(_channelA2B);
86 _channelA2B->RegisterReceiverACM(_acmB.get());
87
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000088 EXPECT_EQ(0, RegisterSendCodec('A', kNameL16, 8000));
89 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 8000));
90 EXPECT_EQ(0, RegisterSendCodec('A', kNameRED));
91 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
92 EXPECT_EQ(0, _acmA->SetREDStatus(true));
93 EXPECT_TRUE(_acmA->REDStatus());
94
95 OpenOutFile(_testCntr);
96 Run();
97 _outFileB.Close();
98
99 RegisterSendCodec('A', kNamePCMU, 8000);
100 // Switch to another 8 kHz codec, RED should remain switched on.
101 EXPECT_TRUE(_acmA->REDStatus());
102 OpenOutFile(_testCntr);
103 Run();
104 _outFileB.Close();
105
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000106#ifndef WEBRTC_CODEC_G722
107 EXPECT_TRUE(false);
108 printf("G722 needs to be activated to run this test\n");
109 return;
kwiberg98ab3a42015-09-30 21:54:21 -0700110#else
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000111 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722, 16000));
112 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
113
114#ifdef SUPPORT_RED_WB
115 // Switch codec, RED should remain.
116 EXPECT_TRUE(_acmA->REDStatus());
117#else
118 // Switch to a 16 kHz codec, RED should have been switched off.
119 EXPECT_FALSE(_acmA->REDStatus());
120#endif
121
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000122 OpenOutFile(_testCntr);
123 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
124 EXPECT_EQ(0, _acmA->SetREDStatus(false));
125 EXPECT_FALSE(_acmA->REDStatus());
126 Run();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000127#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000128 EXPECT_EQ(0, _acmA->SetREDStatus(true));
129 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000130#else
131 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
132 EXPECT_FALSE(_acmA->REDStatus());
133#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000134 Run();
135 _outFileB.Close();
136
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000137 RegisterSendCodec('A', kNameISAC, 16000);
138
139#ifdef SUPPORT_RED_WB
140 // Switch codec, RED should remain.
141 EXPECT_TRUE(_acmA->REDStatus());
142#else
143 EXPECT_FALSE(_acmA->REDStatus());
144#endif
145
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000146 OpenOutFile(_testCntr);
147 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
148 EXPECT_EQ(0, _acmA->SetREDStatus(false));
149 EXPECT_FALSE(_acmA->REDStatus());
150 Run();
151 _outFileB.Close();
152
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000153#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000154 EXPECT_EQ(0, _acmA->SetREDStatus(true));
155 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000156#else
157 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
158 EXPECT_FALSE(_acmA->REDStatus());
159#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000160 OpenOutFile(_testCntr);
161 Run();
162 _outFileB.Close();
163
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000164 RegisterSendCodec('A', kNameISAC, 32000);
165
166#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
167 // Switch codec, RED should remain.
168 EXPECT_TRUE(_acmA->REDStatus());
169#else
170 // Switch to a 32 kHz codec, RED should have been switched off.
171 EXPECT_FALSE(_acmA->REDStatus());
172#endif
173
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000174 OpenOutFile(_testCntr);
175 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
176 EXPECT_EQ(0, _acmA->SetREDStatus(false));
177 EXPECT_FALSE(_acmA->REDStatus());
178 Run();
179 _outFileB.Close();
180
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000181#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000182 EXPECT_EQ(0, _acmA->SetREDStatus(true));
183 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000184#else
185 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
186 EXPECT_FALSE(_acmA->REDStatus());
187#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000188 OpenOutFile(_testCntr);
189 Run();
190 _outFileB.Close();
191
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000192 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000193 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000194
195#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
196 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000197 EXPECT_EQ(0, _acmA->SetREDStatus(true));
198 EXPECT_TRUE(_acmA->REDStatus());
199 Run();
200
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000201 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000202 EXPECT_TRUE(_acmA->REDStatus());
203 Run();
204
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000205 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000206 EXPECT_TRUE(_acmA->REDStatus());
207 Run();
208
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000209 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000210 EXPECT_TRUE(_acmA->REDStatus());
211 Run();
212 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000213#else
214 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
215 EXPECT_FALSE(_acmA->REDStatus());
216#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000217
218 _channelA2B->SetFECTestWithPacketLoss(true);
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000219 // Following tests are under packet losses.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000220
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000221 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722));
222 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
223
224#if defined(SUPPORT_RED_WB) && defined(SUPPORT_RED_SWB)
225 // Switch codec, RED should remain.
226 EXPECT_TRUE(_acmA->REDStatus());
227#else
228 // Switch to a 16 kHz codec, RED should have been switched off.
229 EXPECT_FALSE(_acmA->REDStatus());
230#endif
231
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000232 OpenOutFile(_testCntr);
233 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
234 EXPECT_EQ(0, _acmA->SetREDStatus(false));
235 EXPECT_FALSE(_acmA->REDStatus());
236 Run();
237 _outFileB.Close();
238
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000239#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000240 EXPECT_EQ(0, _acmA->SetREDStatus(true));
241 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000242#else
243 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
244 EXPECT_FALSE(_acmA->REDStatus());
245#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000246 OpenOutFile(_testCntr);
247 Run();
248 _outFileB.Close();
249
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000250 RegisterSendCodec('A', kNameISAC, 16000);
251
252#ifdef SUPPORT_RED_WB
253 // Switch codec, RED should remain.
254 EXPECT_TRUE(_acmA->REDStatus());
255#else
256 // Switch to a 16 kHz codec, RED should have been switched off.
257 EXPECT_FALSE(_acmA->REDStatus());
258#endif
259
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000260 OpenOutFile(_testCntr);
261 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
262 EXPECT_EQ(0, _acmA->SetREDStatus(false));
263 EXPECT_FALSE(_acmA->REDStatus());
264 Run();
265 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000266#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000267 EXPECT_EQ(0, _acmA->SetREDStatus(true));
268 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000269#else
270 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
271 EXPECT_FALSE(_acmA->REDStatus());
272#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000273 OpenOutFile(_testCntr);
274 Run();
275 _outFileB.Close();
276
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000277 RegisterSendCodec('A', kNameISAC, 32000);
278
279#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
280 // Switch codec, RED should remain.
281 EXPECT_TRUE(_acmA->REDStatus());
282#else
283 // Switch to a 32 kHz codec, RED should have been switched off.
284 EXPECT_FALSE(_acmA->REDStatus());
285#endif
286
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000287 OpenOutFile(_testCntr);
288 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
289 EXPECT_EQ(0, _acmA->SetREDStatus(false));
290 EXPECT_FALSE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000291#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000292 EXPECT_EQ(0, _acmA->SetREDStatus(true));
293 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000294#else
295 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
296 EXPECT_FALSE(_acmA->REDStatus());
297#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000298 OpenOutFile(_testCntr);
299 Run();
300 _outFileB.Close();
301
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000302 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000303 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000304#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
305 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000306 EXPECT_EQ(0, _acmA->SetREDStatus(true));
307 EXPECT_TRUE(_acmA->REDStatus());
308 Run();
309
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000310 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000311 EXPECT_TRUE(_acmA->REDStatus());
312 Run();
313
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000314 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000315 EXPECT_TRUE(_acmA->REDStatus());
316 Run();
317
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000318 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000319 EXPECT_TRUE(_acmA->REDStatus());
320 Run();
321 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000322#else
323 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
324 EXPECT_FALSE(_acmA->REDStatus());
325#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000326
327#ifndef WEBRTC_CODEC_OPUS
328 EXPECT_TRUE(false);
329 printf("Opus needs to be activated to run this test\n");
330 return;
331#endif
332
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000333 RegisterSendCodec('A', kNameOPUS, 48000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000334
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000335#if defined(SUPPORT_RED_FB) && defined(SUPPORT_RED_SWB) &&\
336 defined(SUPPORT_RED_WB)
337 // Switch to codec, RED should remain switched on.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000338 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000339#else
340 EXPECT_FALSE(_acmA->REDStatus());
341#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000342
343 // _channelA2B imposes 25% packet loss rate.
344 EXPECT_EQ(0, _acmA->SetPacketLossRate(25));
345
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000346#ifdef SUPPORT_RED_FB
347 EXPECT_EQ(0, _acmA->SetREDStatus(true));
348 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000349 // Codec FEC and RED are mutually exclusive.
350 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
351
352 EXPECT_EQ(0, _acmA->SetREDStatus(false));
353 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
354
355 // Codec FEC and RED are mutually exclusive.
356 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000357#else
358 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
359 EXPECT_FALSE(_acmA->REDStatus());
360 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
361#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000362
363 EXPECT_TRUE(_acmA->CodecFEC());
364 OpenOutFile(_testCntr);
365 Run();
366
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000367 // Switch to L16 with RED.
368 RegisterSendCodec('A', kNameL16, 8000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000369 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
370
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000371 // L16 does not support FEC, so FEC should be turned off automatically.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000372 EXPECT_FALSE(_acmA->CodecFEC());
373
374 EXPECT_EQ(0, _acmA->SetREDStatus(true));
375 EXPECT_TRUE(_acmA->REDStatus());
376 Run();
377
378 // Switch to Opus again.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000379 RegisterSendCodec('A', kNameOPUS, 48000);
380#ifdef SUPPORT_RED_FB
381 // Switch to codec, RED should remain switched on.
382 EXPECT_TRUE(_acmA->REDStatus());
383#else
384 EXPECT_FALSE(_acmA->REDStatus());
385#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000386 EXPECT_EQ(0, _acmA->SetREDStatus(false));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000387 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000388 Run();
389
390 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
391 _outFileB.Close();
392
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000393 // Codecs does not support internal FEC, cannot enable FEC.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000394 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000395 EXPECT_FALSE(_acmA->REDStatus());
396 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
397 EXPECT_FALSE(_acmA->CodecFEC());
398
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000399 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000400 EXPECT_FALSE(_acmA->REDStatus());
401 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
402 EXPECT_FALSE(_acmA->CodecFEC());
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000403
404 // Codecs does not support internal FEC, disable FEC does not trigger failure.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000405 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000406 EXPECT_FALSE(_acmA->REDStatus());
407 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
408 EXPECT_FALSE(_acmA->CodecFEC());
409
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000410 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000411 EXPECT_FALSE(_acmA->REDStatus());
412 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
413 EXPECT_FALSE(_acmA->CodecFEC());
kwiberg98ab3a42015-09-30 21:54:21 -0700414
415#endif // defined(WEBRTC_CODEC_G722)
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000416}
417
418int32_t TestRedFec::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
419 return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
420}
421
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000422int16_t TestRedFec::RegisterSendCodec(char side, const char* codecName,
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000423 int32_t samplingFreqHz) {
424 std::cout << std::flush;
425 AudioCodingModule* myACM;
426 switch (side) {
427 case 'A': {
428 myACM = _acmA.get();
429 break;
430 }
431 case 'B': {
432 myACM = _acmB.get();
433 break;
434 }
435 default:
436 return -1;
437 }
438
439 if (myACM == NULL) {
440 assert(false);
441 return -1;
442 }
443 CodecInst myCodecParam;
444 EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
445 samplingFreqHz, 1), -1);
446 EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
447
448 // Initialization was successful.
449 return 0;
450}
451
452void TestRedFec::Run() {
453 AudioFrame audioFrame;
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000454 int32_t outFreqHzB = _outFileB.SamplingFrequency();
Henrik Lundin4d682082015-12-10 16:24:39 +0100455 // Set test length to 500 ms (50 blocks of 10 ms each).
456 _inFileA.SetNum10MsBlocksToRead(50);
457 // Fast-forward 1 second (100 blocks) since the file starts with silence.
458 _inFileA.FastForward(100);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000459
460 while (!_inFileA.EndOfFile()) {
461 EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
henrik.lundin@webrtc.orgf56c1622015-03-02 12:29:30 +0000462 EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
henrik.lundind4ccb002016-05-17 12:21:55 -0700463 bool muted;
464 EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
465 ASSERT_FALSE(muted);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000466 _outFileB.Write10MsData(audioFrame.data_, audioFrame.samples_per_channel_);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000467 }
468 _inFileA.Rewind();
469}
470
471void TestRedFec::OpenOutFile(int16_t test_number) {
472 std::string file_name;
473 std::stringstream file_stream;
474 file_stream << webrtc::test::OutputPath();
475 file_stream << "TestRedFec_outFile_";
476 file_stream << test_number << ".pcm";
477 file_name = file_stream.str();
478 _outFileB.Open(file_name, 16000, "wb");
479}
480
481} // namespace webrtc