www.pudn.com > mp3_source.rar > common.c


#include  
#include  
#include  
#include "common.h" 
 
char *layer_names[3] = { "I", "II", "III" }; 
int bitrate[3][15] = { 
	{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448}, 
	{0,32,48,56,64,80,96,112,128,160,192,224,256,320,384}, 
	{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} 
}; 
double  s_freq[4] = {44.1, 48, 32, 0}; 
char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" }; 
 
 
FILE *OpenTableFile(char *name) 
{ 
	char fulname[80]; 
	FILE *f; 
 
	fulname[0] = '\0'; 
 
	strcat(fulname, name); 
	if( (f=fopen(fulname,"r"))==NULL ) { 
		fprintf(stderr,"\nOpenTable: could not find %s\n", fulname); 
    } 
    return f; 
} 
 
 
void WriteHdr(frame_params *fr_ps) 
{ 
	layer *info = fr_ps->header; 
 
	printf("HDR:  sync=FFF, id=%X, layer=%X, ep=%X, br=%X, sf=%X, pd=%X, ", 
		info->version, info->lay, !info->error_protection, 
		info->bitrate_index, info->sampling_frequency, info->padding); 
 
	printf("pr=%X, m=%X, js=%X, c=%X, o=%X, e=%X\n", 
		info->extension, info->mode, info->mode_ext, 
		info->copyright, info->original, info->emphasis); 
 
	printf("layer=%s, tot bitrate=%d, sfrq=%.1f, mode=%s, ", 
		layer_names[info->lay-1], bitrate[info->lay-1][info->bitrate_index], 
		s_freq[info->sampling_frequency], mode_names[info->mode]); 
 
	printf("sblim=%d, jsbd=%d, ch=%d\n", 
		fr_ps->sblimit, fr_ps->jsbound, fr_ps->stereo); 
} 
 
void *mem_alloc(unsigned long block, char *item) 
{ 
	void *ptr; 
	ptr = (void *)malloc((unsigned long)block); 
	if (ptr != NULL) 
		memset(ptr, 0, block); 
	else{ 
		printf("Unable to allocate %s\n", item); 
		exit(0); 
	} 
	return ptr; 
} 
 
/*open and initialize the buffer; */ 
void alloc_buffer(Bit_stream_struc *bs, int size) 
{ 
	bs->buf = (unsigned char *) mem_alloc(size*sizeof(unsigned char), "buffer"); 
	bs->buf_size = size; 
} 
 
void desalloc_buffer(Bit_stream_struc *bs) 
{ 
	free(bs->buf); 
} 
 
/* open the device to read the bit stream from it */ 
void open_bit_stream_r(Bit_stream_struc *bs, char *bs_filenam, int size) 
{ 
	register unsigned char flag = 1; 
 
	if ((bs->pt = fopen(bs_filenam, "rb")) == NULL) { 
		printf("Could not find \"%s\".\n", bs_filenam); 
		exit(1); 
	} 
 
	bs->format = BINARY; 
	alloc_buffer(bs, size); 
	bs->buf_byte_idx=0; 
	bs->buf_bit_idx=0; 
	bs->totbit=0; 
	bs->mode = READ_MODE; 
	bs->eob = FALSE; 
	bs->eobs = FALSE; 
} 
 
void close_bit_stream_r(Bit_stream_struc *bs) 
{ 
	fclose(bs->pt); 
	desalloc_buffer(bs); 
} 
 
