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

📄 common.c

📁 avi2mpg1_src 中包含了mpeg1编码的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -