blob: 77cc24dc2b7f5ba1b935b54ceaf9d7f11fe92e67 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/audio_coding/test/TestRedFec.h"
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000012
13#include <assert.h>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "common_types.h"
16#include "modules/audio_coding/codecs/audio_format_conversion.h"
17#include "modules/audio_coding/include/audio_coding_module_typedefs.h"
18#include "modules/audio_coding/test/utility.h"
19#include "test/testsupport/fileutils.h"
20#include "typedefs.h"
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000021
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 }
kwibergda2bf4e2016-10-24 13:47:09 -070080 EXPECT_EQ(true, _acmB->RegisterReceiveCodec(myCodecParam.pltype,
81 CodecInstToSdp(myCodecParam)));
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000082 }
83
84 // Create and connect the channel
85 _channelA2B = new Channel;
86 _acmA->RegisterTransportCallback(_channelA2B);
87 _channelA2B->RegisterReceiverACM(_acmB.get());
88
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000089 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;
kwiberg98ab3a42015-09-30 21:54:21 -0700111#else
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());
kwiberg98ab3a42015-09-30 21:54:21 -0700415
416#endif // defined(WEBRTC_CODEC_G722)
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000417}
418
419int32_t TestRedFec::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
420 return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
421}
422
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000423int16_t TestRedFec::RegisterSendCodec(char side, const char* codecName,
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000424 int32_t samplingFreqHz) {
425 std::cout << std::flush;
426 AudioCodingModule* myACM;
427 switch (side) {
428 case 'A': {
429 myACM = _acmA.get();
430 break;
431 }
432 case 'B': {
433 myACM = _acmB.get();
434 break;
435 }
436 default:
437 return -1;
438 }
439
440 if (myACM == NULL) {
441 assert(false);
442 return -1;
443 }
444 CodecInst myCodecParam;
445 EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
446 samplingFreqHz, 1), -1);
447 EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
448
449 // Initialization was successful.
450 return 0;
451}
452
453void TestRedFec::Run() {
454 AudioFrame audioFrame;
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000455 int32_t outFreqHzB = _outFileB.SamplingFrequency();
Henrik Lundin4d682082015-12-10 16:24:39 +0100456 // Set test length to 500 ms (50 blocks of 10 ms each).
457 _inFileA.SetNum10MsBlocksToRead(50);
458 // Fast-forward 1 second (100 blocks) since the file starts with silence.
459 _inFileA.FastForward(100);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000460
461 while (!_inFileA.EndOfFile()) {
462 EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
henrik.lundin@webrtc.orgf56c1622015-03-02 12:29:30 +0000463 EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
henrik.lundind4ccb002016-05-17 12:21:55 -0700464 bool muted;
465 EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
466 ASSERT_FALSE(muted);
yujo36b1a5f2017-06-12 12:45:32 -0700467 _outFileB.Write10MsData(audioFrame.data(), audioFrame.samples_per_channel_);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000468 }
469 _inFileA.Rewind();
470}
471
472void TestRedFec::OpenOutFile(int16_t test_number) {
473 std::string file_name;
474 std::stringstream file_stream;
475 file_stream << webrtc::test::OutputPath();
476 file_stream << "TestRedFec_outFile_";
477 file_stream << test_number << ".pcm";
478 file_name = file_stream.str();
479 _outFileB.Open(file_name, 16000, "wb");
480}
481
482} // namespace webrtc