www.pudn.com > G711-729.rar > encode.c


/* 
 * encode.c 
 * 
 * CCITT ADPCM encoder 
 * 
 * Usage : encode [-3|4|5] [-a|u|l] < infile > outfile 
 */ 
#include  
#include "g72x.h" 
 
 
/* 
 * Pack output codes into bytes and write them to stdout. 
 * Returns 1 if there is residual output, else returns 0. 
 */ 
int 
pack_output( 
	unsigned		code, 
	int			bits) 
{ 
	static unsigned int	out_buffer = 0; 
	static int		out_bits = 0; 
	unsigned char		out_byte; 
 
	out_buffer |= (code << out_bits); 
	out_bits += bits; 
	if (out_bits >= 8) { 
		out_byte = out_buffer & 0xff; 
		out_bits -= 8; 
		out_buffer >>= 8; 
		fwrite(&out_byte, sizeof (char), 1, stdout); 
	} 
	return (out_bits > 0); 
} 
 
 
main( 
	int			argc, 
	char			**argv) 
{ 
	struct g72x_state	state; 
	unsigned char		sample_char; 
	short			sample_short; 
	unsigned char		code; 
	int			resid; 
	int			in_coding; 
	int			in_size; 
	unsigned		*in_buf; 
	int			(*enc_routine)(); 
	int			enc_bits; 
 
	g72x_init_state(&state); 
 
	/* Set defaults to u-law input, G.721 output */ 
	in_coding = AUDIO_ENCODING_ULAW; 
	in_size = sizeof (char); 
	in_buf = (unsigned *)&sample_char; 
	enc_routine = g721_encoder; 
	enc_bits = 4; 
 
	/* Process encoding argument, if any */ 
	while ((argc > 1) && (argv[1][0] == '-')) { 
		switch (argv[1][1]) { 
		case '3': 
			enc_routine = g723_24_encoder; 
			enc_bits = 3; 
			break; 
		case '4': 
			enc_routine = g721_encoder; 
			enc_bits = 4; 
			break; 
		case '5': 
			enc_routine = g723_40_encoder; 
			enc_bits = 5; 
			break; 
		case 'u': 
			in_coding = AUDIO_ENCODING_ULAW; 
			in_size = sizeof (char); 
			in_buf = (unsigned *)&sample_char; 
			break; 
		case 'a': 
			in_coding = AUDIO_ENCODING_ALAW; 
			in_size = sizeof (char); 
			in_buf = (unsigned *)&sample_char; 
			break; 
		case 'l': 
			in_coding = AUDIO_ENCODING_LINEAR; 
			in_size = sizeof (short); 
			in_buf = (unsigned *)&sample_short; 
			break; 
		default: 
fprintf(stderr, "CCITT ADPCM Encoder -- usage:\n"); 
fprintf(stderr, "\tencode [-3|4|5] [-a|u|l] < infile > outfile\n"); 
fprintf(stderr, "where:\n"); 
fprintf(stderr, "\t-3\tGenerate G.723 24kbps (3-bit) data\n"); 
fprintf(stderr, "\t-4\tGenerate G.721 32kbps (4-bit) data [default]\n"); 
fprintf(stderr, "\t-5\tGenerate G.723 40kbps (5-bit) data\n"); 
fprintf(stderr, "\t-a\tProcess 8-bit A-law input data\n"); 
fprintf(stderr, "\t-u\tProcess 8-bit u-law input data [default]\n"); 
fprintf(stderr, "\t-l\tProcess 16-bit linear PCM input data\n"); 
			exit(1); 
		} 
		argc--; 
		argv++; 
	} 
 
	/* Read input file and process */ 
	while (fread(in_buf, in_size, 1, stdin) == 1) { 
		code = (*enc_routine)(in_size == 2 ? sample_short : sample_char, 
		    in_coding, &state); 
		resid = pack_output(code, enc_bits); 
	} 
 
	/* Write zero codes until all residual codes are written out */ 
	while (resid) { 
		resid = pack_output(0, enc_bits); 
	} 
	fclose(stdout); 
}