Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_coding / main / test / TestFEC.cc
1 /*
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/TestFEC.h"
12
13 #include <assert.h>
14 #include <iostream>
15
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
23 namespace webrtc {
24
25 TestFEC::TestFEC()
26     : _acmA(AudioCodingModule::Create(0)),
27       _acmB(AudioCodingModule::Create(1)),
28       _channelA2B(NULL),
29       _testCntr(0) {}
30
31 TestFEC::~TestFEC() {
32   if (_channelA2B != NULL) {
33     delete _channelA2B;
34     _channelA2B = NULL;
35   }
36 }
37
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");
42
43   ASSERT_EQ(0, _acmA->InitializeReceiver());
44   ASSERT_EQ(0, _acmB->InitializeReceiver());
45
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));
51   }
52
53   // Create and connect the channel
54   _channelA2B = new Channel;
55   _acmA->RegisterTransportCallback(_channelA2B);
56   _channelA2B->RegisterReceiverACM(_acmB.get());
57
58 #ifndef WEBRTC_CODEC_G722
59   EXPECT_TRUE(false);
60   printf("G722 needs to be activated to run this test\n");
61   return;
62 #endif
63   char nameG722[] = "G722";
64   EXPECT_EQ(0, RegisterSendCodec('A', nameG722, 16000));
65   char nameCN[] = "CN";
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());
73   Run();
74   _outFileB.Close();
75
76   EXPECT_EQ(0, _acmA->SetFECStatus(true));
77   EXPECT_TRUE(_acmA->FECStatus());
78   OpenOutFile(_testCntr);
79   Run();
80   _outFileB.Close();
81
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());
88   Run();
89   _outFileB.Close();
90
91   EXPECT_EQ(0, _acmA->SetFECStatus(true));
92   EXPECT_TRUE(_acmA->FECStatus());
93   OpenOutFile(_testCntr);
94   Run();
95   _outFileB.Close();
96
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());
102   Run();
103   _outFileB.Close();
104
105   EXPECT_EQ(0, _acmA->SetFECStatus(true));
106   EXPECT_TRUE(_acmA->FECStatus());
107   OpenOutFile(_testCntr);
108   Run();
109   _outFileB.Close();
110
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());
116   Run();
117
118   RegisterSendCodec('A', nameISAC, 16000);
119   EXPECT_TRUE(_acmA->FECStatus());
120   Run();
121
122   RegisterSendCodec('A', nameISAC, 32000);
123   EXPECT_TRUE(_acmA->FECStatus());
124   Run();
125
126   RegisterSendCodec('A', nameISAC, 16000);
127   EXPECT_TRUE(_acmA->FECStatus());
128   Run();
129   _outFileB.Close();
130
131   _channelA2B->SetFECTestWithPacketLoss(true);
132
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());
139   Run();
140   _outFileB.Close();
141
142   EXPECT_EQ(0, _acmA->SetFECStatus(true));
143   EXPECT_TRUE(_acmA->FECStatus());
144   OpenOutFile(_testCntr);
145   Run();
146   _outFileB.Close();
147
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());
153   Run();
154   _outFileB.Close();
155
156   EXPECT_EQ(0, _acmA->SetFECStatus(true));
157   EXPECT_TRUE(_acmA->FECStatus());
158   OpenOutFile(_testCntr);
159   Run();
160   _outFileB.Close();
161
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());
167   Run();
168   _outFileB.Close();
169
170   EXPECT_EQ(0, _acmA->SetFECStatus(true));
171   EXPECT_TRUE(_acmA->FECStatus());
172   OpenOutFile(_testCntr);
173   Run();
174   _outFileB.Close();
175
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());
181   Run();
182
183   RegisterSendCodec('A', nameISAC, 16000);
184   EXPECT_TRUE(_acmA->FECStatus());
185   Run();
186
187   RegisterSendCodec('A', nameISAC, 32000);
188   EXPECT_TRUE(_acmA->FECStatus());
189   Run();
190
191   RegisterSendCodec('A', nameISAC, 16000);
192   EXPECT_TRUE(_acmA->FECStatus());
193   Run();
194   _outFileB.Close();
195 }
196
197 int32_t TestFEC::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
198   return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
199 }
200
201 int16_t TestFEC::RegisterSendCodec(char side, char* codecName,
202                                    int32_t samplingFreqHz) {
203   std::cout << std::flush;
204   AudioCodingModule* myACM;
205   switch (side) {
206     case 'A': {
207       myACM = _acmA.get();
208       break;
209     }
210     case 'B': {
211       myACM = _acmB.get();
212       break;
213     }
214     default:
215       return -1;
216   }
217
218   if (myACM == NULL) {
219     assert(false);
220     return -1;
221   }
222   CodecInst myCodecParam;
223   EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
224                                      samplingFreqHz, 1), -1);
225   EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
226
227   // Initialization was successful.
228   return 0;
229 }
230
231 void TestFEC::Run() {
232   AudioFrame audioFrame;
233
234   uint16_t msecPassed = 0;
235   uint32_t secPassed = 0;
236   int32_t outFreqHzB = _outFileB.SamplingFrequency();
237
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_);
244     msecPassed += 10;
245     if (msecPassed >= 1000) {
246       msecPassed = 0;
247       secPassed++;
248     }
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));
252     }
253     if (((secPassed % 5) == 4) && (msecPassed >= 990) && (_testCntr > 14)) {
254       EXPECT_EQ(0, _acmA->SetFECStatus(true));
255     }
256   }
257   _inFileA.Rewind();
258 }
259
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");
268 }
269
270 }  // namespace webrtc