📄 common.c
字号:
void empty_buffer(bs, minimum)Bit_stream_struc *bs; int minimum; { register int i;#if BS_FORMAT == BINARY for (i=bs->buf_size-1;i>=minimum;i--) fwrite(&bs->buf[i], sizeof(unsigned char), 1, bs->pt);#else for (i=bs->buf_size-1;i>=minimum;i--) { char val[2]; val[0] = he[((bs->buf[i] >> 4) & 0x0F)]; val[1] = he[(bs->buf[i] & 0x0F)]; fwrite(val, sizeof(char), 2, bs->pt); }#endif for (i=minimum-1; i>=0; i--) bs->buf[bs->buf_size - minimum + i] = bs->buf[i]; bs->buf_byte_idx = bs->buf_size -1 - minimum; bs->buf_bit_idx = 8;}void open_bit_stream_w(bs, bs_filenam, size)Bit_stream_struc *bs; char *bs_filenam; int size; { if ((bs->pt = fopen(bs_filenam, "wb")) == NULL) { printf("Could not create \"%s\".\n", bs_filenam); exit(20); } alloc_buffer(bs, size); bs->buf_byte_idx = size-1; bs->buf_bit_idx=8; bs->totbit=0; bs->mode = WRITE_MODE; bs->eob = FALSE; bs->eobs = FALSE;}void open_bit_stream_r(bs, bs_filenam, size)Bit_stream_struc *bs; char *bs_filenam; int size; { register unsigned long n; register unsigned char flag = 1; unsigned char val; if ((bs->pt = fopen(bs_filenam, "rb")) == NULL) { printf("Could not find \"%s\".\n", bs_filenam); exit(21); } do { n = fread(&val, sizeof(unsigned char), 1, bs->pt); switch (val) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0xa: case 0xd: case 0x1a: break; default: flag--; break; } } while (flag & n); if (flag) { bs->format = ASCII; } else { bs->format = BINARY; } fclose(bs->pt); if ((bs->pt = fopen(bs_filenam, "rb")) == NULL) { printf("Could not find \"%s\".\n", bs_filenam); exit(22); } 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(bs)Bit_stream_struc *bs; { fclose(bs->pt); desalloc_buffer(bs);}void close_bit_stream_w(bs)Bit_stream_struc *bs; { empty_buffer(bs, bs->buf_byte_idx); fclose(bs->pt); desalloc_buffer(bs);}void alloc_buffer(bs, size)Bit_stream_struc *bs; int size;{ bs->buf = (unsigned char *) mem_alloc(size*sizeof(unsigned char), "buffer"); bs->buf_size = size;}void desalloc_buffer(bs)Bit_stream_struc *bs; { free(bs->buf);}int putmask[9]={0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};int clearmask[9]={0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x0};void back_track_buffer(bs, N) Bit_stream_struc *bs; int N;{ int tmp = N - (N/8)*8; register int i; bs->totbit -= N; for (i=bs->buf_byte_idx;i< bs->buf_byte_idx+N/8-1;i++) bs->buf[i] = 0; bs->buf_byte_idx += N/8; if ( (tmp + bs->buf_bit_idx) <= 8) { bs->buf_bit_idx += tmp; } else { bs->buf_byte_idx ++; bs->buf_bit_idx += (tmp - 8); } bs->buf[bs->buf_byte_idx] &= clearmask[bs->buf_bit_idx];}int mask[8]={0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};unsigned int get1bit(bs)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);}void put1bit(bs, bit)Bit_stream_struc *bs; int bit; { bs->totbit++; bs->buf[bs->buf_byte_idx] |= (bit&0x1) << (bs->buf_bit_idx-1); bs->buf_bit_idx--; if (!bs->buf_bit_idx) { bs->buf_bit_idx = 8; bs->buf_byte_idx--; if (bs->buf_byte_idx < 0) empty_buffer(bs, MINIMUM); bs->buf[bs->buf_byte_idx] = 0; }}unsigned long look_ahead(bs, N)Bit_stream_struc *bs; int N; { unsigned long val=0; register int j = N; register int k, tmp; register int bit_idx = bs->buf_bit_idx; register int byte_idx = bs->buf_byte_idx; if (N > MAX_LENGTH) printf("Cannot read or write more than %d bits at a time.\n", MAX_LENGTH); while (j > 0) { if (!bit_idx) { bit_idx = 8; byte_idx--; } k = MIN (j, bit_idx); tmp = bs->buf[byte_idx]&putmask[bit_idx]; tmp = tmp >> (bit_idx-k); val |= tmp << (j-k); bit_idx -= k; j -= k; } return(val);}unsigned long getbits(bs, N)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);}void putabits(bs, val, N)Bit_stream_struc *bs; unsigned int val; int N; { 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) { k = MIN(j, bs->buf_bit_idx); tmp = val >> (j-k); bs->buf[bs->buf_byte_idx] |= (tmp&putmask[k]) << (bs->buf_bit_idx-k); bs->buf_bit_idx -= k; if (!bs->buf_bit_idx) { bs->buf_bit_idx = 8; bs->buf_byte_idx--; if (bs->buf_byte_idx < 0) empty_buffer(bs, MINIMUM); bs->buf[bs->buf_byte_idx] = 0; } j -= k; }}void byte_ali_putbits(bs, val, N)Bit_stream_struc *bs; unsigned int val; int N; { unsigned long aligning, sstell(); if (N > MAX_LENGTH) printf("Cannot read or write more than %d bits at a time.\n", MAX_LENGTH); aligning = sstell(bs)%8; if (aligning) putabits(bs, (unsigned int)0, (int)(8-aligning)); putabits(bs, val, N);}unsigned long byte_ali_getbits(bs, N)Bit_stream_struc *bs; int N; { unsigned long aligning, sstell(); if (N > MAX_LENGTH) printf("Cannot read or write more than %d bits at a time.\n", MAX_LENGTH); aligning = sstell(bs)%8; if (aligning) getbits(bs, (int)(8-aligning)); return(getbits(bs, N));}unsigned long sstell(bs)Bit_stream_struc *bs; { return(bs->totbit);}int end_bs(bs)Bit_stream_struc *bs; { return(bs->eobs);}int seek_sync(bs, sync, N)Bit_stream_struc *bs; long sync; int N; { double pow(); unsigned long aligning, stell(); unsigned long val; long maxi = (int)pow(2.0, (FLOAT)N) - 1; aligning = sstell(bs)%ALIGNING; if (aligning) getbits(bs, (int)(ALIGNING-aligning)); val = getbits(bs, N); while ((((signed)val&maxi) != sync) && (!end_bs(bs))) { val <<= ALIGNING; val |= getbits(bs, ALIGNING); } if (end_bs(bs)) return(0); else return(1);}/******************************************************************************* End of bit_stream.c package******************************************************************************//******************************************************************************* CRC error protection package******************************************************************************/void I_CRC_calc(fr_ps, bit_alloc, crc)frame_params *fr_ps;unsigned int bit_alloc[2][SBLIMIT];unsigned int *crc;{ int i, k; layer *info = fr_ps->header; int stereo = fr_ps->stereo; int jsbound = fr_ps->jsbound; *crc = 0xffff; update_CRC(info->bitrate_index, 4, crc); update_CRC(info->sampling_frequency, 2, crc); update_CRC(info->padding, 1, crc); update_CRC(info->extension, 1, crc); update_CRC(info->mode, 2, crc); update_CRC(info->mode_ext, 2, crc); update_CRC(info->copyright, 1, crc); update_CRC(info->original, 1, crc); update_CRC(info->emphasis, 2, crc); for (i=0;i<SBLIMIT;i++) for (k=0;k<((i<jsbound)?stereo:1);k++) update_CRC(bit_alloc[k][i], 4, crc);}void II_CRC_calc(fr_ps, bit_alloc, scfsi, crc)frame_params *fr_ps;unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT];unsigned int *crc;{ int i, k; layer *info = fr_ps->header; int stereo = fr_ps->stereo; int sblimit = fr_ps->sblimit; int jsbound = fr_ps->jsbound; al_table *alloc = fr_ps->alloc; *crc = 0xffff; update_CRC(info->bitrate_index, 4, crc); update_CRC(info->sampling_frequency, 2, crc); update_CRC(info->padding, 1, crc); update_CRC(info->extension, 1, crc); update_CRC(info->mode, 2, crc); update_CRC(info->mode_ext, 2, crc); update_CRC(info->copyright, 1, crc); update_CRC(info->original, 1, crc); update_CRC(info->emphasis, 2, crc); for (i=0;i<sblimit;i++) for (k=0;k<((i<jsbound)?stereo:1);k++) update_CRC(bit_alloc[k][i], (*alloc)[i][0].bits, crc); for (i=0;i<sblimit;i++) for (k=0;k<stereo;k++) if (bit_alloc[k][i]) update_CRC(scfsi[k][i], 2, crc);}void update_CRC(data, length, crc)unsigned int data, length, *crc;{ unsigned int masking, carry; masking = 1 << length; while((masking >>= 1)){ carry = *crc & 0x8000; *crc <<= 1; if (!carry ^ !(data & masking)) *crc ^= CRC16_POLYNOMIAL; } *crc &= 0xffff;}/******************************************************************************* End of CRC error protection package******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -