⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g711_decode_c.c

📁 在SPI 平台优化好的G.711代码,保证好用
💻 C
字号:
// g711_decode.c// G.711 decoder C demo program#include <stdarg.h>#include <stdio.h>#include <stdlib.h>#define	TEST_ITEMS	256		// input items in test// Input, output, reference filenames.#define	INFILE		"in.bin"#define	OUTFILE		"out.bin"#define	REFFILE		"ref.bin" // Data buffers.char		inbuf[TEST_ITEMS];	// G.711 input (bytes)int		outbuf[TEST_ITEMS];	// PCM output (words)int		refbuf[TEST_ITEMS];	// PCM reference// Failure: cry and die.voidfatal(char *msg, ...){	va_list	ap;	va_start(ap, msg);	vfprintf(stderr, msg, ap);	va_end(ap);	exit(EXIT_FAILURE);}// Open a file, die on failure.FILE *xopen(char *name, char *mode){	FILE	*fp;	if ((fp = fopen(name, mode)) == NULL)		fatal("%s: open failed\n", name);	return fp;}// Read a file, die on failure.voidxread(char *name, char *mode, void *buf, int size, int count){	FILE	*fp;	fp = xopen(name, mode);	if (fread(buf, size, count, fp) != count)		fatal("%s: read failed\n", name);	fclose(fp);}// Decode G.711 A-law to PCM.intg711_decode(unsigned char data){	unsigned int	i, exponent, mantissa;	i = (data ^ 0x55) & 0x7F;		// re-toggle even bits, remove sign bit	exponent = i >> 4;			// extract exponent	mantissa = i & 0xF;			// extract mantissa	if (exponent > 0)		mantissa |= 0x10;		// restore hidden bit to mantissa	mantissa = (mantissa << 4) | 0x08;	// left justify, add 1/2 quantization stepsize	// Normalize mantissa if log encoding (not linear segment).	if (exponent > 1)		mantissa <<= exponent -1;	// Negate if sign bit was NOT set in data.	if ((data & 0x80) == 0)		mantissa = -mantissa;	return mantissa << 16;			// shift output to be MSB aligned in 32 bits}intmain(int argc, char *argv[]){	FILE		*fp;	int		i;	// Read input file.	xread(INFILE, "rb", inbuf, sizeof(inbuf[0]), TEST_ITEMS);	// Decode.	for (i = 0; i < TEST_ITEMS; i++)		outbuf[i] = g711_decode(inbuf[i]);	// Dump output data.	fp = xopen(OUTFILE, "wb");	if (fwrite(outbuf, sizeof(outbuf[0]), TEST_ITEMS, fp) != TEST_ITEMS)		fatal("%s: write failed\n", OUTFILE);	fclose(fp);	// Read reference file.	xread(REFFILE, "rb", refbuf, sizeof(refbuf[0]), TEST_ITEMS);	// Compare result to reference result.	for (i = 0; i < TEST_ITEMS; i++) {		if (outbuf[i] != refbuf[i])			fatal("result miscompares at word %d: expected 0x%X, got 0x%X\n",				refbuf[i], outbuf[i]);	}	// Done.	printf("Success!\n");	exit(EXIT_SUCCESS);}// end of g711_decode_c.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -