Mercurial > hg > audiostuff
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/intercom/g726/cvt_h_b.c Fri Jun 25 09:57:52 2010 +0200 @@ -0,0 +1,350 @@ +/* +============================================================================== + + CVT_H_B.C + ~~~~~~~~~ + + Program to convert ITU-T test sequences in hexa formats to + word oriented binary files. Each line is supposed to have 32 valid + samples (16 bit, or a word), or 64 hexa characters, either upper or + lower case. In the last line is expected one word (2 hexa chars) + in hexadecimal representation as the checksum of all the samples of + the file modulus 255 (sum mod 255). + + + USAGE: + ~~~~~~ + $ cvt_h_b [-r] [-q] hex-in bin-out + where: + hex-in is the (input) hexadecimal file's name + bin-out is the (output) binary file's name + + Options + ~~~~~~~ + -q Don't print progress indicator on the screen. + -r is an optional parameter; if specified as r or R, + even-bit reversal of all samples is accomplished + before saving the file. Default is NOT invert. + + Compile: + ~~~~~~~~ + SunC: cc -o cvt_h_b cvt_h_b.c # or # + acc -o cvt_h_b cvt_h_b.c + GNUC: gcc -o cvt_h_b cvt_h_b.c + VMS: cc cvt_h_b.c + link cvt_h_b + + History: + ~~~~~~~~ + 92.01.22 1.0 1st release by tdsimao@venus.cpqd.ansp.br + 93.11.23 1.01 ported to SunOS (Unix) + + ============================================================= + COPYRIGHT NOTE: This source code, and all of its derivations, + is subject to the ITU-T General Public License". Please have + it read in the distribution disk, or in the ITU-T + Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO + CODING STANDARDS". + ============================================================= +============================================================================== +*/ + +/* OS definition */ +#ifdef __MSDOS__ /* definition for automatic compil. under TurboC v2.0 */ +# define MSDOS /* this is already defined for Microsoft C 5.1 */ +#endif + + +/* includes in general */ +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + + +/* Specific includes */ +#if defined(MSDOS) /* for MSDOS */ +# include <fcntl.h> +# include <io.h> +# include <sys\stat.h> +#elif defined(VMS) /* for VMS */ +# include <perror.h> +# include <file.h> +# include <stat.h> +#else /* for OTHER OS, in special UNIX */ +# include <sys/stat.h> +#endif + + +/* Generic defines */ +#define askc(m,v) {printf(m); scanf("%c%*c",&v);} +#define aski(m,v) {printf(m);scanf("%d",&v);} +#define asks(m,v) {printf(m);gets(v);} +#define KILL(str,code) {perror(str); exit(code);} +#define GET_PAR_I(a,s,p,msg,i) {if(a>p) i=atoi(s[p]); else aski(msg,i);} +#define GET_PAR_C(a,s,p,msg,c) {if(a>p) c=toupper(s[p][0]);else askc(msg,c);} +#define GET_PAR_S(a,s,p,msg,S) {if(a>p) strcpy(S,s[p]); else asks(msg,S);} + +#if defined(VMS) +#define WB "wb","mrs=512","rfm=fix","ctx=stm" +#define RB "rb","mrs=512","rfm=fix","ctx=stm" +#elif defined(MSDOS) +#define WB "wb" +#define RB "rb" +#else +#define WB "w" +#define RB "r" +#endif + +#define YES 1 +#define NO 0 + +/* + * -------------------------------------------------------------------------- + * ... Calculate check-sum of a array of shorts ... + * Simao 07.Mar.94 + * -------------------------------------------------------------------------- + */ +short short_check_sum(s_data, n) +short *s_data; +long n; +{ + float csum = 0; + long i; + + /* Add samples */ + while (n) + csum += s_data[--n]; + + /* return mod as a short */ + csum = fmod(csum, 255.0); + return ((short) csum); +} + + +/* + * -------------------------------------------------------------------------- + * ... Display usage of program ... + * Simao 10.Jan.93 + * -------------------------------------------------------------------------- + */ +#define FP(x) printf(x) +void display_usage() +{ + FP("Version 1.01 of 23/Nov/1993 \n"); + + FP(" CVT_H_B.C:\n"); + FP(" Program to convert ITU-T test sequences in hexa formats to\n"); + FP(" word oriented binary files. Each line is supposed to have 32 valid\n"); + FP(" samples (16 bit, or a word), or 64 hexa characters, either upper or\n"); + FP(" lower case. In the last line is expected one word (2 hexa chars)\n"); + FP(" in hexadecimal representation as the checksum of all the samples of\n"); + FP(" the file modulus 255 (sum mod 255).\n"); + FP("\n"); + FP(" Usage:\n"); + FP(" $ cvt_h_b [-r] hex-in bin-out\n"); + FP(" where:\n"); + FP(" hex-in is the (input) hexadecimal file's name\n"); + FP(" bin-out is the (output) binary file's name\n\n"); + + FP(" Options\n"); + FP(" -q Don't print progress indicator on the screen\n"); + FP(" -r is an optional parameter; if specified as r or R,\n"); + FP(" even-bit reversal of all samples is accomplished \n"); + FP(" before saving the file. Default is NOT invert.\n"); + FP("\n"); + + /* Quit program */ + exit(-128); +} + +#undef FP +/* ....................... end of display_usage() ...........................*/ + + +/*============================== */ +main(argc, argv) +int argc; +char *argv[]; +/*============================== */ +{ + char line[200], *lp; + char inpfil[50], outfil[50]; + int inp, out, itmp, count = 0; + float check_sum = 0; + short scheck_sum = 0; + short chk; + short *bin, *tmp; + long leng, i, smpno = 0, lineno = 0; + int lastline_len = 0; + + FILE *Fi, *Fo; + struct stat st; + int invert_even_bits = NO, quiet = NO; + + static char funny[8] = { '\\', '-', '/', '|', '\\', '-', '/', '|' }; + + + /* GETTING OPTIONS */ + + if (argc < 2) + display_usage(); + else { + while (argc > 1 && argv[1][0] == '-') + if (strcmp(argv[1], "-r") == 0) { + /* Reverse even bits */ + invert_even_bits = YES; + + /* Move argv over the option to the next argument */ + argv++; + + /* Update argc */ + argc--; + } else if (strcmp(argv[1], "-q") == 0) { + /* Don't print funny chars */ + quiet = YES; + + /* Move argv over the option to the next argument */ + argv++; + argc--; + } else { + fprintf(stderr, + "ERROR! Invalid option \"%s\" in command line\n\n", argv[1]); + display_usage(); + } + } + + + + /* WELCOME! */ + + fprintf(stderr, "\n\t\tConversion from ITU-T HEX of test sequence"); + fprintf(stderr, "\n\t\tfiles to binary files, 16 bits per sample\n"); + + + /* GETTING PARAMETERS */ + + GET_PAR_S(argc, argv, 1, "_Input (ITU-T HEX) file: ....... ", inpfil); + GET_PAR_S(argc, argv, 2, "_Output (`short') file: ........ ", outfil); + + + /* OPEN FILES */ + + if ((Fi = fopen(inpfil, "r")) == NULL) + KILL(inpfil, 2); + if ((Fo = fopen(outfil, WB)) == NULL) + KILL(outfil, 3); + out = fileno(Fo); + + /* FIND FILE SIZE AND ALLOC MEMORY FOR BINARY BUFFER */ + + stat(inpfil, &st); + if ((bin = (short *) malloc(st.st_size)) == (short *) NULL) { + fprintf(stderr, "\n Can't allocate memory for output buffer"); + exit(4); + } + tmp = bin; + + + /* INFOS */ + + fprintf(stderr, "\n Converting %s to %s\r", inpfil, outfil); + + + /* CONVERSION PART */ + + /* FIND NUMBER OF LINES IN FILE */ + while (fgets(line, (int) 200, Fi) != NULL) + lineno++; + rewind(Fi); + lastline_len = strlen(line); + if (line[lastline_len - 1] = '\n') + lastline_len--; + + /* READ ALL CHARS FOR THE FILE */ + while (fgets(line, (int) 200, Fi) != NULL) { + /* Print `working' flag */ + if (!quiet) + fprintf(stderr, "%c\r", funny[count % 8]); + + /* Update line counter */ + count++; + + /* Remove CR from line end */ + leng = strlen(line); + if (line[leng - 1] == '\n') + line[--leng] = '\0'; + + /* Convert line */ + switch (leng) { + case 64: + for (lp = line, i = 0; i < leng; i += 2, lp += 2) { + sscanf(lp, "%2hx", tmp); + tmp++; + smpno++; + } + break; + + case 2: + /* Check whether the last line */ + if (count != lineno) { + /* If not, it's a regular sample */ + sscanf(lp, "%2hx", tmp); + tmp++; + smpno++; + } else { + /* value is check-sum */ + sscanf(line, "%2hx", &chk); + } + break; + + default: /* for old (red-book) test sequences: initialization */ + for (i = 0; i < leng - 2; i += 2) { + sscanf(&line[i], "%2hx", tmp); + tmp++; + smpno++; + } + + /* Check sum for old files ... */ + sscanf(&line[i], "%2hx", &chk); + break; + + } + } + + /* CALCULATE CHECK-SUMS */ + scheck_sum = short_check_sum(bin, smpno); + fprintf(stderr, "Check-sum is: %d (calculated) %d (read)\n", + scheck_sum, chk); + if (chk != scheck_sum) { + fprintf(stderr, "\n Checksum Failed! (%d != %d)\n", chk, + scheck_sum); + exit(5); + } + + + /* INVERT EVEN BITS, IF IT IS THE CASE */ + + if (invert_even_bits) { + fprintf(stderr, "\r Inverting even bits, as requested\t\t"); + for (i = 0; i < (tmp - bin) / 2; i++) + bin[i] ^= 0x55; + } + + + /* SAVE TO FILE */ + + for (i = 0; i < smpno; i += 256) { + if (write(out, &bin[i], 512) != 512) + KILL(outfil, 6); + } + + + /* EXITING */ + + fprintf(stderr, "\rDone: %d samples converted!\n", smpno); + fclose(Fi); + fclose(Fo); +#ifndef VMS + exit(0); +#endif +}