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 ------------------------------------------------------------*/

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