2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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.
11 #include "webrtc/modules/audio_coding/main/test/TestFEC.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"
26 : _acmA(AudioCodingModule::Create(0)),
27 _acmB(AudioCodingModule::Create(1)),
32 if (_channelA2B != NULL) {
38 void TestFEC::Perform() {
39 const std::string file_name = webrtc::test::ResourcePath(
40 "audio_coding/testfile32kHz", "pcm");
41 _inFileA.Open(file_name, 32000, "rb");
43 ASSERT_EQ(0, _acmA->InitializeReceiver());
44 ASSERT_EQ(0, _acmB->InitializeReceiver());
46 uint8_t numEncoders = _acmA->NumberOfCodecs();
47 CodecInst myCodecParam;
48 for (uint8_t n = 0; n < numEncoders; n++) {
49 EXPECT_EQ(0, _acmB->Codec(n, &myCodecParam));
50 EXPECT_EQ(0, _acmB->RegisterReceiveCodec(myCodecParam));
53 // Create and connect the channel
54 _channelA2B = new Channel;
55 _acmA->RegisterTransportCallback(_channelA2B);
56 _channelA2B->RegisterReceiverACM(_acmB.get());
58 #ifndef WEBRTC_CODEC_G722
60 printf("G722 needs to be activated to run this test\n");
63 char nameG722[] = "G722";
64 EXPECT_EQ(0, RegisterSendCodec('A', nameG722, 16000));
66 EXPECT_EQ(0, RegisterSendCodec('A', nameCN, 16000));
67 char nameRED[] = "RED";
68 EXPECT_EQ(0, RegisterSendCodec('A', nameRED));
69 OpenOutFile(_testCntr);
70 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
71 EXPECT_EQ(0, _acmA->SetFECStatus(false));
72 EXPECT_FALSE(_acmA->FECStatus());
76 EXPECT_EQ(0, _acmA->SetFECStatus(true));
77 EXPECT_TRUE(_acmA->FECStatus());
78 OpenOutFile(_testCntr);
82 char nameISAC[] = "iSAC";
83 RegisterSendCodec('A', nameISAC, 16000);
84 OpenOutFile(_testCntr);
85 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
86 EXPECT_EQ(0, _acmA->SetFECStatus(false));
87 EXPECT_FALSE(_acmA->FECStatus());
91 EXPECT_EQ(0, _acmA->SetFECStatus(true));
92 EXPECT_TRUE(_acmA->FECStatus());
93 OpenOutFile(_testCntr);
97 RegisterSendCodec('A', nameISAC, 32000);
98 OpenOutFile(_testCntr);
99 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
100 EXPECT_EQ(0, _acmA->SetFECStatus(false));
101 EXPECT_FALSE(_acmA->FECStatus());
105 EXPECT_EQ(0, _acmA->SetFECStatus(true));
106 EXPECT_TRUE(_acmA->FECStatus());
107 OpenOutFile(_testCntr);
111 RegisterSendCodec('A', nameISAC, 32000);
112 OpenOutFile(_testCntr);
113 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
114 EXPECT_EQ(0, _acmA->SetFECStatus(true));
115 EXPECT_TRUE(_acmA->FECStatus());
118 RegisterSendCodec('A', nameISAC, 16000);
119 EXPECT_TRUE(_acmA->FECStatus());
122 RegisterSendCodec('A', nameISAC, 32000);
123 EXPECT_TRUE(_acmA->FECStatus());
126 RegisterSendCodec('A', nameISAC, 16000);
127 EXPECT_TRUE(_acmA->FECStatus());
131 _channelA2B->SetFECTestWithPacketLoss(true);
133 EXPECT_EQ(0, RegisterSendCodec('A', nameG722));
134 EXPECT_EQ(0, RegisterSendCodec('A', nameCN, 16000));
135 OpenOutFile(_testCntr);
136 EXPECT_EQ(0, SetVAD(true, true, VADAggr));
137 EXPECT_EQ(0, _acmA->SetFECStatus(false));
138 EXPECT_FALSE(_acmA->FECStatus());
142 EXPECT_EQ(0, _acmA->SetFECStatus(true));
143 EXPECT_TRUE(_acmA->FECStatus());
144 OpenOutFile(_testCntr);
148 RegisterSendCodec('A', nameISAC, 16000);
149 OpenOutFile(_testCntr);
150 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
151 EXPECT_EQ(0, _acmA->SetFECStatus(false));
152 EXPECT_FALSE(_acmA->FECStatus());
156 EXPECT_EQ(0, _acmA->SetFECStatus(true));
157 EXPECT_TRUE(_acmA->FECStatus());
158 OpenOutFile(_testCntr);
162 RegisterSendCodec('A', nameISAC, 32000);
163 OpenOutFile(_testCntr);
164 EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
165 EXPECT_EQ(0, _acmA->SetFECStatus(false));
166 EXPECT_FALSE(_acmA->FECStatus());
170 EXPECT_EQ(0, _acmA->SetFECStatus(true));
171 EXPECT_TRUE(_acmA->FECStatus());
172 OpenOutFile(_testCntr);
176 RegisterSendCodec('A', nameISAC, 32000);
177 OpenOutFile(_testCntr);
178 EXPECT_EQ(0, SetVAD(false, false, VADNormal));
179 EXPECT_EQ(0, _acmA->SetFECStatus(true));
180 EXPECT_TRUE(_acmA->FECStatus());
183 RegisterSendCodec('A', nameISAC, 16000);
184 EXPECT_TRUE(_acmA->FECStatus());
187 RegisterSendCodec('A', nameISAC, 32000);
188 EXPECT_TRUE(_acmA->FECStatus());
191 RegisterSendCodec('A', nameISAC, 16000);
192 EXPECT_TRUE(_acmA->FECStatus());
197 int32_t TestFEC::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
198 return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
201 int16_t TestFEC::RegisterSendCodec(char side, char* codecName,
202 int32_t samplingFreqHz) {
203 std::cout << std::flush;
204 AudioCodingModule* myACM;
222 CodecInst myCodecParam;
223 EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
224 samplingFreqHz, 1), -1);
225 EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
227 // Initialization was successful.
231 void TestFEC::Run() {
232 AudioFrame audioFrame;
234 uint16_t msecPassed = 0;
235 uint32_t secPassed = 0;
236 int32_t outFreqHzB = _outFileB.SamplingFrequency();
238 while (!_inFileA.EndOfFile()) {
239 EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
240 EXPECT_EQ(0, _acmA->Add10MsData(audioFrame));
241 EXPECT_GT(_acmA->Process(), -1);
242 EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame));
243 _outFileB.Write10MsData(audioFrame.data_, audioFrame.samples_per_channel_);
245 if (msecPassed >= 1000) {
249 // Test that toggling FEC on and off works.
250 if (((secPassed % 5) == 4) && (msecPassed == 0) && (_testCntr > 14)) {
251 EXPECT_EQ(0, _acmA->SetFECStatus(false));
253 if (((secPassed % 5) == 4) && (msecPassed >= 990) && (_testCntr > 14)) {
254 EXPECT_EQ(0, _acmA->SetFECStatus(true));
260 void TestFEC::OpenOutFile(int16_t test_number) {
261 std::string file_name;
262 std::stringstream file_stream;
263 file_stream << webrtc::test::OutputPath();
264 file_stream << "TestFEC_outFile_";
265 file_stream << test_number << ".pcm";
266 file_name = file_stream.str();
267 _outFileB.Open(file_name, 16000, "wb");
270 } // namespace webrtc