Mercurial > hg > audiostuff
comparison spandsp-0.0.6pre17/tests/g726_tests.c @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 15:50:58 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
3:c6c5a16ce2f2 | 4:26cd8f1ef0b1 |
---|---|
1 /* | |
2 * SpanDSP - a series of DSP components for telephony | |
3 * | |
4 * g726_tests.c - Test G.726 encode and decode. | |
5 * | |
6 * Written by Steve Underwood <steveu@coppice.org> | |
7 * | |
8 * Copyright (C) 2006 Steve Underwood | |
9 * | |
10 * All rights reserved. | |
11 * | |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License version 2, as | |
14 * published by the Free Software Foundation. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
24 * | |
25 * $Id: g726_tests.c,v 1.33 2009/05/30 15:23:13 steveu Exp $ | |
26 */ | |
27 | |
28 /*! \file */ | |
29 | |
30 /*! \page g726_tests_page G.726 tests | |
31 \section g726_tests_page_sec_1 What does it do? | |
32 Two sets of tests are performed: | |
33 - The tests defined in the G.726 specification, using the test data files supplied with | |
34 the specification. | |
35 - A generally audio quality test, consisting of compressing and decompressing a speeech | |
36 file for audible comparison. | |
37 | |
38 The speech file should be recorded at 16 bits/sample, 8000 samples/second, and named | |
39 "pre_g726.wav". | |
40 | |
41 \section g726_tests_page_sec_2 How is it used? | |
42 To perform the tests in the G.726 specification you need to obtain the test data files from the | |
43 specification. These are copyright material, and so cannot be distributed with this test software. | |
44 | |
45 The files, containing test vectors, which are supplied with the G.726 specification, should be | |
46 copied to itutests/g726 so the files are arranged in the same directory heirarchy in which they | |
47 are supplied. That is, you should have file names like | |
48 | |
49 - itutests/g726/DISK1/INPUT/NRM.M | |
50 - itutests/g726/DISK1/INPUT/OVR.M | |
51 - itutests/g726/DISK2/INPUT/NRM.A | |
52 - itutests/g726/DISK2/INPUT/OVR.A | |
53 | |
54 in your source tree. The ITU tests can then be run by executing g726_tests without | |
55 any parameters. | |
56 | |
57 To perform a general audio quality test, g726_tests should be run with a parameter specifying | |
58 the required bit rate for compression. The valid parameters are "-16", "-24", "-32", and "-40". | |
59 The test file ../test-data/local/short_nb_voice.wav will be compressed to the specified bit rate, | |
60 decompressed, and the resulting audio stored in post_g726.wav. | |
61 */ | |
62 | |
63 /* Enable the following definition to enable direct probing into the FAX structures */ | |
64 //#define WITH_SPANDSP_INTERNALS | |
65 | |
66 #if defined(HAVE_CONFIG_H) | |
67 #include <config.h> | |
68 #endif | |
69 | |
70 #include <stdlib.h> | |
71 #include <stdio.h> | |
72 #include <fcntl.h> | |
73 #include <unistd.h> | |
74 #include <memory.h> | |
75 #include <ctype.h> | |
76 #include <sndfile.h> | |
77 | |
78 //#if defined(WITH_SPANDSP_INTERNALS) | |
79 #define SPANDSP_EXPOSE_INTERNAL_STRUCTURES | |
80 //#endif | |
81 | |
82 #include "spandsp.h" | |
83 #include "spandsp-sim.h" | |
84 | |
85 #define BLOCK_LEN 320 | |
86 #define MAX_TEST_VECTOR_LEN 40000 | |
87 | |
88 #define TESTDATA_DIR "../test-data/itu/g726/" | |
89 | |
90 #define IN_FILE_NAME "../test-data/local/short_nb_voice.wav" | |
91 #define OUT_FILE_NAME "post_g726.wav" | |
92 | |
93 int16_t outdata[MAX_TEST_VECTOR_LEN]; | |
94 uint8_t adpcmdata[MAX_TEST_VECTOR_LEN]; | |
95 | |
96 int16_t itudata[MAX_TEST_VECTOR_LEN]; | |
97 uint8_t itu_ref[MAX_TEST_VECTOR_LEN]; | |
98 uint8_t unpacked[MAX_TEST_VECTOR_LEN]; | |
99 uint8_t xlaw[MAX_TEST_VECTOR_LEN]; | |
100 | |
101 /* | |
102 Table 4 - V Reset and homing sequences for u-law | |
103 Normal I-input Overload | |
104 Algorithm Input Intermediate Output Input Output Input Intermediate Output | |
105 (PCM) (ADPCM) (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) | |
106 | |
107 16F NRM.M RN16FM.I RN16FM.O I16 RI16FM.O OVR.M RV16FM.I RV16FM.O | |
108 HN16FM.I HN16FM.O HI16FM.O HV16FM.I HV16FM.O | |
109 | |
110 24F NRM.M RN24FM.I RN24FM.O I24 RI24FM.O OVR.M RV24FM.I RV24FM.O | |
111 HN24FM.I HN24FM.O HI24FM.O HV24FM.I HV24FM.O | |
112 | |
113 32F NRM.M RN32FM.I RN32FM.O I32 RI32FM.O OVR.M RV32FM.I RV32FM.O | |
114 HN32FM.I HN32FM.O HI32FM.O HV32FM.I HV32FM.O | |
115 | |
116 40F NRM.M RN40FM.I RN40FM.O I40 RI40FM.O OVR.M RV40FM.I RV40FM.O | |
117 HN40FM.I HN40FM.O HI40FM.O HV40FM.I HV40FM.O | |
118 | |
119 | |
120 Table 5 - V Reset and homing sequences for A-law | |
121 Normal I-input Overload | |
122 Algorithm Input Intermediate Output Input Output Input Intermediate Output | |
123 (PCM) (ADPCM) (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) | |
124 16F NRM.A RN16FA.I RN16FA.O I16 RI16FA.O OVR.A RV16FA.I RV16FA.O | |
125 HN16FA.I HN16FA.O HI16FA.O HV16FA.I HV16FA.O | |
126 | |
127 24F NRM.A RN24FA.I RN24FA.O I24 RI24FA.O OVR.A RV24FA.I RV24FA.O | |
128 HN24FA.I HN24FA.O HI24FA.O HV24FA.I HV24FA.O | |
129 | |
130 32F NRM.A RN32FA.I RN32FA.O I32 RI32FA.O OVR.A RV32FA.I RV32FA.O | |
131 HN32FA.I HN32FA.O HI32FA.O HV32FA.I HV32FA.O | |
132 | |
133 40F NRM.A RN40FA.I RN40FA.O I40 RI40FA.O OVR.A RV40FA.I RV40FA.O | |
134 HN40FA.I HN40FA.O HI40FA.O HV40FA.I HV40FA.O | |
135 | |
136 Table 6 ¡V Reset and homing cross sequences for u-law -> A-law | |
137 Normal Overload | |
138 Algorithm Input Intermediate Output Input Intermediate Output | |
139 (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) | |
140 16F NRM.M RN16FM.I RN16FC.O OVR.M RV16FM.I RV16FC.O | |
141 HN16FM.I HN16FC.O HV16FM.I HV16FC.O | |
142 | |
143 24F NRM.M RN24FM.I RN24FC.O OVR.M RV24FM.I RV24FC.O | |
144 HN24FM.I HN24FC.O HV24FM.I HV24FC.O | |
145 | |
146 32F NRM.M RN32FM.I RN32FC.O OVR.M RV32FM.I RV32FC.O | |
147 HN32FM.I HN32FC.O HV32FM.I HV32FC.O | |
148 | |
149 40F NRM.M RN40FM.I RN40FC.O OVR.M RV40FM.I RV40FC.O | |
150 HN40FM.I HN40FC.O HV40FM.I HV40FC.O | |
151 | |
152 Table 7 ¡V Reset and homing cross sequences for A-law -> u-law | |
153 Normal Overload | |
154 Algorithm Input Intermediate Output Input Intermediate Output | |
155 (PCM) (ADPCM) (PCM) (PCM) (ADPCM) (PCM) | |
156 16F NRM.A RN16FA.I RN16FX.O OVR.A RV16FA.I RV16FX.O | |
157 HN16FA.I HN16FX.O HV16FA.I HV16FX.O | |
158 | |
159 24F NRM.A RN24FA.I RN24FX.O OVR.A RV24FA.I RV24FX.O | |
160 HN24FA.I HN24FX.O HV24FA.I HV24FX.O | |
161 | |
162 32F NRM.A RN32FA.I RN32FX.O OVR.A RV32FA.I RV32FX.O | |
163 HN32FA.I HN32FX.O HV32FA.I HV32FX.O | |
164 | |
165 40F NRM.A RN40FA.I RN40FX.O OVR.A RV40FA.I RV40FX.O | |
166 HN40FA.I HN40FX.O HV40FA.I HV40FX.O | |
167 */ | |
168 | |
169 #define G726_ENCODING_NONE 9999 | |
170 | |
171 typedef struct | |
172 { | |
173 const char *conditioning_pcm_file; | |
174 const char *pcm_file; | |
175 const char *conditioning_adpcm_file; | |
176 const char *adpcm_file; | |
177 const char *output_file; | |
178 int rate; | |
179 int compression_law; | |
180 int decompression_law; | |
181 } test_set_t; | |
182 | |
183 static test_set_t itu_test_sets[] = | |
184 { | |
185 /* u-law to u-law tests */ | |
186 { | |
187 "", | |
188 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
189 "", | |
190 TESTDATA_DIR "DISK1/RESET/16/RN16FM.I", | |
191 TESTDATA_DIR "DISK1/RESET/16/RN16FM.O", | |
192 16000, | |
193 G726_ENCODING_ULAW, | |
194 G726_ENCODING_ULAW | |
195 }, | |
196 { | |
197 "", | |
198 "", | |
199 "", | |
200 TESTDATA_DIR "DISK1/INPUT/I16", | |
201 TESTDATA_DIR "DISK1/RESET/16/RI16FM.O", | |
202 16000, | |
203 G726_ENCODING_NONE, | |
204 G726_ENCODING_ULAW | |
205 }, | |
206 { | |
207 "", | |
208 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
209 "", | |
210 TESTDATA_DIR "DISK1/RESET/16/RV16FM.I", | |
211 TESTDATA_DIR "DISK1/RESET/16/RV16FM.O", | |
212 16000, | |
213 G726_ENCODING_ULAW, | |
214 G726_ENCODING_ULAW | |
215 }, | |
216 { | |
217 "", | |
218 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
219 "", | |
220 TESTDATA_DIR "DISK1/RESET/24/RN24FM.I", | |
221 TESTDATA_DIR "DISK1/RESET/24/RN24FM.O", | |
222 24000, | |
223 G726_ENCODING_ULAW, | |
224 G726_ENCODING_ULAW | |
225 }, | |
226 { | |
227 "", | |
228 "", | |
229 "", | |
230 TESTDATA_DIR "DISK1/INPUT/I24", | |
231 TESTDATA_DIR "DISK1/RESET/24/RI24FM.O", | |
232 24000, | |
233 G726_ENCODING_NONE, | |
234 G726_ENCODING_ULAW | |
235 }, | |
236 { | |
237 "", | |
238 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
239 "", | |
240 TESTDATA_DIR "DISK1/RESET/24/RV24FM.I", | |
241 TESTDATA_DIR "DISK1/RESET/24/RV24FM.O", | |
242 24000, | |
243 G726_ENCODING_ULAW, | |
244 G726_ENCODING_ULAW | |
245 }, | |
246 { | |
247 "", | |
248 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
249 "", | |
250 TESTDATA_DIR "DISK1/RESET/32/RN32FM.I", | |
251 TESTDATA_DIR "DISK1/RESET/32/RN32FM.O", | |
252 32000, | |
253 G726_ENCODING_ULAW, | |
254 G726_ENCODING_ULAW | |
255 }, | |
256 { | |
257 "", | |
258 "", | |
259 "", | |
260 TESTDATA_DIR "DISK1/INPUT/I32", | |
261 TESTDATA_DIR "DISK1/RESET/32/RI32FM.O", | |
262 32000, | |
263 G726_ENCODING_NONE, | |
264 G726_ENCODING_ULAW | |
265 }, | |
266 { | |
267 "", | |
268 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
269 "", | |
270 TESTDATA_DIR "DISK1/RESET/32/RV32FM.I", | |
271 TESTDATA_DIR "DISK1/RESET/32/RV32FM.O", | |
272 32000, | |
273 G726_ENCODING_ULAW, | |
274 G726_ENCODING_ULAW | |
275 }, | |
276 { | |
277 "", | |
278 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
279 "", | |
280 TESTDATA_DIR "DISK1/RESET/40/RN40FM.I", | |
281 TESTDATA_DIR "DISK1/RESET/40/RN40FM.O", | |
282 40000, | |
283 G726_ENCODING_ULAW, | |
284 G726_ENCODING_ULAW | |
285 }, | |
286 { | |
287 "", | |
288 "", | |
289 "", | |
290 TESTDATA_DIR "DISK1/INPUT/I40", | |
291 TESTDATA_DIR "DISK1/RESET/40/RI40FM.O", | |
292 40000, | |
293 G726_ENCODING_NONE, | |
294 G726_ENCODING_ULAW | |
295 }, | |
296 { | |
297 "", | |
298 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
299 "", | |
300 TESTDATA_DIR "DISK1/RESET/40/RV40FM.I", | |
301 TESTDATA_DIR "DISK1/RESET/40/RV40FM.O", | |
302 40000, | |
303 G726_ENCODING_ULAW, | |
304 G726_ENCODING_ULAW | |
305 }, | |
306 /* A-law to A-law tests */ | |
307 { | |
308 "", | |
309 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
310 "", | |
311 TESTDATA_DIR "DISK2/RESET/16/RN16FA.I", | |
312 TESTDATA_DIR "DISK2/RESET/16/RN16FA.O", | |
313 16000, | |
314 G726_ENCODING_ALAW, | |
315 G726_ENCODING_ALAW | |
316 }, | |
317 { | |
318 "", | |
319 "", | |
320 "", | |
321 TESTDATA_DIR "DISK2/INPUT/I16", | |
322 TESTDATA_DIR "DISK2/RESET/16/RI16FA.O", | |
323 16000, | |
324 G726_ENCODING_NONE, | |
325 G726_ENCODING_ALAW | |
326 }, | |
327 { | |
328 "", | |
329 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
330 "", | |
331 TESTDATA_DIR "DISK2/RESET/16/RV16FA.I", | |
332 TESTDATA_DIR "DISK2/RESET/16/RV16FA.O", | |
333 16000, | |
334 G726_ENCODING_ALAW, | |
335 G726_ENCODING_ALAW | |
336 }, | |
337 { | |
338 "", | |
339 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
340 "", | |
341 TESTDATA_DIR "DISK2/RESET/24/RN24FA.I", | |
342 TESTDATA_DIR "DISK2/RESET/24/RN24FA.O", | |
343 24000, | |
344 G726_ENCODING_ALAW, | |
345 G726_ENCODING_ALAW | |
346 }, | |
347 { | |
348 "", | |
349 "", | |
350 "", | |
351 TESTDATA_DIR "DISK2/INPUT/I24", | |
352 TESTDATA_DIR "DISK2/RESET/24/RI24FA.O", | |
353 24000, | |
354 G726_ENCODING_NONE, | |
355 G726_ENCODING_ALAW | |
356 }, | |
357 { | |
358 "", | |
359 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
360 "", | |
361 TESTDATA_DIR "DISK2/RESET/24/RV24FA.I", | |
362 TESTDATA_DIR "DISK2/RESET/24/RV24FA.O", | |
363 24000, | |
364 G726_ENCODING_ALAW, | |
365 G726_ENCODING_ALAW | |
366 }, | |
367 { | |
368 "", | |
369 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
370 "", | |
371 TESTDATA_DIR "DISK2/RESET/32/RN32FA.I", | |
372 TESTDATA_DIR "DISK2/RESET/32/RN32FA.O", | |
373 32000, | |
374 G726_ENCODING_ALAW, | |
375 G726_ENCODING_ALAW | |
376 }, | |
377 { | |
378 "", | |
379 "", | |
380 "", | |
381 TESTDATA_DIR "DISK2/INPUT/I32", | |
382 TESTDATA_DIR "DISK2/RESET/32/RI32FA.O", | |
383 32000, | |
384 G726_ENCODING_NONE, | |
385 G726_ENCODING_ALAW | |
386 }, | |
387 { | |
388 "", | |
389 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
390 "", | |
391 TESTDATA_DIR "DISK2/RESET/32/RV32FA.I", | |
392 TESTDATA_DIR "DISK2/RESET/32/RV32FA.O", | |
393 32000, | |
394 G726_ENCODING_ALAW, | |
395 G726_ENCODING_ALAW | |
396 }, | |
397 { | |
398 "", | |
399 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
400 "", | |
401 TESTDATA_DIR "DISK2/RESET/40/RN40FA.I", | |
402 TESTDATA_DIR "DISK2/RESET/40/RN40FA.O", | |
403 40000, | |
404 G726_ENCODING_ALAW, | |
405 G726_ENCODING_ALAW | |
406 }, | |
407 { | |
408 "", | |
409 "", | |
410 "", | |
411 TESTDATA_DIR "DISK2/INPUT/I40", | |
412 TESTDATA_DIR "DISK2/RESET/40/RI40FA.O", | |
413 40000, | |
414 G726_ENCODING_NONE, | |
415 G726_ENCODING_ALAW | |
416 }, | |
417 { | |
418 "", | |
419 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
420 "", | |
421 TESTDATA_DIR "DISK2/RESET/40/RV40FA.I", | |
422 TESTDATA_DIR "DISK2/RESET/40/RV40FA.O", | |
423 40000, | |
424 G726_ENCODING_ALAW, | |
425 G726_ENCODING_ALAW | |
426 }, | |
427 /* u-law to A-law tests */ | |
428 { | |
429 "", | |
430 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
431 "", | |
432 TESTDATA_DIR "DISK1/RESET/16/RN16FM.I", | |
433 TESTDATA_DIR "DISK1/RESET/16/RN16FC.O", | |
434 16000, | |
435 G726_ENCODING_ULAW, | |
436 G726_ENCODING_ALAW | |
437 }, | |
438 { | |
439 "", | |
440 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
441 "", | |
442 TESTDATA_DIR "DISK1/RESET/16/RV16FM.I", | |
443 TESTDATA_DIR "DISK1/RESET/16/RV16FC.O", | |
444 16000, | |
445 G726_ENCODING_ULAW, | |
446 G726_ENCODING_ALAW | |
447 }, | |
448 { | |
449 "", | |
450 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
451 "", | |
452 TESTDATA_DIR "DISK1/RESET/24/RN24FM.I", | |
453 TESTDATA_DIR "DISK1/RESET/24/RN24FC.O", | |
454 24000, | |
455 G726_ENCODING_ULAW, | |
456 G726_ENCODING_ALAW | |
457 }, | |
458 { | |
459 "", | |
460 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
461 "", | |
462 TESTDATA_DIR "DISK1/RESET/24/RV24FM.I", | |
463 TESTDATA_DIR "DISK1/RESET/24/RV24FC.O", | |
464 24000, | |
465 G726_ENCODING_ULAW, | |
466 G726_ENCODING_ALAW | |
467 }, | |
468 { | |
469 "", | |
470 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
471 "", | |
472 TESTDATA_DIR "DISK1/RESET/32/RN32FM.I", | |
473 TESTDATA_DIR "DISK1/RESET/32/RN32FC.O", | |
474 32000, | |
475 G726_ENCODING_ULAW, | |
476 G726_ENCODING_ALAW | |
477 }, | |
478 { | |
479 "", | |
480 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
481 "", | |
482 TESTDATA_DIR "DISK1/RESET/32/RV32FM.I", | |
483 TESTDATA_DIR "DISK1/RESET/32/RV32FC.O", | |
484 32000, | |
485 G726_ENCODING_ULAW, | |
486 G726_ENCODING_ALAW | |
487 }, | |
488 { | |
489 "", | |
490 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
491 "", | |
492 TESTDATA_DIR "DISK1/RESET/40/RN40FM.I", | |
493 TESTDATA_DIR "DISK1/RESET/40/RN40FC.O", | |
494 40000, | |
495 G726_ENCODING_ULAW, | |
496 G726_ENCODING_ALAW | |
497 }, | |
498 { | |
499 "", | |
500 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
501 "", | |
502 TESTDATA_DIR "DISK1/RESET/40/RV40FM.I", | |
503 TESTDATA_DIR "DISK1/RESET/40/RV40FC.O", | |
504 40000, | |
505 G726_ENCODING_ULAW, | |
506 G726_ENCODING_ALAW | |
507 }, | |
508 /* A-law to u-law tests */ | |
509 { | |
510 "", | |
511 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
512 "", | |
513 TESTDATA_DIR "DISK2/RESET/16/RN16FA.I", | |
514 TESTDATA_DIR "DISK2/RESET/16/RN16FX.O", | |
515 16000, | |
516 G726_ENCODING_ALAW, | |
517 G726_ENCODING_ULAW | |
518 }, | |
519 { | |
520 "", | |
521 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
522 "", | |
523 TESTDATA_DIR "DISK2/RESET/16/RV16FA.I", | |
524 TESTDATA_DIR "DISK2/RESET/16/RV16FX.O", | |
525 16000, | |
526 G726_ENCODING_ALAW, | |
527 G726_ENCODING_ULAW | |
528 }, | |
529 { | |
530 "", | |
531 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
532 "", | |
533 TESTDATA_DIR "DISK2/RESET/24/RN24FA.I", | |
534 TESTDATA_DIR "DISK2/RESET/24/RN24FX.O", | |
535 24000, | |
536 G726_ENCODING_ALAW, | |
537 G726_ENCODING_ULAW | |
538 }, | |
539 { | |
540 "", | |
541 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
542 "", | |
543 TESTDATA_DIR "DISK2/RESET/24/RV24FA.I", | |
544 TESTDATA_DIR "DISK2/RESET/24/RV24FX.O", | |
545 24000, | |
546 G726_ENCODING_ALAW, | |
547 G726_ENCODING_ULAW | |
548 }, | |
549 { | |
550 "", | |
551 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
552 "", | |
553 TESTDATA_DIR "DISK2/RESET/32/RN32FA.I", | |
554 TESTDATA_DIR "DISK2/RESET/32/RN32FX.O", | |
555 32000, | |
556 G726_ENCODING_ALAW, | |
557 G726_ENCODING_ULAW | |
558 }, | |
559 { | |
560 "", | |
561 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
562 "", | |
563 TESTDATA_DIR "DISK2/RESET/32/RV32FA.I", | |
564 TESTDATA_DIR "DISK2/RESET/32/RV32FX.O", | |
565 32000, | |
566 G726_ENCODING_ALAW, | |
567 G726_ENCODING_ULAW | |
568 }, | |
569 { | |
570 "", | |
571 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
572 "", | |
573 TESTDATA_DIR "DISK2/RESET/40/RN40FA.I", | |
574 TESTDATA_DIR "DISK2/RESET/40/RN40FX.O", | |
575 40000, | |
576 G726_ENCODING_ALAW, | |
577 G726_ENCODING_ULAW | |
578 }, | |
579 { | |
580 "", | |
581 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
582 "", | |
583 TESTDATA_DIR "DISK2/RESET/40/RV40FA.I", | |
584 TESTDATA_DIR "DISK2/RESET/40/RV40FX.O", | |
585 40000, | |
586 G726_ENCODING_ALAW, | |
587 G726_ENCODING_ULAW | |
588 }, | |
589 /* u-law to u-law tests */ | |
590 { | |
591 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
592 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
593 TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", | |
594 TESTDATA_DIR "DISK1/HOMING/16/HN16FM.I", | |
595 TESTDATA_DIR "DISK1/HOMING/16/HN16FM.O", | |
596 16000, | |
597 G726_ENCODING_ULAW, | |
598 G726_ENCODING_ULAW | |
599 }, | |
600 { | |
601 "", | |
602 "", | |
603 TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", | |
604 TESTDATA_DIR "DISK1/INPUT/I16", | |
605 TESTDATA_DIR "DISK1/HOMING/16/HI16FM.O", | |
606 16000, | |
607 G726_ENCODING_NONE, | |
608 G726_ENCODING_ULAW | |
609 }, | |
610 { | |
611 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
612 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
613 TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", | |
614 TESTDATA_DIR "DISK1/HOMING/16/HV16FM.I", | |
615 TESTDATA_DIR "DISK1/HOMING/16/HV16FM.O", | |
616 16000, | |
617 G726_ENCODING_ULAW, | |
618 G726_ENCODING_ULAW | |
619 }, | |
620 { | |
621 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
622 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
623 TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", | |
624 TESTDATA_DIR "DISK1/HOMING/24/HN24FM.I", | |
625 TESTDATA_DIR "DISK1/HOMING/24/HN24FM.O", | |
626 24000, | |
627 G726_ENCODING_ULAW, | |
628 G726_ENCODING_ULAW | |
629 }, | |
630 { | |
631 "", | |
632 "", | |
633 TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", | |
634 TESTDATA_DIR "DISK1/INPUT/I24", | |
635 TESTDATA_DIR "DISK1/HOMING/24/HI24FM.O", | |
636 24000, | |
637 G726_ENCODING_NONE, | |
638 G726_ENCODING_ULAW | |
639 }, | |
640 { | |
641 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
642 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
643 TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", | |
644 TESTDATA_DIR "DISK1/HOMING/24/HV24FM.I", | |
645 TESTDATA_DIR "DISK1/HOMING/24/HV24FM.O", | |
646 24000, | |
647 G726_ENCODING_ULAW, | |
648 G726_ENCODING_ULAW | |
649 }, | |
650 { | |
651 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
652 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
653 TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", | |
654 TESTDATA_DIR "DISK1/HOMING/32/HN32FM.I", | |
655 TESTDATA_DIR "DISK1/HOMING/32/HN32FM.O", | |
656 32000, | |
657 G726_ENCODING_ULAW, | |
658 G726_ENCODING_ULAW | |
659 }, | |
660 { | |
661 "", | |
662 "", | |
663 TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", | |
664 TESTDATA_DIR "DISK1/INPUT/I32", | |
665 TESTDATA_DIR "DISK1/HOMING/32/HI32FM.O", | |
666 32000, | |
667 G726_ENCODING_NONE, | |
668 G726_ENCODING_ULAW | |
669 }, | |
670 { | |
671 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
672 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
673 TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", | |
674 TESTDATA_DIR "DISK1/HOMING/32/HV32FM.I", | |
675 TESTDATA_DIR "DISK1/HOMING/32/HV32FM.O", | |
676 32000, | |
677 G726_ENCODING_ULAW, | |
678 G726_ENCODING_ULAW | |
679 }, | |
680 { | |
681 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
682 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
683 TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", | |
684 TESTDATA_DIR "DISK1/HOMING/40/HN40FM.I", | |
685 TESTDATA_DIR "DISK1/HOMING/40/HN40FM.O", | |
686 40000, | |
687 G726_ENCODING_ULAW, | |
688 G726_ENCODING_ULAW | |
689 }, | |
690 { | |
691 "", | |
692 "", | |
693 TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", | |
694 TESTDATA_DIR "DISK1/INPUT/I40", | |
695 TESTDATA_DIR "DISK1/HOMING/40/HI40FM.O", | |
696 40000, | |
697 G726_ENCODING_NONE, | |
698 G726_ENCODING_ULAW | |
699 }, | |
700 { | |
701 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
702 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
703 TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", | |
704 TESTDATA_DIR "DISK1/HOMING/40/HV40FM.I", | |
705 TESTDATA_DIR "DISK1/HOMING/40/HV40FM.O", | |
706 40000, | |
707 G726_ENCODING_ULAW, | |
708 G726_ENCODING_ULAW | |
709 }, | |
710 /* A-law to A-law tests */ | |
711 { | |
712 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
713 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
714 TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", | |
715 TESTDATA_DIR "DISK2/HOMING/16/HN16FA.I", | |
716 TESTDATA_DIR "DISK2/HOMING/16/HN16FA.O", | |
717 16000, | |
718 G726_ENCODING_ALAW, | |
719 G726_ENCODING_ALAW | |
720 }, | |
721 { | |
722 "", | |
723 "", | |
724 TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", | |
725 TESTDATA_DIR "DISK2/INPUT/I16", | |
726 TESTDATA_DIR "DISK2/HOMING/16/HI16FA.O", | |
727 16000, | |
728 G726_ENCODING_NONE, | |
729 G726_ENCODING_ALAW | |
730 }, | |
731 { | |
732 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
733 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
734 TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", | |
735 TESTDATA_DIR "DISK2/HOMING/16/HV16FA.I", | |
736 TESTDATA_DIR "DISK2/HOMING/16/HV16FA.O", | |
737 16000, | |
738 G726_ENCODING_ALAW, | |
739 G726_ENCODING_ALAW | |
740 }, | |
741 { | |
742 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
743 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
744 TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", | |
745 TESTDATA_DIR "DISK2/HOMING/24/HN24FA.I", | |
746 TESTDATA_DIR "DISK2/HOMING/24/HN24FA.O", | |
747 24000, | |
748 G726_ENCODING_ALAW, | |
749 G726_ENCODING_ALAW | |
750 }, | |
751 { | |
752 "", | |
753 "", | |
754 TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", | |
755 TESTDATA_DIR "DISK2/INPUT/I24", | |
756 TESTDATA_DIR "DISK2/HOMING/24/HI24FA.O", | |
757 24000, | |
758 G726_ENCODING_NONE, | |
759 G726_ENCODING_ALAW | |
760 }, | |
761 { | |
762 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
763 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
764 TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", | |
765 TESTDATA_DIR "DISK2/HOMING/24/HV24FA.I", | |
766 TESTDATA_DIR "DISK2/HOMING/24/HV24FA.O", | |
767 24000, | |
768 G726_ENCODING_ALAW, | |
769 G726_ENCODING_ALAW | |
770 }, | |
771 { | |
772 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
773 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
774 TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", | |
775 TESTDATA_DIR "DISK2/HOMING/32/HN32FA.I", | |
776 TESTDATA_DIR "DISK2/HOMING/32/HN32FA.O", | |
777 32000, | |
778 G726_ENCODING_ALAW, | |
779 G726_ENCODING_ALAW | |
780 }, | |
781 { | |
782 "", | |
783 "", | |
784 TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", | |
785 TESTDATA_DIR "DISK2/INPUT/I32", | |
786 TESTDATA_DIR "DISK2/HOMING/32/HI32FA.O", | |
787 32000, | |
788 G726_ENCODING_NONE, | |
789 G726_ENCODING_ALAW | |
790 }, | |
791 { | |
792 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
793 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
794 TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", | |
795 TESTDATA_DIR "DISK2/HOMING/32/HV32FA.I", | |
796 TESTDATA_DIR "DISK2/HOMING/32/HV32FA.O", | |
797 32000, | |
798 G726_ENCODING_ALAW, | |
799 G726_ENCODING_ALAW | |
800 }, | |
801 { | |
802 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
803 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
804 TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", | |
805 TESTDATA_DIR "DISK2/HOMING/40/HN40FA.I", | |
806 TESTDATA_DIR "DISK2/HOMING/40/HN40FA.O", | |
807 40000, | |
808 G726_ENCODING_ALAW, | |
809 G726_ENCODING_ALAW | |
810 }, | |
811 { | |
812 "", | |
813 "", | |
814 TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", | |
815 TESTDATA_DIR "DISK2/INPUT/I40", | |
816 TESTDATA_DIR "DISK2/HOMING/40/HI40FA.O", | |
817 40000, | |
818 G726_ENCODING_NONE, | |
819 G726_ENCODING_ALAW | |
820 }, | |
821 { | |
822 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
823 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
824 TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", | |
825 TESTDATA_DIR "DISK2/HOMING/40/HV40FA.I", | |
826 TESTDATA_DIR "DISK2/HOMING/40/HV40FA.O", | |
827 40000, | |
828 G726_ENCODING_ALAW, | |
829 G726_ENCODING_ALAW | |
830 }, | |
831 /* u-law to A-law tests */ | |
832 { | |
833 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
834 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
835 TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", | |
836 TESTDATA_DIR "DISK1/HOMING/16/HN16FM.I", | |
837 TESTDATA_DIR "DISK1/HOMING/16/HN16FC.O", | |
838 16000, | |
839 G726_ENCODING_ULAW, | |
840 G726_ENCODING_ALAW | |
841 }, | |
842 { | |
843 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
844 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
845 TESTDATA_DIR "DISK2/HOMING/16/I_INI_16.A", | |
846 TESTDATA_DIR "DISK1/HOMING/16/HV16FM.I", | |
847 TESTDATA_DIR "DISK1/HOMING/16/HV16FC.O", | |
848 16000, | |
849 G726_ENCODING_ULAW, | |
850 G726_ENCODING_ALAW | |
851 }, | |
852 { | |
853 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
854 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
855 TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", | |
856 TESTDATA_DIR "DISK1/HOMING/24/HN24FM.I", | |
857 TESTDATA_DIR "DISK1/HOMING/24/HN24FC.O", | |
858 24000, | |
859 G726_ENCODING_ULAW, | |
860 G726_ENCODING_ALAW | |
861 }, | |
862 { | |
863 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
864 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
865 TESTDATA_DIR "DISK2/HOMING/24/I_INI_24.A", | |
866 TESTDATA_DIR "DISK1/HOMING/24/HV24FM.I", | |
867 TESTDATA_DIR "DISK1/HOMING/24/HV24FC.O", | |
868 24000, | |
869 G726_ENCODING_ULAW, | |
870 G726_ENCODING_ALAW | |
871 }, | |
872 { | |
873 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
874 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
875 TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", | |
876 TESTDATA_DIR "DISK1/HOMING/32/HN32FM.I", | |
877 TESTDATA_DIR "DISK1/HOMING/32/HN32FC.O", | |
878 32000, | |
879 G726_ENCODING_ULAW, | |
880 G726_ENCODING_ALAW | |
881 }, | |
882 { | |
883 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
884 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
885 TESTDATA_DIR "DISK2/HOMING/32/I_INI_32.A", | |
886 TESTDATA_DIR "DISK1/HOMING/32/HV32FM.I", | |
887 TESTDATA_DIR "DISK1/HOMING/32/HV32FC.O", | |
888 32000, | |
889 G726_ENCODING_ULAW, | |
890 G726_ENCODING_ALAW | |
891 }, | |
892 { | |
893 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
894 TESTDATA_DIR "DISK1/INPUT/NRM.M", | |
895 TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", | |
896 TESTDATA_DIR "DISK1/HOMING/40/HN40FM.I", | |
897 TESTDATA_DIR "DISK1/HOMING/40/HN40FC.O", | |
898 40000, | |
899 G726_ENCODING_ULAW, | |
900 G726_ENCODING_ALAW | |
901 }, | |
902 { | |
903 TESTDATA_DIR "DISK1/PCM_INIT.M", | |
904 TESTDATA_DIR "DISK1/INPUT/OVR.M", | |
905 TESTDATA_DIR "DISK2/HOMING/40/I_INI_40.A", | |
906 TESTDATA_DIR "DISK1/HOMING/40/HV40FM.I", | |
907 TESTDATA_DIR "DISK1/HOMING/40/HV40FC.O", | |
908 40000, | |
909 G726_ENCODING_ULAW, | |
910 G726_ENCODING_ALAW | |
911 }, | |
912 /* A-law to u-law tests */ | |
913 { | |
914 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
915 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
916 TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", | |
917 TESTDATA_DIR "DISK2/HOMING/16/HN16FA.I", | |
918 TESTDATA_DIR "DISK2/HOMING/16/HN16FX.O", | |
919 16000, | |
920 G726_ENCODING_ALAW, | |
921 G726_ENCODING_ULAW | |
922 }, | |
923 { | |
924 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
925 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
926 TESTDATA_DIR "DISK1/HOMING/16/I_INI_16.M", | |
927 TESTDATA_DIR "DISK2/HOMING/16/HV16FA.I", | |
928 TESTDATA_DIR "DISK2/HOMING/16/HV16FX.O", | |
929 16000, | |
930 G726_ENCODING_ALAW, | |
931 G726_ENCODING_ULAW | |
932 }, | |
933 { | |
934 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
935 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
936 TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", | |
937 TESTDATA_DIR "DISK2/HOMING/24/HN24FA.I", | |
938 TESTDATA_DIR "DISK2/HOMING/24/HN24FX.O", | |
939 24000, | |
940 G726_ENCODING_ALAW, | |
941 G726_ENCODING_ULAW | |
942 }, | |
943 { | |
944 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
945 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
946 TESTDATA_DIR "DISK1/HOMING/24/I_INI_24.M", | |
947 TESTDATA_DIR "DISK2/HOMING/24/HV24FA.I", | |
948 TESTDATA_DIR "DISK2/HOMING/24/HV24FX.O", | |
949 24000, | |
950 G726_ENCODING_ALAW, | |
951 G726_ENCODING_ULAW | |
952 }, | |
953 { | |
954 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
955 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
956 TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", | |
957 TESTDATA_DIR "DISK2/HOMING/32/HN32FA.I", | |
958 TESTDATA_DIR "DISK2/HOMING/32/HN32FX.O", | |
959 32000, | |
960 G726_ENCODING_ALAW, | |
961 G726_ENCODING_ULAW | |
962 }, | |
963 { | |
964 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
965 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
966 TESTDATA_DIR "DISK1/HOMING/32/I_INI_32.M", | |
967 TESTDATA_DIR "DISK2/HOMING/32/HV32FA.I", | |
968 TESTDATA_DIR "DISK2/HOMING/32/HV32FX.O", | |
969 32000, | |
970 G726_ENCODING_ALAW, | |
971 G726_ENCODING_ULAW | |
972 }, | |
973 { | |
974 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
975 TESTDATA_DIR "DISK2/INPUT/NRM.A", | |
976 TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", | |
977 TESTDATA_DIR "DISK2/HOMING/40/HN40FA.I", | |
978 TESTDATA_DIR "DISK2/HOMING/40/HN40FX.O", | |
979 40000, | |
980 G726_ENCODING_ALAW, | |
981 G726_ENCODING_ULAW | |
982 }, | |
983 { | |
984 TESTDATA_DIR "DISK2/PCM_INIT.A", | |
985 TESTDATA_DIR "DISK2/INPUT/OVR.A", | |
986 TESTDATA_DIR "DISK1/HOMING/40/I_INI_40.M", | |
987 TESTDATA_DIR "DISK2/HOMING/40/HV40FA.I", | |
988 TESTDATA_DIR "DISK2/HOMING/40/HV40FX.O", | |
989 40000, | |
990 G726_ENCODING_ALAW, | |
991 G726_ENCODING_ULAW | |
992 }, | |
993 { | |
994 NULL, | |
995 NULL, | |
996 NULL, | |
997 NULL, | |
998 NULL, | |
999 0, | |
1000 0, | |
1001 0 | |
1002 } | |
1003 }; | |
1004 | |
1005 static int hex_get(char *s) | |
1006 { | |
1007 int i; | |
1008 int value; | |
1009 int x; | |
1010 | |
1011 for (value = i = 0; i < 2; i++) | |
1012 { | |
1013 x = *s++ - 0x30; | |
1014 if (x > 9) | |
1015 x -= 0x07; | |
1016 if (x > 15) | |
1017 x -= 0x20; | |
1018 if (x < 0 || x > 15) | |
1019 return -1; | |
1020 value <<= 4; | |
1021 value |= x; | |
1022 } | |
1023 return value; | |
1024 } | |
1025 /*- End of function --------------------------------------------------------*/ | |
1026 | |
1027 static int get_vector(FILE *file, uint8_t vec[]) | |
1028 { | |
1029 char buf[132 + 1]; | |
1030 char *s; | |
1031 int i; | |
1032 int value; | |
1033 | |
1034 while (fgets(buf, 133, file)) | |
1035 { | |
1036 s = buf; | |
1037 i = 0; | |
1038 while ((value = hex_get(s)) >= 0) | |
1039 { | |
1040 vec[i++] = value; | |
1041 s += 2; | |
1042 } | |
1043 return i; | |
1044 } | |
1045 return 0; | |
1046 } | |
1047 /*- End of function --------------------------------------------------------*/ | |
1048 | |
1049 static int get_test_vector(const char *file, uint8_t buf[], int max_len) | |
1050 { | |
1051 int octets; | |
1052 int i; | |
1053 int sum; | |
1054 FILE *infile; | |
1055 | |
1056 if ((infile = fopen(file, "r")) == NULL) | |
1057 { | |
1058 fprintf(stderr, " Failed to open '%s'\n", file); | |
1059 exit(2); | |
1060 } | |
1061 octets = 0; | |
1062 while ((i = get_vector(infile, buf + octets)) > 0) | |
1063 octets += i; | |
1064 fclose(infile); | |
1065 /* The last octet is a sumcheck, so the real data octets are one less than | |
1066 the total we have */ | |
1067 octets--; | |
1068 /* Test the checksum */ | |
1069 for (sum = i = 0; i < octets; i++) | |
1070 sum += buf[i]; | |
1071 if (sum%255 != (int) buf[i]) | |
1072 { | |
1073 fprintf(stderr, " Sumcheck failed in '%s' - %x %x\n", file, sum%255, buf[i]); | |
1074 exit(2); | |
1075 } | |
1076 return octets; | |
1077 } | |
1078 /*- End of function --------------------------------------------------------*/ | |
1079 | |
1080 static void itu_compliance_tests(void) | |
1081 { | |
1082 g726_state_t enc_state; | |
1083 g726_state_t dec_state; | |
1084 int len2; | |
1085 int len3; | |
1086 int i; | |
1087 int test; | |
1088 int bits_per_code; | |
1089 int bad_samples; | |
1090 int conditioning_samples; | |
1091 int samples; | |
1092 int conditioning_adpcm; | |
1093 int adpcm; | |
1094 | |
1095 len2 = 0; | |
1096 conditioning_samples = 0; | |
1097 for (test = 0; itu_test_sets[test].rate; test++) | |
1098 { | |
1099 printf("Test %2d: '%s' + '%s'\n" | |
1100 " -> '%s' + '%s'\n" | |
1101 " -> '%s' [%d, %d, %d]\n", | |
1102 test, | |
1103 itu_test_sets[test].conditioning_pcm_file, | |
1104 itu_test_sets[test].pcm_file, | |
1105 itu_test_sets[test].conditioning_adpcm_file, | |
1106 itu_test_sets[test].adpcm_file, | |
1107 itu_test_sets[test].output_file, | |
1108 itu_test_sets[test].rate, | |
1109 itu_test_sets[test].compression_law, | |
1110 itu_test_sets[test].decompression_law); | |
1111 switch (itu_test_sets[test].rate) | |
1112 { | |
1113 case 16000: | |
1114 bits_per_code = 2; | |
1115 break; | |
1116 case 24000: | |
1117 bits_per_code = 3; | |
1118 break; | |
1119 case 32000: | |
1120 default: | |
1121 bits_per_code = 4; | |
1122 break; | |
1123 case 40000: | |
1124 bits_per_code = 5; | |
1125 break; | |
1126 } | |
1127 if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) | |
1128 { | |
1129 /* Test the encode side */ | |
1130 g726_init(&enc_state, itu_test_sets[test].rate, itu_test_sets[test].compression_law, G726_PACKING_NONE); | |
1131 if (itu_test_sets[test].conditioning_pcm_file[0]) | |
1132 { | |
1133 conditioning_samples = get_test_vector(itu_test_sets[test].conditioning_pcm_file, xlaw, MAX_TEST_VECTOR_LEN); | |
1134 printf("Test %d: Homing %d samples at %dbps\n", test, conditioning_samples, itu_test_sets[test].rate); | |
1135 } | |
1136 else | |
1137 { | |
1138 conditioning_samples = 0; | |
1139 } | |
1140 samples = get_test_vector(itu_test_sets[test].pcm_file, xlaw + conditioning_samples, MAX_TEST_VECTOR_LEN); | |
1141 memcpy(itudata, xlaw, samples + conditioning_samples); | |
1142 printf("Test %d: Compressing %d samples at %dbps\n", test, samples, itu_test_sets[test].rate); | |
1143 len2 = g726_encode(&enc_state, adpcmdata, itudata, conditioning_samples + samples); | |
1144 } | |
1145 /* Test the decode side */ | |
1146 g726_init(&dec_state, itu_test_sets[test].rate, itu_test_sets[test].decompression_law, G726_PACKING_NONE); | |
1147 if (itu_test_sets[test].conditioning_adpcm_file[0]) | |
1148 { | |
1149 conditioning_adpcm = get_test_vector(itu_test_sets[test].conditioning_adpcm_file, unpacked, MAX_TEST_VECTOR_LEN); | |
1150 printf("Test %d: Homing %d octets at %dbps\n", test, conditioning_adpcm, itu_test_sets[test].rate); | |
1151 } | |
1152 else | |
1153 { | |
1154 conditioning_adpcm = 0; | |
1155 } | |
1156 adpcm = get_test_vector(itu_test_sets[test].adpcm_file, unpacked + conditioning_adpcm, MAX_TEST_VECTOR_LEN); | |
1157 if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) | |
1158 { | |
1159 /* Test our compressed version against the reference compressed version */ | |
1160 printf("Test %d: Compressed data check - %d/%d octets\n", test, conditioning_adpcm + adpcm, len2); | |
1161 if (conditioning_adpcm + adpcm == len2) | |
1162 { | |
1163 for (bad_samples = 0, i = conditioning_samples; i < len2; i++) | |
1164 { | |
1165 if (adpcmdata[i] != unpacked[i]) | |
1166 { | |
1167 bad_samples++; | |
1168 printf("Test %d: Compressed mismatch %d %x %x\n", test, i, adpcmdata[i], unpacked[i]); | |
1169 } | |
1170 } | |
1171 if (bad_samples > 0) | |
1172 { | |
1173 printf("Test failed\n"); | |
1174 exit(2); | |
1175 } | |
1176 printf("Test passed\n"); | |
1177 } | |
1178 else | |
1179 { | |
1180 printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, conditioning_adpcm + adpcm, len2); | |
1181 exit(2); | |
1182 } | |
1183 } | |
1184 | |
1185 len3 = g726_decode(&dec_state, outdata, unpacked, conditioning_adpcm + adpcm); | |
1186 | |
1187 /* Get the output reference data */ | |
1188 samples = get_test_vector(itu_test_sets[test].output_file, xlaw, MAX_TEST_VECTOR_LEN); | |
1189 memcpy(itu_ref, xlaw, samples); | |
1190 /* Test our decompressed version against the reference decompressed version */ | |
1191 printf("Test %d: Decompressed data check - %d/%d samples\n", test, samples, len3 - conditioning_adpcm); | |
1192 if (samples == len3 - conditioning_adpcm) | |
1193 { | |
1194 for (bad_samples = 0, i = 0; i < len3; i++) | |
1195 { | |
1196 if (itu_ref[i] != ((uint8_t *) outdata)[i + conditioning_adpcm]) | |
1197 { | |
1198 bad_samples++; | |
1199 printf("Test %d: Decompressed mismatch %d %x %x\n", test, i, itu_ref[i], ((uint8_t *) outdata)[i + conditioning_adpcm]); | |
1200 } | |
1201 } | |
1202 if (bad_samples > 0) | |
1203 { | |
1204 printf("Test failed\n"); | |
1205 exit(2); | |
1206 } | |
1207 printf("Test passed\n"); | |
1208 } | |
1209 else | |
1210 { | |
1211 printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, samples, len3 - conditioning_adpcm); | |
1212 exit(2); | |
1213 } | |
1214 } | |
1215 | |
1216 printf("Tests passed.\n"); | |
1217 } | |
1218 /*- End of function --------------------------------------------------------*/ | |
1219 | |
1220 int main(int argc, char *argv[]) | |
1221 { | |
1222 g726_state_t enc_state; | |
1223 g726_state_t dec_state; | |
1224 int opt; | |
1225 int itutests; | |
1226 int bit_rate; | |
1227 SNDFILE *inhandle; | |
1228 SNDFILE *outhandle; | |
1229 int16_t amp[1024]; | |
1230 int frames; | |
1231 int outframes; | |
1232 int adpcm; | |
1233 int packing; | |
1234 | |
1235 bit_rate = 32000; | |
1236 itutests = TRUE; | |
1237 packing = G726_PACKING_NONE; | |
1238 while ((opt = getopt(argc, argv, "b:LR")) != -1) | |
1239 { | |
1240 switch (opt) | |
1241 { | |
1242 case 'b': | |
1243 bit_rate = atoi(optarg); | |
1244 if (bit_rate != 16000 && bit_rate != 24000 && bit_rate != 32000 && bit_rate != 40000) | |
1245 { | |
1246 fprintf(stderr, "Invalid bit rate selected. Only 16000, 24000, 32000 and 40000 are valid.\n"); | |
1247 exit(2); | |
1248 } | |
1249 itutests = FALSE; | |
1250 break; | |
1251 case 'L': | |
1252 packing = G726_PACKING_LEFT; | |
1253 break; | |
1254 case 'R': | |
1255 packing = G726_PACKING_RIGHT; | |
1256 break; | |
1257 default: | |
1258 //usage(); | |
1259 exit(2); | |
1260 } | |
1261 } | |
1262 | |
1263 if (itutests) | |
1264 { | |
1265 itu_compliance_tests(); | |
1266 } | |
1267 else | |
1268 { | |
1269 if ((inhandle = sf_open_telephony_read(IN_FILE_NAME, 1)) == NULL) | |
1270 { | |
1271 fprintf(stderr, " Cannot open audio file '%s'\n", IN_FILE_NAME); | |
1272 exit(2); | |
1273 } | |
1274 if ((outhandle = sf_open_telephony_write(OUT_FILE_NAME, 1)) == NULL) | |
1275 { | |
1276 fprintf(stderr, " Cannot create audio file '%s'\n", OUT_FILE_NAME); | |
1277 exit(2); | |
1278 } | |
1279 | |
1280 printf("ADPCM packing is %d\n", packing); | |
1281 g726_init(&enc_state, bit_rate, G726_ENCODING_LINEAR, packing); | |
1282 g726_init(&dec_state, bit_rate, G726_ENCODING_LINEAR, packing); | |
1283 | |
1284 while ((frames = sf_readf_short(inhandle, amp, 159))) | |
1285 { | |
1286 adpcm = g726_encode(&enc_state, adpcmdata, amp, frames); | |
1287 frames = g726_decode(&dec_state, amp, adpcmdata, adpcm); | |
1288 outframes = sf_writef_short(outhandle, amp, frames); | |
1289 } | |
1290 if (sf_close(inhandle) != 0) | |
1291 { | |
1292 printf(" Cannot close audio file '%s'\n", IN_FILE_NAME); | |
1293 exit(2); | |
1294 } | |
1295 if (sf_close(outhandle) != 0) | |
1296 { | |
1297 printf(" Cannot close audio file '%s'\n", OUT_FILE_NAME); | |
1298 exit(2); | |
1299 } | |
1300 printf("'%s' transcoded to '%s' at %dbps.\n", IN_FILE_NAME, OUT_FILE_NAME, bit_rate); | |
1301 } | |
1302 return 0; | |
1303 } | |
1304 /*- End of function --------------------------------------------------------*/ | |
1305 /*- End of file ------------------------------------------------------------*/ |