OLD | NEW |
| (Empty) |
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/iSACTest.h" | |
12 | |
13 #include <ctype.h> | |
14 #include <stdio.h> | |
15 #include <string.h> | |
16 | |
17 #if _WIN32 | |
18 #include <windows.h> | |
19 #elif WEBRTC_LINUX | |
20 #include <time.h> | |
21 #else | |
22 #include <sys/time.h> | |
23 #include <time.h> | |
24 #endif | |
25 | |
26 #include "webrtc/modules/audio_coding/main/acm2/acm_common_defs.h" | |
27 #include "webrtc/modules/audio_coding/main/test/utility.h" | |
28 #include "webrtc/system_wrappers/include/event_wrapper.h" | |
29 #include "webrtc/system_wrappers/include/tick_util.h" | |
30 #include "webrtc/system_wrappers/include/trace.h" | |
31 #include "webrtc/test/testsupport/fileutils.h" | |
32 | |
33 namespace webrtc { | |
34 | |
35 void SetISACConfigDefault(ACMTestISACConfig& isacConfig) { | |
36 isacConfig.currentRateBitPerSec = 0; | |
37 isacConfig.currentFrameSizeMsec = 0; | |
38 isacConfig.encodingMode = -1; | |
39 isacConfig.initRateBitPerSec = 0; | |
40 isacConfig.initFrameSizeInMsec = 0; | |
41 isacConfig.enforceFrameSize = false; | |
42 return; | |
43 } | |
44 | |
45 int16_t SetISAConfig(ACMTestISACConfig& isacConfig, AudioCodingModule* acm, | |
46 int testMode) { | |
47 | |
48 if ((isacConfig.currentRateBitPerSec != 0) | |
49 || (isacConfig.currentFrameSizeMsec != 0)) { | |
50 auto sendCodec = acm->SendCodec(); | |
51 EXPECT_TRUE(sendCodec); | |
52 if (isacConfig.currentRateBitPerSec < 0) { | |
53 // Register iSAC in adaptive (channel-dependent) mode. | |
54 sendCodec->rate = -1; | |
55 EXPECT_EQ(0, acm->RegisterSendCodec(*sendCodec)); | |
56 } else { | |
57 if (isacConfig.currentRateBitPerSec != 0) { | |
58 sendCodec->rate = isacConfig.currentRateBitPerSec; | |
59 } | |
60 if (isacConfig.currentFrameSizeMsec != 0) { | |
61 sendCodec->pacsize = isacConfig.currentFrameSizeMsec | |
62 * (sendCodec->plfreq / 1000); | |
63 } | |
64 EXPECT_EQ(0, acm->RegisterSendCodec(*sendCodec)); | |
65 } | |
66 } | |
67 | |
68 return 0; | |
69 } | |
70 | |
71 ISACTest::ISACTest(int testMode) | |
72 : _acmA(AudioCodingModule::Create(1)), | |
73 _acmB(AudioCodingModule::Create(2)), | |
74 _testMode(testMode) {} | |
75 | |
76 ISACTest::~ISACTest() {} | |
77 | |
78 void ISACTest::Setup() { | |
79 int codecCntr; | |
80 CodecInst codecParam; | |
81 | |
82 for (codecCntr = 0; codecCntr < AudioCodingModule::NumberOfCodecs(); | |
83 codecCntr++) { | |
84 EXPECT_EQ(0, AudioCodingModule::Codec(codecCntr, &codecParam)); | |
85 if (!STR_CASE_CMP(codecParam.plname, "ISAC") | |
86 && codecParam.plfreq == 16000) { | |
87 memcpy(&_paramISAC16kHz, &codecParam, sizeof(CodecInst)); | |
88 _idISAC16kHz = codecCntr; | |
89 } | |
90 if (!STR_CASE_CMP(codecParam.plname, "ISAC") | |
91 && codecParam.plfreq == 32000) { | |
92 memcpy(&_paramISAC32kHz, &codecParam, sizeof(CodecInst)); | |
93 _idISAC32kHz = codecCntr; | |
94 } | |
95 } | |
96 | |
97 // Register both iSAC-wb & iSAC-swb in both sides as receiver codecs. | |
98 EXPECT_EQ(0, _acmA->RegisterReceiveCodec(_paramISAC16kHz)); | |
99 EXPECT_EQ(0, _acmA->RegisterReceiveCodec(_paramISAC32kHz)); | |
100 EXPECT_EQ(0, _acmB->RegisterReceiveCodec(_paramISAC16kHz)); | |
101 EXPECT_EQ(0, _acmB->RegisterReceiveCodec(_paramISAC32kHz)); | |
102 | |
103 //--- Set A-to-B channel | |
104 _channel_A2B.reset(new Channel); | |
105 EXPECT_EQ(0, _acmA->RegisterTransportCallback(_channel_A2B.get())); | |
106 _channel_A2B->RegisterReceiverACM(_acmB.get()); | |
107 | |
108 //--- Set B-to-A channel | |
109 _channel_B2A.reset(new Channel); | |
110 EXPECT_EQ(0, _acmB->RegisterTransportCallback(_channel_B2A.get())); | |
111 _channel_B2A->RegisterReceiverACM(_acmA.get()); | |
112 | |
113 file_name_swb_ = webrtc::test::ResourcePath("audio_coding/testfile32kHz", | |
114 "pcm"); | |
115 | |
116 EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); | |
117 EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); | |
118 | |
119 _inFileA.Open(file_name_swb_, 32000, "rb"); | |
120 std::string fileNameA = webrtc::test::OutputPath() + "testisac_a.pcm"; | |
121 std::string fileNameB = webrtc::test::OutputPath() + "testisac_b.pcm"; | |
122 _outFileA.Open(fileNameA, 32000, "wb"); | |
123 _outFileB.Open(fileNameB, 32000, "wb"); | |
124 | |
125 while (!_inFileA.EndOfFile()) { | |
126 Run10ms(); | |
127 } | |
128 CodecInst receiveCodec; | |
129 EXPECT_EQ(0, _acmA->ReceiveCodec(&receiveCodec)); | |
130 EXPECT_EQ(0, _acmB->ReceiveCodec(&receiveCodec)); | |
131 | |
132 _inFileA.Close(); | |
133 _outFileA.Close(); | |
134 _outFileB.Close(); | |
135 } | |
136 | |
137 void ISACTest::Perform() { | |
138 Setup(); | |
139 | |
140 int16_t testNr = 0; | |
141 ACMTestISACConfig wbISACConfig; | |
142 ACMTestISACConfig swbISACConfig; | |
143 | |
144 SetISACConfigDefault(wbISACConfig); | |
145 SetISACConfigDefault(swbISACConfig); | |
146 | |
147 wbISACConfig.currentRateBitPerSec = -1; | |
148 swbISACConfig.currentRateBitPerSec = -1; | |
149 testNr++; | |
150 EncodeDecode(testNr, wbISACConfig, swbISACConfig); | |
151 | |
152 if (_testMode != 0) { | |
153 SetISACConfigDefault(wbISACConfig); | |
154 SetISACConfigDefault(swbISACConfig); | |
155 | |
156 wbISACConfig.currentRateBitPerSec = -1; | |
157 swbISACConfig.currentRateBitPerSec = -1; | |
158 wbISACConfig.initRateBitPerSec = 13000; | |
159 wbISACConfig.initFrameSizeInMsec = 60; | |
160 swbISACConfig.initRateBitPerSec = 20000; | |
161 swbISACConfig.initFrameSizeInMsec = 30; | |
162 testNr++; | |
163 EncodeDecode(testNr, wbISACConfig, swbISACConfig); | |
164 | |
165 SetISACConfigDefault(wbISACConfig); | |
166 SetISACConfigDefault(swbISACConfig); | |
167 | |
168 wbISACConfig.currentRateBitPerSec = 20000; | |
169 swbISACConfig.currentRateBitPerSec = 48000; | |
170 testNr++; | |
171 EncodeDecode(testNr, wbISACConfig, swbISACConfig); | |
172 | |
173 wbISACConfig.currentRateBitPerSec = 16000; | |
174 swbISACConfig.currentRateBitPerSec = 30000; | |
175 wbISACConfig.currentFrameSizeMsec = 60; | |
176 testNr++; | |
177 EncodeDecode(testNr, wbISACConfig, swbISACConfig); | |
178 } | |
179 | |
180 SetISACConfigDefault(wbISACConfig); | |
181 SetISACConfigDefault(swbISACConfig); | |
182 testNr++; | |
183 EncodeDecode(testNr, wbISACConfig, swbISACConfig); | |
184 | |
185 testNr++; | |
186 if (_testMode == 0) { | |
187 SwitchingSamplingRate(testNr, 4); | |
188 } else { | |
189 SwitchingSamplingRate(testNr, 80); | |
190 } | |
191 } | |
192 | |
193 void ISACTest::Run10ms() { | |
194 AudioFrame audioFrame; | |
195 EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0); | |
196 EXPECT_GE(_acmA->Add10MsData(audioFrame), 0); | |
197 EXPECT_GE(_acmB->Add10MsData(audioFrame), 0); | |
198 EXPECT_EQ(0, _acmA->PlayoutData10Ms(32000, &audioFrame)); | |
199 _outFileA.Write10MsData(audioFrame); | |
200 EXPECT_EQ(0, _acmB->PlayoutData10Ms(32000, &audioFrame)); | |
201 _outFileB.Write10MsData(audioFrame); | |
202 } | |
203 | |
204 void ISACTest::EncodeDecode(int testNr, ACMTestISACConfig& wbISACConfig, | |
205 ACMTestISACConfig& swbISACConfig) { | |
206 // Files in Side A and B | |
207 _inFileA.Open(file_name_swb_, 32000, "rb", true); | |
208 _inFileB.Open(file_name_swb_, 32000, "rb", true); | |
209 | |
210 std::string file_name_out; | |
211 std::stringstream file_stream_a; | |
212 std::stringstream file_stream_b; | |
213 file_stream_a << webrtc::test::OutputPath(); | |
214 file_stream_b << webrtc::test::OutputPath(); | |
215 file_stream_a << "out_iSACTest_A_" << testNr << ".pcm"; | |
216 file_stream_b << "out_iSACTest_B_" << testNr << ".pcm"; | |
217 file_name_out = file_stream_a.str(); | |
218 _outFileA.Open(file_name_out, 32000, "wb"); | |
219 file_name_out = file_stream_b.str(); | |
220 _outFileB.Open(file_name_out, 32000, "wb"); | |
221 | |
222 EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz)); | |
223 EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); | |
224 EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz)); | |
225 EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); | |
226 | |
227 // Side A is sending super-wideband, and side B is sending wideband. | |
228 SetISAConfig(swbISACConfig, _acmA.get(), _testMode); | |
229 SetISAConfig(wbISACConfig, _acmB.get(), _testMode); | |
230 | |
231 bool adaptiveMode = false; | |
232 if ((swbISACConfig.currentRateBitPerSec == -1) | |
233 || (wbISACConfig.currentRateBitPerSec == -1)) { | |
234 adaptiveMode = true; | |
235 } | |
236 _myTimer.Reset(); | |
237 _channel_A2B->ResetStats(); | |
238 _channel_B2A->ResetStats(); | |
239 | |
240 char currentTime[500]; | |
241 EventTimerWrapper* myEvent = EventTimerWrapper::Create(); | |
242 EXPECT_TRUE(myEvent->StartTimer(true, 10)); | |
243 while (!(_inFileA.EndOfFile() || _inFileA.Rewinded())) { | |
244 Run10ms(); | |
245 _myTimer.Tick10ms(); | |
246 _myTimer.CurrentTimeHMS(currentTime); | |
247 | |
248 if ((adaptiveMode) && (_testMode != 0)) { | |
249 myEvent->Wait(5000); | |
250 EXPECT_TRUE(_acmA->SendCodec()); | |
251 EXPECT_TRUE(_acmB->SendCodec()); | |
252 } | |
253 } | |
254 | |
255 if (_testMode != 0) { | |
256 printf("\n\nSide A statistics\n\n"); | |
257 _channel_A2B->PrintStats(_paramISAC32kHz); | |
258 | |
259 printf("\n\nSide B statistics\n\n"); | |
260 _channel_B2A->PrintStats(_paramISAC16kHz); | |
261 } | |
262 | |
263 _channel_A2B->ResetStats(); | |
264 _channel_B2A->ResetStats(); | |
265 | |
266 _outFileA.Close(); | |
267 _outFileB.Close(); | |
268 _inFileA.Close(); | |
269 _inFileB.Close(); | |
270 } | |
271 | |
272 void ISACTest::SwitchingSamplingRate(int testNr, int maxSampRateChange) { | |
273 // Files in Side A | |
274 _inFileA.Open(file_name_swb_, 32000, "rb"); | |
275 _inFileB.Open(file_name_swb_, 32000, "rb"); | |
276 | |
277 std::string file_name_out; | |
278 std::stringstream file_stream_a; | |
279 std::stringstream file_stream_b; | |
280 file_stream_a << webrtc::test::OutputPath(); | |
281 file_stream_b << webrtc::test::OutputPath(); | |
282 file_stream_a << "out_iSACTest_A_" << testNr << ".pcm"; | |
283 file_stream_b << "out_iSACTest_B_" << testNr << ".pcm"; | |
284 file_name_out = file_stream_a.str(); | |
285 _outFileA.Open(file_name_out, 32000, "wb"); | |
286 file_name_out = file_stream_b.str(); | |
287 _outFileB.Open(file_name_out, 32000, "wb"); | |
288 | |
289 // Start with side A sending super-wideband and side B seding wideband. | |
290 // Toggle sending wideband/super-wideband in this test. | |
291 EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); | |
292 EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); | |
293 | |
294 int numSendCodecChanged = 0; | |
295 _myTimer.Reset(); | |
296 char currentTime[50]; | |
297 while (numSendCodecChanged < (maxSampRateChange << 1)) { | |
298 Run10ms(); | |
299 _myTimer.Tick10ms(); | |
300 _myTimer.CurrentTimeHMS(currentTime); | |
301 if (_testMode == 2) | |
302 printf("\r%s", currentTime); | |
303 if (_inFileA.EndOfFile()) { | |
304 if (_inFileA.SamplingFrequency() == 16000) { | |
305 // Switch side A to send super-wideband. | |
306 _inFileA.Close(); | |
307 _inFileA.Open(file_name_swb_, 32000, "rb"); | |
308 EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); | |
309 } else { | |
310 // Switch side A to send wideband. | |
311 _inFileA.Close(); | |
312 _inFileA.Open(file_name_swb_, 32000, "rb"); | |
313 EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz)); | |
314 } | |
315 numSendCodecChanged++; | |
316 } | |
317 | |
318 if (_inFileB.EndOfFile()) { | |
319 if (_inFileB.SamplingFrequency() == 16000) { | |
320 // Switch side B to send super-wideband. | |
321 _inFileB.Close(); | |
322 _inFileB.Open(file_name_swb_, 32000, "rb"); | |
323 EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz)); | |
324 } else { | |
325 // Switch side B to send wideband. | |
326 _inFileB.Close(); | |
327 _inFileB.Open(file_name_swb_, 32000, "rb"); | |
328 EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); | |
329 } | |
330 numSendCodecChanged++; | |
331 } | |
332 } | |
333 _outFileA.Close(); | |
334 _outFileB.Close(); | |
335 _inFileA.Close(); | |
336 _inFileB.Close(); | |
337 } | |
338 | |
339 } // namespace webrtc | |
OLD | NEW |