blob: 034c5954afe9c53381146ca3c606a5e9f6904f01 [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 Bonadei71207422017-09-15 13:58:09 +020015#include "common_types.h" // NOLINT(build/include)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#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"
Mirko Bonadei71207422017-09-15 13:58:09 +020020#include "typedefs.h" // NOLINT(build/include)
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";
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000041 const char kNameISAC[] = "ISAC";
42 const char kNameG722[] = "G722";
43 const char kNameOPUS[] = "opus";
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +000044}
45
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000046TestRedFec::TestRedFec()
solenbergc7b4a452017-09-28 07:37:11 -070047 : _acmA(AudioCodingModule::Create()),
48 _acmB(AudioCodingModule::Create()),
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000049 _channelA2B(NULL),
50 _testCntr(0) {
51}
52
53TestRedFec::~TestRedFec() {
54 if (_channelA2B != NULL) {
55 delete _channelA2B;
56 _channelA2B = NULL;
57 }
58}
59
60void TestRedFec::Perform() {
61 const std::string file_name = webrtc::test::ResourcePath(
62 "audio_coding/testfile32kHz", "pcm");
63 _inFileA.Open(file_name, 32000, "rb");
64
65 ASSERT_EQ(0, _acmA->InitializeReceiver());
66 ASSERT_EQ(0, _acmB->InitializeReceiver());
67
68 uint8_t numEncoders = _acmA->NumberOfCodecs();
69 CodecInst myCodecParam;
70 for (uint8_t n = 0; n < numEncoders; n++) {
71 EXPECT_EQ(0, _acmB->Codec(n, &myCodecParam));
72 // Default number of channels is 2 for opus, so we change to 1 in this test.
73 if (!strcmp(myCodecParam.plname, "opus")) {
74 myCodecParam.channels = 1;
75 }
kwibergda2bf4e2016-10-24 13:47:09 -070076 EXPECT_EQ(true, _acmB->RegisterReceiveCodec(myCodecParam.pltype,
77 CodecInstToSdp(myCodecParam)));
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +000078 }
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.org41d2bef2015-03-23 12:57:45 +0000103 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722, 16000));
104 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
105
106#ifdef SUPPORT_RED_WB
107 // Switch codec, RED should remain.
108 EXPECT_TRUE(_acmA->REDStatus());
109#else
110 // Switch to a 16 kHz codec, RED should have been switched off.
111 EXPECT_FALSE(_acmA->REDStatus());
112#endif
113
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000114 OpenOutFile(_testCntr);
115 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
116 EXPECT_EQ(0, _acmA->SetREDStatus(false));
117 EXPECT_FALSE(_acmA->REDStatus());
118 Run();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000119#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000120 EXPECT_EQ(0, _acmA->SetREDStatus(true));
121 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000122#else
123 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
124 EXPECT_FALSE(_acmA->REDStatus());
125#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000126 Run();
127 _outFileB.Close();
128
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000129 RegisterSendCodec('A', kNameISAC, 16000);
130
131#ifdef SUPPORT_RED_WB
132 // Switch codec, RED should remain.
133 EXPECT_TRUE(_acmA->REDStatus());
134#else
135 EXPECT_FALSE(_acmA->REDStatus());
136#endif
137
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000138 OpenOutFile(_testCntr);
139 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
140 EXPECT_EQ(0, _acmA->SetREDStatus(false));
141 EXPECT_FALSE(_acmA->REDStatus());
142 Run();
143 _outFileB.Close();
144
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000145#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000146 EXPECT_EQ(0, _acmA->SetREDStatus(true));
147 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000148#else
149 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
150 EXPECT_FALSE(_acmA->REDStatus());
151#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000152 OpenOutFile(_testCntr);
153 Run();
154 _outFileB.Close();
155
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000156 RegisterSendCodec('A', kNameISAC, 32000);
157
158#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
159 // Switch codec, RED should remain.
160 EXPECT_TRUE(_acmA->REDStatus());
161#else
162 // Switch to a 32 kHz codec, RED should have been switched off.
163 EXPECT_FALSE(_acmA->REDStatus());
164#endif
165
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000166 OpenOutFile(_testCntr);
167 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
168 EXPECT_EQ(0, _acmA->SetREDStatus(false));
169 EXPECT_FALSE(_acmA->REDStatus());
170 Run();
171 _outFileB.Close();
172
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000173#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000174 EXPECT_EQ(0, _acmA->SetREDStatus(true));
175 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000176#else
177 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
178 EXPECT_FALSE(_acmA->REDStatus());
179#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000180 OpenOutFile(_testCntr);
181 Run();
182 _outFileB.Close();
183
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000184 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000185 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000186
187#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
188 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000189 EXPECT_EQ(0, _acmA->SetREDStatus(true));
190 EXPECT_TRUE(_acmA->REDStatus());
191 Run();
192
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000193 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000194 EXPECT_TRUE(_acmA->REDStatus());
195 Run();
196
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000197 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000198 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 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000205#else
206 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
207 EXPECT_FALSE(_acmA->REDStatus());
208#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000209
210 _channelA2B->SetFECTestWithPacketLoss(true);
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000211 // Following tests are under packet losses.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000212
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000213 EXPECT_EQ(0, RegisterSendCodec('A', kNameG722));
214 EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
215
216#if defined(SUPPORT_RED_WB) && defined(SUPPORT_RED_SWB)
217 // Switch codec, RED should remain.
218 EXPECT_TRUE(_acmA->REDStatus());
219#else
220 // Switch to a 16 kHz codec, RED should have been switched off.
221 EXPECT_FALSE(_acmA->REDStatus());
222#endif
223
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000224 OpenOutFile(_testCntr);
225 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
226 EXPECT_EQ(0, _acmA->SetREDStatus(false));
227 EXPECT_FALSE(_acmA->REDStatus());
228 Run();
229 _outFileB.Close();
230
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000231#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000232 EXPECT_EQ(0, _acmA->SetREDStatus(true));
233 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000234#else
235 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
236 EXPECT_FALSE(_acmA->REDStatus());
237#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000238 OpenOutFile(_testCntr);
239 Run();
240 _outFileB.Close();
241
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000242 RegisterSendCodec('A', kNameISAC, 16000);
243
244#ifdef SUPPORT_RED_WB
245 // Switch codec, RED should remain.
246 EXPECT_TRUE(_acmA->REDStatus());
247#else
248 // Switch to a 16 kHz codec, RED should have been switched off.
249 EXPECT_FALSE(_acmA->REDStatus());
250#endif
251
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000252 OpenOutFile(_testCntr);
253 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
254 EXPECT_EQ(0, _acmA->SetREDStatus(false));
255 EXPECT_FALSE(_acmA->REDStatus());
256 Run();
257 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000258#ifdef SUPPORT_RED_WB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000259 EXPECT_EQ(0, _acmA->SetREDStatus(true));
260 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000261#else
262 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
263 EXPECT_FALSE(_acmA->REDStatus());
264#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000265 OpenOutFile(_testCntr);
266 Run();
267 _outFileB.Close();
268
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000269 RegisterSendCodec('A', kNameISAC, 32000);
270
271#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
272 // Switch codec, RED should remain.
273 EXPECT_TRUE(_acmA->REDStatus());
274#else
275 // Switch to a 32 kHz codec, RED should have been switched off.
276 EXPECT_FALSE(_acmA->REDStatus());
277#endif
278
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000279 OpenOutFile(_testCntr);
280 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
281 EXPECT_EQ(0, _acmA->SetREDStatus(false));
282 EXPECT_FALSE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000283#ifdef SUPPORT_RED_SWB
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000284 EXPECT_EQ(0, _acmA->SetREDStatus(true));
285 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000286#else
287 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
288 EXPECT_FALSE(_acmA->REDStatus());
289#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000290 OpenOutFile(_testCntr);
291 Run();
292 _outFileB.Close();
293
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000294 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000295 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000296#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
297 OpenOutFile(_testCntr);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000298 EXPECT_EQ(0, _acmA->SetREDStatus(true));
299 EXPECT_TRUE(_acmA->REDStatus());
300 Run();
301
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000302 RegisterSendCodec('A', kNameISAC, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000303 EXPECT_TRUE(_acmA->REDStatus());
304 Run();
305
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000306 RegisterSendCodec('A', kNameISAC, 32000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000307 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 _outFileB.Close();
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000314#else
315 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
316 EXPECT_FALSE(_acmA->REDStatus());
317#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000318
319#ifndef WEBRTC_CODEC_OPUS
320 EXPECT_TRUE(false);
321 printf("Opus needs to be activated to run this test\n");
322 return;
323#endif
324
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000325 RegisterSendCodec('A', kNameOPUS, 48000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000326
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000327#if defined(SUPPORT_RED_FB) && defined(SUPPORT_RED_SWB) &&\
328 defined(SUPPORT_RED_WB)
329 // Switch to codec, RED should remain switched on.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000330 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000331#else
332 EXPECT_FALSE(_acmA->REDStatus());
333#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000334
335 // _channelA2B imposes 25% packet loss rate.
336 EXPECT_EQ(0, _acmA->SetPacketLossRate(25));
337
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000338#ifdef SUPPORT_RED_FB
339 EXPECT_EQ(0, _acmA->SetREDStatus(true));
340 EXPECT_TRUE(_acmA->REDStatus());
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000341 // Codec FEC and RED are mutually exclusive.
342 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
343
344 EXPECT_EQ(0, _acmA->SetREDStatus(false));
345 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
346
347 // Codec FEC and RED are mutually exclusive.
348 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000349#else
350 EXPECT_EQ(-1, _acmA->SetREDStatus(true));
351 EXPECT_FALSE(_acmA->REDStatus());
352 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
353#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000354
355 EXPECT_TRUE(_acmA->CodecFEC());
356 OpenOutFile(_testCntr);
357 Run();
358
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000359 // Switch to L16 with RED.
360 RegisterSendCodec('A', kNameL16, 8000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000361 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
362
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000363 // L16 does not support FEC, so FEC should be turned off automatically.
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000364 EXPECT_FALSE(_acmA->CodecFEC());
365
366 EXPECT_EQ(0, _acmA->SetREDStatus(true));
367 EXPECT_TRUE(_acmA->REDStatus());
368 Run();
369
370 // Switch to Opus again.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000371 RegisterSendCodec('A', kNameOPUS, 48000);
372#ifdef SUPPORT_RED_FB
373 // Switch to codec, RED should remain switched on.
374 EXPECT_TRUE(_acmA->REDStatus());
375#else
376 EXPECT_FALSE(_acmA->REDStatus());
377#endif
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000378 EXPECT_EQ(0, _acmA->SetREDStatus(false));
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000379 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000380 Run();
381
382 EXPECT_EQ(0, _acmA->SetCodecFEC(true));
383 _outFileB.Close();
384
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000385 // Codecs does not support internal FEC, cannot enable FEC.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000386 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000387 EXPECT_FALSE(_acmA->REDStatus());
388 EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
389 EXPECT_FALSE(_acmA->CodecFEC());
390
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000391 RegisterSendCodec('A', kNameISAC, 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());
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000395
396 // Codecs does not support internal FEC, disable FEC does not trigger failure.
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000397 RegisterSendCodec('A', kNameG722, 16000);
minyue@webrtc.org60fbd652014-09-25 14:36:30 +0000398 EXPECT_FALSE(_acmA->REDStatus());
399 EXPECT_EQ(0, _acmA->SetCodecFEC(false));
400 EXPECT_FALSE(_acmA->CodecFEC());
401
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000402 RegisterSendCodec('A', kNameISAC, 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());
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000406}
407
408int32_t TestRedFec::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
409 return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
410}
411
minyue@webrtc.org41d2bef2015-03-23 12:57:45 +0000412int16_t TestRedFec::RegisterSendCodec(char side, const char* codecName,
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000413 int32_t samplingFreqHz) {
414 std::cout << std::flush;
415 AudioCodingModule* myACM;
416 switch (side) {
417 case 'A': {
418 myACM = _acmA.get();
419 break;
420 }
421 case 'B': {
422 myACM = _acmB.get();
423 break;
424 }
425 default:
426 return -1;
427 }
428
429 if (myACM == NULL) {
430 assert(false);
431 return -1;
432 }
433 CodecInst myCodecParam;
434 EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
435 samplingFreqHz, 1), -1);
436 EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
437
438 // Initialization was successful.
439 return 0;
440}
441
442void TestRedFec::Run() {
443 AudioFrame audioFrame;
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000444 int32_t outFreqHzB = _outFileB.SamplingFrequency();
Henrik Lundin4d682082015-12-10 16:24:39 +0100445 // Set test length to 500 ms (50 blocks of 10 ms each).
446 _inFileA.SetNum10MsBlocksToRead(50);
447 // Fast-forward 1 second (100 blocks) since the file starts with silence.
448 _inFileA.FastForward(100);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000449
450 while (!_inFileA.EndOfFile()) {
451 EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
henrik.lundin@webrtc.orgf56c1622015-03-02 12:29:30 +0000452 EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
henrik.lundind4ccb002016-05-17 12:21:55 -0700453 bool muted;
454 EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
455 ASSERT_FALSE(muted);
yujo36b1a5f2017-06-12 12:45:32 -0700456 _outFileB.Write10MsData(audioFrame.data(), audioFrame.samples_per_channel_);
minyue@webrtc.orgaa5ea1c2014-05-23 15:16:51 +0000457 }
458 _inFileA.Rewind();
459}
460
461void TestRedFec::OpenOutFile(int16_t test_number) {
462 std::string file_name;
463 std::stringstream file_stream;
464 file_stream << webrtc::test::OutputPath();
465 file_stream << "TestRedFec_outFile_";
466 file_stream << test_number << ".pcm";
467 file_name = file_stream.str();
468 _outFileB.Open(file_name, 16000, "wb");
469}
470
471} // namespace webrtc