comparison spandsp-0.0.3/spandsp-0.0.3/tests/g726_tests.c @ 5:f762bf195c4b

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

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.