/*return the status of the bit stream*/ 
/* returns 1 if end of bit stream was reached */ 
/* returns 0 if end of bit stream was not reached */ 
int end_bs(Bit_stream_struc *bs) 
{ 
  return(bs->eobs); 
} 
 
 
/*return the current bit stream length (in bits)*/ 
unsigned long sstell(Bit_stream_struc *bs) 
{ 
  return(bs->totbit); 
} 
 
 
void refill_buffer(Bit_stream_struc *bs) 
{ 
	register int i=bs->buf_size-2-bs->buf_byte_idx; 
	register unsigned long n=1; 
 
	while ((i>=0) && (!bs->eob)) { 
			n=fread(&bs->buf[i--], sizeof(unsigned char), 1, bs->pt); 
		if (!n) 
		bs->eob= i+1; 
	} 
} 
 
 
int mask[8]={0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; 
 
/*read 1 bit from the bit stream */ 
unsigned int get1bit(Bit_stream_struc *bs) 
{ 
   unsigned int bit; 
   register int i; 
 
   bs->totbit++; 
 
   if (!bs->buf_bit_idx) { 
        bs->buf_bit_idx = 8; 
        bs->buf_byte_idx--; 
        if ((bs->buf_byte_idx < MINIMUM) || (bs->buf_byte_idx < bs->eob)) { 
             if (bs->eob) 
                bs->eobs = TRUE; 
             else { 
                for (i=bs->buf_byte_idx; i>=0;i--) 
                  bs->buf[bs->buf_size-1-bs->buf_byte_idx+i] = bs->buf[i]; 
                refill_buffer(bs); 
                bs->buf_byte_idx = bs->buf_size-1; 
             } 
        } 
   } 
   bit = bs->buf[bs->buf_byte_idx]&mask[bs->buf_bit_idx-1]; 
   bit = bit >> (bs->buf_bit_idx-1); 
   bs->buf_bit_idx--; 
   return(bit); 
} 
 
int putmask[9]={0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff}; 
 
/*read N bit from the bit stream */ 
unsigned long getbits(Bit_stream_struc *bs, int N) 
{ 
	unsigned long val=0; 
	register int i; 
	register int j = N; 
	register int k, tmp; 
 
	if (N > MAX_LENGTH) 
		printf("Cannot read or write more than %d bits at a time.\n", MAX_LENGTH); 
 
	bs->totbit += N; 
	while (j > 0) { 
		if (!bs->buf_bit_idx) { 
			bs->buf_bit_idx = 8; 
			bs->buf_byte_idx--; 
			if ((bs->buf_byte_idx < MINIMUM) || (bs->buf_byte_idx < bs->eob)) { 
				if (bs->eob) 
					bs->eobs = TRUE; 
				else { 
					for (i=bs->buf_byte_idx; i>=0;i--) 
						bs->buf[bs->buf_size-1-bs->buf_byte_idx+i] = bs->buf[i]; 
						refill_buffer(bs); 
					bs->buf_byte_idx = bs->buf_size-1; 
				} 
			} 
		} 
		k = MIN(j, bs->buf_bit_idx); 
		tmp = bs->buf[bs->buf_byte_idx]&putmask[bs->buf_bit_idx]; 
		tmp = tmp >> (bs->buf_bit_idx-k); 
		val |= tmp << (j-k); 
		bs->buf_bit_idx -= k; 
		j -= k; 
	} 
	return val; 
} 
 
 
int seek_sync(Bit_stream_struc *bs, unsigned long sync, int N) 
{ 
	unsigned long aligning; 
	unsigned long val; 
	long maxi = (int)pow(2.0, (double)N) - 1; 
 
	aligning = sstell(bs)%ALIGNING; 
	if (aligning) 
		getbits(bs, (int)(ALIGNING-aligning)); 
 
	val = getbits(bs, N); 
	while (((val&maxi) != sync) && (!end_bs(bs))) { 
		val <<= ALIGNING; 
		val |= getbits(bs, ALIGNING); 
	} 
 
	if (end_bs(bs)) 
		return(0); 
	else 
		return(1); 
} 
 
int js_bound(int lay, int m_ext) 
{ 
	static int jsb_table[3][4] =  { 
		{ 4, 8, 12, 16 }, 
		{ 4, 8, 12, 16}, 
		{ 0, 4, 8, 16} 
	};  /* lay+m_e -> jsbound */ 
 
    if(lay<1 || lay >3 || m_ext<0 || m_ext>3) { 
        fprintf(stderr, "js_bound bad layer/modext (%d/%d)\n", lay, m_ext); 
        exit(1); 
    } 
	return(jsb_table[lay-1][m_ext]); 
} 
 
/* interpret data in hdr str to fields in fr_ps */ 
void hdr_to_frps(frame_params *fr_ps) 
{ 
	layer *hdr = fr_ps->header;     /* (or pass in as arg?) */ 
 
	fr_ps->actual_mode = hdr->mode; 
	fr_ps->stereo = (hdr->mode == MPG_MD_MONO) ? 1 : 2; 
	fr_ps->sblimit = SBLIMIT; 
	if(hdr->mode == MPG_MD_JOINT_STEREO) 
		fr_ps->jsbound = js_bound(hdr->lay, hdr->mode_ext); 
	else 
		fr_ps->jsbound = fr_ps->sblimit; 
} 
 
#define	BUFSIZE	4096 
static unsigned int buf[BUFSIZE]; 
static unsigned int buf_bit_idx=8; 
static unsigned long offset, totbit=0, buf_byte_idx=0; 
 
void hputbuf(unsigned int val, int N) 
{ 
	if (N != 8) { 
		printf("Not Supported yet!!\n"); 
		exit(-3); 
	} 
	buf[offset % BUFSIZE] = val; 
	offset++; 
} 
 
/*return the current bit stream length (in bits)*/ 
unsigned long hsstell() 
{ 
	return(totbit); 
} 
 
/*read N bit from the bit stream */ 
unsigned long hgetbits(int N) 
{ 
	unsigned long val=0; 
	register int j = N; 
	register int k, tmp; 
 
/* 
	 if (N > MAX_LENGTH) 
		 printf("Cannot read or write more than %d bits at a time.\n", MAX_LENGTH); 
*/ 
	totbit += N; 
	while (j > 0) { 
		if (!buf_bit_idx) { 
			buf_bit_idx = 8; 
			buf_byte_idx++; 
			if (buf_byte_idx > offset) { 
				printf("Buffer overflow !!\n"); 
				exit(3); 
			} 
		} 
		k = MIN(j, buf_bit_idx); 
		tmp = buf[buf_byte_idx%BUFSIZE]&putmask[buf_bit_idx]; 
		tmp = tmp >> (buf_bit_idx-k); 
		val |= tmp << (j-k); 
		buf_bit_idx -= k; 
		j -= k; 
	} 
	return(val); 
} 
 
 
unsigned int hget1bit() 
{ 
	return(hgetbits(1)); 
} 
 
 
void rewindNbits(int N) 
{ 
	totbit -= N; 
	buf_bit_idx += N; 
	while( buf_bit_idx >= 8 ){ 
		buf_bit_idx -= 8; 
		buf_byte_idx--; 
	} 
} 
 
 
void rewindNbytes(int N) 
{ 
	totbit -= N*8; 
	buf_byte_idx -= N; 
}