2 * Copyright (c) 1999 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * The A-law to u-law and u-law to A-law conversion routines and tables
29 * were taken from the G.711 reference implementation from Sun and freely
30 * available as http://www.itu.int/itudoc/itu-t/rec/g/g700-799/refimpl.txt.
32 * Therefore for that part of the code, the following restrictions apply:
35 * This source code is a product of Sun Microsystems, Inc. and is provided
36 * for unrestricted use. Users may copy or modify this source code without
39 * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
40 * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
41 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
43 * Sun source code is provided with no support and without any obligation on
44 * the part of Sun Microsystems, Inc. to assist in its use, correction,
45 * modification or enhancement.
47 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
48 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
49 * OR ANY PART THEREOF.
51 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
52 * or profits or other special, indirect and consequential damages, even if
53 * Sun has been advised of the possibility of such damages.
55 * Sun Microsystems, Inc.
57 * Mountain View, California 94043
61 * The bitreverse table was contributed by Stefan Bethke.
63 *---------------------------------------------------------------------------
65 * A-law / u-law conversions as specified in G.711
66 * -----------------------------------------------
68 * last edit-date: [Mon Dec 13 21:44:01 1999]
70 * $Id: g711conv.c,v 1.5 1999/12/13 21:25:24 hm Exp $
72 * $FreeBSD: src/usr.sbin/i4b/g711conv/g711conv.c,v 1.4.2.1 2001/08/01 17:45:02 obrien Exp $
73 * $DragonFly: src/usr.sbin/i4b/g711conv/g711conv.c,v 1.5 2005/11/25 01:58:52 swildner Exp $
75 *---------------------------------------------------------------------------*/
79 #include <i4b_machine/i4b_ioctl.h>
81 /* copy from CCITT G.711 specifications */
83 /* u- to A-law conversions */
85 unsigned char _u2a
[128] = {
86 1, 1, 2, 2, 3, 3, 4, 4,
87 5, 5, 6, 6, 7, 7, 8, 8,
88 9, 10, 11, 12, 13, 14, 15, 16,
89 17, 18, 19, 20, 21, 22, 23, 24,
90 25, 27, 29, 31, 33, 34, 35, 36,
91 37, 38, 39, 40, 41, 42, 43, 44,
92 46, 48, 49, 50, 51, 52, 53, 54,
93 55, 56, 57, 58, 59, 60, 61, 62,
94 64, 65, 66, 67, 68, 69, 70, 71,
95 72, 73, 74, 75, 76, 77, 78, 79,
96 81, 82, 83, 84, 85, 86, 87, 88,
97 89, 90, 91, 92, 93, 94, 95, 96,
98 97, 98, 99, 100, 101, 102, 103, 104,
99 105, 106, 107, 108, 109, 110, 111, 112,
100 113, 114, 115, 116, 117, 118, 119, 120,
101 121, 122, 123, 124, 125, 126, 127, 128
104 /* A- to u-law conversions */
106 unsigned char _a2u
[128] = {
107 1, 3, 5, 7, 9, 11, 13, 15,
108 16, 17, 18, 19, 20, 21, 22, 23,
109 24, 25, 26, 27, 28, 29, 30, 31,
110 32, 32, 33, 33, 34, 34, 35, 35,
111 36, 37, 38, 39, 40, 41, 42, 43,
112 44, 45, 46, 47, 48, 48, 49, 49,
113 50, 51, 52, 53, 54, 55, 56, 57,
114 58, 59, 60, 61, 62, 63, 64, 64,
115 65, 66, 67, 68, 69, 70, 71, 72,
116 73, 74, 75, 76, 77, 78, 79, 79,
117 80, 81, 82, 83, 84, 85, 86, 87,
118 88, 89, 90, 91, 92, 93, 94, 95,
119 96, 97, 98, 99, 100, 101, 102, 103,
120 104, 105, 106, 107, 108, 109, 110, 111,
121 112, 113, 114, 115, 116, 117, 118, 119,
122 120, 121, 122, 123, 124, 125, 126, 127
125 /* reverse bits (7->0, 6->1, 5->2 etc) for tx to / rx from ISDN */
127 unsigned char bitreverse
[256] = {
128 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
129 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
130 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
131 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
132 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
133 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
134 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
135 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
136 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
137 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
138 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
139 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
140 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
141 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
142 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
143 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
146 /* A-law to u-law conversion */
149 alaw2ulaw(unsigned char aval
)
152 return ((aval
& 0x80) ? (0xFF ^ _a2u
[aval
^ 0xD5]) :
153 (0x7F ^ _a2u
[aval
^ 0x55]));
156 /* u-law to A-law conversion */
159 ulaw2alaw(unsigned char uval
)
162 return ((uval
& 0x80) ? (0xD5 ^ (_u2a
[0xFF ^ uval
] - 1)) :
163 (0x55 ^ (_u2a
[0x7F ^ uval
] - 1)));
169 fprintf(stderr
, "\n");
170 fprintf(stderr
, "g711conv - do conversions according to ITU G.711, (version %d.%d.%d)\n",VERSION
, REL
, STEP
);
171 fprintf(stderr
, "usage: g711conv -a -r -R -u -P\n");
172 fprintf(stderr
, " -a A-law to u-law conversion\n");
173 fprintf(stderr
, " -r reverse bits before conversion\n");
174 fprintf(stderr
, " -R reverse bits after conversion\n");
175 fprintf(stderr
, " -u u-law to A-law conversion\n");
176 fprintf(stderr
, " -P print conversion table as C source\n");
177 fprintf(stderr
, "\n");
182 main(int argc
, char **argv
)
193 while ((c
= getopt(argc
, argv
, "aurPR")) != -1)
223 if((opt_a
+ opt_u
) > 1)
230 if((opt_a
+ opt_u
) == 0)
231 printf("No Conversion");
234 printf("A-law to u-law conversion");
237 printf("u-law to A-law conversion");
240 printf(", reverse bits BEFORE conversion");
243 printf(", reverse bits AFTER conversion");
247 printf(" */\n\nunsigned char a2u_tab[256] = {");
251 printf(" */\n\nunsigned char u2a_tab[256] = {");
255 printf(" */\n\nunsigned char table[256] = {");
258 for(i
=0; i
< 256; i
++)
263 printf("\n/* %02x */\t", i
);
278 printf("0x%02x", uc
);
280 printf("0x%02x, ", uc
);
288 while(fread(ib
, 1, 1, stdin
) == 1)
291 ib
[0] = bitreverse
[ib
[0]];
294 ib
[0] = ulaw2alaw(ib
[0]);
297 ib
[0] = alaw2ulaw(ib
[0]);
300 ib
[0] = bitreverse
[ib
[0]];
302 fwrite(ib
, 1, 1, stdout
);