Mercurial > hg > audiostuff
comparison intercom/g726/cvt_h_b.c @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1:9cadc470e3da | 2:13be24d74cd2 |
---|---|
1 /* | |
2 ============================================================================== | |
3 | |
4 CVT_H_B.C | |
5 ~~~~~~~~~ | |
6 | |
7 Program to convert ITU-T test sequences in hexa formats to | |
8 word oriented binary files. Each line is supposed to have 32 valid | |
9 samples (16 bit, or a word), or 64 hexa characters, either upper or | |
10 lower case. In the last line is expected one word (2 hexa chars) | |
11 in hexadecimal representation as the checksum of all the samples of | |
12 the file modulus 255 (sum mod 255). | |
13 | |
14 | |
15 USAGE: | |
16 ~~~~~~ | |
17 $ cvt_h_b [-r] [-q] hex-in bin-out | |
18 where: | |
19 hex-in is the (input) hexadecimal file's name | |
20 bin-out is the (output) binary file's name | |
21 | |
22 Options | |
23 ~~~~~~~ | |
24 -q Don't print progress indicator on the screen. | |
25 -r is an optional parameter; if specified as r or R, | |
26 even-bit reversal of all samples is accomplished | |
27 before saving the file. Default is NOT invert. | |
28 | |
29 Compile: | |
30 ~~~~~~~~ | |
31 SunC: cc -o cvt_h_b cvt_h_b.c # or # | |
32 acc -o cvt_h_b cvt_h_b.c | |
33 GNUC: gcc -o cvt_h_b cvt_h_b.c | |
34 VMS: cc cvt_h_b.c | |
35 link cvt_h_b | |
36 | |
37 History: | |
38 ~~~~~~~~ | |
39 92.01.22 1.0 1st release by tdsimao@venus.cpqd.ansp.br | |
40 93.11.23 1.01 ported to SunOS (Unix) | |
41 | |
42 ============================================================= | |
43 COPYRIGHT NOTE: This source code, and all of its derivations, | |
44 is subject to the ITU-T General Public License". Please have | |
45 it read in the distribution disk, or in the ITU-T | |
46 Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO | |
47 CODING STANDARDS". | |
48 ============================================================= | |
49 ============================================================================== | |
50 */ | |
51 | |
52 /* OS definition */ | |
53 #ifdef __MSDOS__ /* definition for automatic compil. under TurboC v2.0 */ | |
54 # define MSDOS /* this is already defined for Microsoft C 5.1 */ | |
55 #endif | |
56 | |
57 | |
58 /* includes in general */ | |
59 #include <stdio.h> | |
60 #include <stdlib.h> | |
61 #include <math.h> | |
62 | |
63 | |
64 /* Specific includes */ | |
65 #if defined(MSDOS) /* for MSDOS */ | |
66 # include <fcntl.h> | |
67 # include <io.h> | |
68 # include <sys\stat.h> | |
69 #elif defined(VMS) /* for VMS */ | |
70 # include <perror.h> | |
71 # include <file.h> | |
72 # include <stat.h> | |
73 #else /* for OTHER OS, in special UNIX */ | |
74 # include <sys/stat.h> | |
75 #endif | |
76 | |
77 | |
78 /* Generic defines */ | |
79 #define askc(m,v) {printf(m); scanf("%c%*c",&v);} | |
80 #define aski(m,v) {printf(m);scanf("%d",&v);} | |
81 #define asks(m,v) {printf(m);gets(v);} | |
82 #define KILL(str,code) {perror(str); exit(code);} | |
83 #define GET_PAR_I(a,s,p,msg,i) {if(a>p) i=atoi(s[p]); else aski(msg,i);} | |
84 #define GET_PAR_C(a,s,p,msg,c) {if(a>p) c=toupper(s[p][0]);else askc(msg,c);} | |
85 #define GET_PAR_S(a,s,p,msg,S) {if(a>p) strcpy(S,s[p]); else asks(msg,S);} | |
86 | |
87 #if defined(VMS) | |
88 #define WB "wb","mrs=512","rfm=fix","ctx=stm" | |
89 #define RB "rb","mrs=512","rfm=fix","ctx=stm" | |
90 #elif defined(MSDOS) | |
91 #define WB "wb" | |
92 #define RB "rb" | |
93 #else | |
94 #define WB "w" | |
95 #define RB "r" | |
96 #endif | |
97 | |
98 #define YES 1 | |
99 #define NO 0 | |
100 | |
101 /* | |
102 * -------------------------------------------------------------------------- | |
103 * ... Calculate check-sum of a array of shorts ... | |
104 * Simao 07.Mar.94 | |
105 * -------------------------------------------------------------------------- | |
106 */ | |
107 short short_check_sum(s_data, n) | |
108 short *s_data; | |
109 long n; | |
110 { | |
111 float csum = 0; | |
112 long i; | |
113 | |
114 /* Add samples */ | |
115 while (n) | |
116 csum += s_data[--n]; | |
117 | |
118 /* return mod as a short */ | |
119 csum = fmod(csum, 255.0); | |
120 return ((short) csum); | |
121 } | |
122 | |
123 | |
124 /* | |
125 * -------------------------------------------------------------------------- | |
126 * ... Display usage of program ... | |
127 * Simao 10.Jan.93 | |
128 * -------------------------------------------------------------------------- | |
129 */ | |
130 #define FP(x) printf(x) | |
131 void display_usage() | |
132 { | |
133 FP("Version 1.01 of 23/Nov/1993 \n"); | |
134 | |
135 FP(" CVT_H_B.C:\n"); | |
136 FP(" Program to convert ITU-T test sequences in hexa formats to\n"); | |
137 FP(" word oriented binary files. Each line is supposed to have 32 valid\n"); | |
138 FP(" samples (16 bit, or a word), or 64 hexa characters, either upper or\n"); | |
139 FP(" lower case. In the last line is expected one word (2 hexa chars)\n"); | |
140 FP(" in hexadecimal representation as the checksum of all the samples of\n"); | |
141 FP(" the file modulus 255 (sum mod 255).\n"); | |
142 FP("\n"); | |
143 FP(" Usage:\n"); | |
144 FP(" $ cvt_h_b [-r] hex-in bin-out\n"); | |
145 FP(" where:\n"); | |
146 FP(" hex-in is the (input) hexadecimal file's name\n"); | |
147 FP(" bin-out is the (output) binary file's name\n\n"); | |
148 | |
149 FP(" Options\n"); | |
150 FP(" -q Don't print progress indicator on the screen\n"); | |
151 FP(" -r is an optional parameter; if specified as r or R,\n"); | |
152 FP(" even-bit reversal of all samples is accomplished \n"); | |
153 FP(" before saving the file. Default is NOT invert.\n"); | |
154 FP("\n"); | |
155 | |
156 /* Quit program */ | |
157 exit(-128); | |
158 } | |
159 | |
160 #undef FP | |
161 /* ....................... end of display_usage() ...........................*/ | |
162 | |
163 | |
164 /*============================== */ | |
165 main(argc, argv) | |
166 int argc; | |
167 char *argv[]; | |
168 /*============================== */ | |
169 { | |
170 char line[200], *lp; | |
171 char inpfil[50], outfil[50]; | |
172 int inp, out, itmp, count = 0; | |
173 float check_sum = 0; | |
174 short scheck_sum = 0; | |
175 short chk; | |
176 short *bin, *tmp; | |
177 long leng, i, smpno = 0, lineno = 0; | |
178 int lastline_len = 0; | |
179 | |
180 FILE *Fi, *Fo; | |
181 struct stat st; | |
182 int invert_even_bits = NO, quiet = NO; | |
183 | |
184 static char funny[8] = { '\\', '-', '/', '|', '\\', '-', '/', '|' }; | |
185 | |
186 | |
187 /* GETTING OPTIONS */ | |
188 | |
189 if (argc < 2) | |
190 display_usage(); | |
191 else { | |
192 while (argc > 1 && argv[1][0] == '-') | |
193 if (strcmp(argv[1], "-r") == 0) { | |
194 /* Reverse even bits */ | |
195 invert_even_bits = YES; | |
196 | |
197 /* Move argv over the option to the next argument */ | |
198 argv++; | |
199 | |
200 /* Update argc */ | |
201 argc--; | |
202 } else if (strcmp(argv[1], "-q") == 0) { | |
203 /* Don't print funny chars */ | |
204 quiet = YES; | |
205 | |
206 /* Move argv over the option to the next argument */ | |
207 argv++; | |
208 argc--; | |
209 } else { | |
210 fprintf(stderr, | |
211 "ERROR! Invalid option \"%s\" in command line\n\n", argv[1]); | |
212 display_usage(); | |
213 } | |
214 } | |
215 | |
216 | |
217 | |
218 /* WELCOME! */ | |
219 | |
220 fprintf(stderr, "\n\t\tConversion from ITU-T HEX of test sequence"); | |
221 fprintf(stderr, "\n\t\tfiles to binary files, 16 bits per sample\n"); | |
222 | |
223 | |
224 /* GETTING PARAMETERS */ | |
225 | |
226 GET_PAR_S(argc, argv, 1, "_Input (ITU-T HEX) file: ....... ", inpfil); | |
227 GET_PAR_S(argc, argv, 2, "_Output (`short') file: ........ ", outfil); | |
228 | |
229 | |
230 /* OPEN FILES */ | |
231 | |
232 if ((Fi = fopen(inpfil, "r")) == NULL) | |
233 KILL(inpfil, 2); | |
234 if ((Fo = fopen(outfil, WB)) == NULL) | |
235 KILL(outfil, 3); | |
236 out = fileno(Fo); | |
237 | |
238 /* FIND FILE SIZE AND ALLOC MEMORY FOR BINARY BUFFER */ | |
239 | |
240 stat(inpfil, &st); | |
241 if ((bin = (short *) malloc(st.st_size)) == (short *) NULL) { | |
242 fprintf(stderr, "\n Can't allocate memory for output buffer"); | |
243 exit(4); | |
244 } | |
245 tmp = bin; | |
246 | |
247 | |
248 /* INFOS */ | |
249 | |
250 fprintf(stderr, "\n Converting %s to %s\r", inpfil, outfil); | |
251 | |
252 | |
253 /* CONVERSION PART */ | |
254 | |
255 /* FIND NUMBER OF LINES IN FILE */ | |
256 while (fgets(line, (int) 200, Fi) != NULL) | |
257 lineno++; | |
258 rewind(Fi); | |
259 lastline_len = strlen(line); | |
260 if (line[lastline_len - 1] = '\n') | |
261 lastline_len--; | |
262 | |
263 /* READ ALL CHARS FOR THE FILE */ | |
264 while (fgets(line, (int) 200, Fi) != NULL) { | |
265 /* Print `working' flag */ | |
266 if (!quiet) | |
267 fprintf(stderr, "%c\r", funny[count % 8]); | |
268 | |
269 /* Update line counter */ | |
270 count++; | |
271 | |
272 /* Remove CR from line end */ | |
273 leng = strlen(line); | |
274 if (line[leng - 1] == '\n') | |
275 line[--leng] = '\0'; | |
276 | |
277 /* Convert line */ | |
278 switch (leng) { | |
279 case 64: | |
280 for (lp = line, i = 0; i < leng; i += 2, lp += 2) { | |
281 sscanf(lp, "%2hx", tmp); | |
282 tmp++; | |
283 smpno++; | |
284 } | |
285 break; | |
286 | |
287 case 2: | |
288 /* Check whether the last line */ | |
289 if (count != lineno) { | |
290 /* If not, it's a regular sample */ | |
291 sscanf(lp, "%2hx", tmp); | |
292 tmp++; | |
293 smpno++; | |
294 } else { | |
295 /* value is check-sum */ | |
296 sscanf(line, "%2hx", &chk); | |
297 } | |
298 break; | |
299 | |
300 default: /* for old (red-book) test sequences: initialization */ | |
301 for (i = 0; i < leng - 2; i += 2) { | |
302 sscanf(&line[i], "%2hx", tmp); | |
303 tmp++; | |
304 smpno++; | |
305 } | |
306 | |
307 /* Check sum for old files ... */ | |
308 sscanf(&line[i], "%2hx", &chk); | |
309 break; | |
310 | |
311 } | |
312 } | |
313 | |
314 /* CALCULATE CHECK-SUMS */ | |
315 scheck_sum = short_check_sum(bin, smpno); | |
316 fprintf(stderr, "Check-sum is: %d (calculated) %d (read)\n", | |
317 scheck_sum, chk); | |
318 if (chk != scheck_sum) { | |
319 fprintf(stderr, "\n Checksum Failed! (%d != %d)\n", chk, | |
320 scheck_sum); | |
321 exit(5); | |
322 } | |
323 | |
324 | |
325 /* INVERT EVEN BITS, IF IT IS THE CASE */ | |
326 | |
327 if (invert_even_bits) { | |
328 fprintf(stderr, "\r Inverting even bits, as requested\t\t"); | |
329 for (i = 0; i < (tmp - bin) / 2; i++) | |
330 bin[i] ^= 0x55; | |
331 } | |
332 | |
333 | |
334 /* SAVE TO FILE */ | |
335 | |
336 for (i = 0; i < smpno; i += 256) { | |
337 if (write(out, &bin[i], 512) != 512) | |
338 KILL(outfil, 6); | |
339 } | |
340 | |
341 | |
342 /* EXITING */ | |
343 | |
344 fprintf(stderr, "\rDone: %d samples converted!\n", smpno); | |
345 fclose(Fi); | |
346 fclose(Fo); | |
347 #ifndef VMS | |
348 exit(0); | |
349 #endif | |
350 } |