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

📄 decode.c

📁 mpeg layerI II III, support window and linux
💻 C
📖 第 1 页 / 共 5 页
字号:
        else        {           foo = (long)(sum * (double)SCALE -(double)0.5);        }     if (foo >= (long) SCALE)      {samples[j] = (OUTPUT_TYPE)(SCALE-1); ++clip;}     else if (foo < (long) -SCALE) {samples[j] = (OUTPUT_TYPE)(-SCALE);  ++clip;}     else                           samples[j] =(OUTPUT_TYPE)foo;      //printf("sample[%d] = 0x%x\n",j,samples[j]);    }    return(clip);}void out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames)OUTPUT_TYPE FAR pcm_sample[2][SSLIMIT][SBLIMIT];int num;frame_params *fr_ps;int done;FILE *outFile;unsigned long *psampFrames;{    int i,j,l;    int stereo = fr_ps->stereo;    int sblimit = fr_ps->sblimit;    static OUTPUT_TYPE outsamp[1600];    static long k = 0;    if (!done)        for (i=0;i<num;i++) for (j=0;j<SBLIMIT;j++) {            (*psampFrames)++;            for (l=0;l<stereo;l++) {                if (!(k%1600) && k) {                    /*                      Samples are big-endian. If this is a little-endian machine                      we must swap                      */                    if ( NativeByteOrder == order_unknown )                    {                        NativeByteOrder = DetermineByteOrder();                        if ( NativeByteOrder == order_unknown )                        {                            fprintf( stderr, "byte order not determined\n" );                            exit( 1 );                        }                    }                    if ( NativeByteOrder == order_littleEndian )#ifdef  OUT20                        SwapBytesInLongs( outsamp, 1600 );#else                        SwapBytesInWords( outsamp, 1600 );#endif                    fwrite(outsamp,sizeof(OUTPUT_TYPE),1600,outFile);                    k = 0;                }                outsamp[k++] = pcm_sample[l][i][j];            }        }    else {            if ( NativeByteOrder == order_unknown )            {                NativeByteOrder = DetermineByteOrder();                if ( NativeByteOrder == order_unknown )                {                    fprintf( stderr, "byte order not determined\n" );                    exit( 1 );                }            }            if ( NativeByteOrder == order_littleEndian )#ifdef  OUT20                SwapBytesInLongs( outsamp, (int)k );#else                SwapBytesInWords( outsamp, (int)k );#endif        fwrite(outsamp,sizeof(OUTPUT_TYPE),(int)k,outFile);        k = 0;    }}void  buffer_CRC(bs, old_crc)Bit_stream_struc  *bs;unsigned int  *old_crc;{    *old_crc = getbits(bs, 16);}void  recover_CRC_error(pcm_sample, error_count, fr_ps, outFile, psampFrames)OUTPUT_TYPE FAR pcm_sample[2][SSLIMIT][SBLIMIT];int error_count;frame_params *fr_ps;FILE *outFile;unsigned long *psampFrames;{    int  stereo = fr_ps->stereo;    int  num, done, i;    int  samplesPerFrame, samplesPerSlot;    layer  *hdr = fr_ps->header;    long  offset;    OUTPUT_TYPE  *temp;    num = 3;    if (hdr->lay == 1) num = 1;    samplesPerSlot = SBLIMIT * num * stereo;    samplesPerFrame = samplesPerSlot * 32;  #ifndef NO_CRC_RECOVERY    // MDB 3/19/2003 Don't attempt to predict how decoder will    // behave on bad CRC, just mute frame    if (error_count == 1) {     /* replicate previous error_free frame */        done = 1;        /* flush out fifo */        out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames);        /* go back to the beginning of the previous frame */        offset = sizeof(OUTPUT_TYPE) * samplesPerFrame;        fseek(outFile, -offset, SEEK_CUR);        done = 0;        for (i = 0; i < SCALE_BLOCK; i++) {            fread(pcm_sample, sizeof(OUTPUT_TYPE), samplesPerSlot, outFile);            out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames);        }    }    else   #endif    {                       /* mute the frame */        temp = (OUTPUT_TYPE*) pcm_sample;        done = 0;        for (i = 0; i < 2*3*SBLIMIT; i++)            *temp++ = MUTE;     /* MUTE value is in decoder.h */        for (i = 0; i < SCALE_BLOCK; i++)            out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames);    }}/************************* Layer III routines **********************/void III_get_side_info(bs, si, fr_ps)Bit_stream_struc *bs;III_side_info_t *si;frame_params *fr_ps;{   int ch, gr, i;   int stereo = fr_ps->stereo;   if(fr_ps->header->version != MPEG_PHASE2_LSF)   {      si->main_data_begin = getbits(bs, 9);      if (stereo == 1)         si->private_bits = getbits(bs,5);         else si->private_bits = getbits(bs,3);       for (ch=0; ch<stereo; ch++)           for (i=0; i<4; i++)           si->ch[ch].scfsi[i] = get1bit(bs);#ifdef DEBUG_SIDE_INFO         printf("side_info->main_data_begin = %d\n",si->main_data_begin);         printf("side_info->private_bits    = %d\n",si->private_bits);         for (ch=0; ch<stereo; ch++)           for (i=0; i<4; i++)           printf("side_info->ch[%d].scfsi[%d] = %d\n",ch,i,si->ch[ch].scfsi[i]); #endif         for (gr=0; gr< 2 ; gr++) {           for (ch=0; ch<stereo; ch++) {              si->ch[ch].gr[gr].part2_3_length = getbits(bs, 12);              si->ch[ch].gr[gr].big_values = getbits(bs, 9);              si->ch[ch].gr[gr].global_gain = getbits(bs, 8);              si->ch[ch].gr[gr].scalefac_compress = getbits(bs, 4);              si->ch[ch].gr[gr].window_switching_flag = get1bit(bs);#ifdef DEBUG_SIDE_INFO                  printf("side_info->ch[%d].gr[%d].part2_3_length        = %d\n",ch,gr,si->ch[ch].gr[gr].part2_3_length       );                 printf("side_info->ch[%d].gr[%d].big_values            = %d\n",ch,gr,si->ch[ch].gr[gr].big_values           );                 printf("side_info->ch[%d].gr[%d].global_gain           = %d\n",ch,gr,si->ch[ch].gr[gr].global_gain          );                 printf("side_info->ch[%d].gr[%d].scalefac_compress     = %d\n",ch,gr,si->ch[ch].gr[gr].scalefac_compress    );                 printf("side_info->ch[%d].gr[%d].window_switching_flag = %d\n",ch,gr,si->ch[ch].gr[gr].window_switching_flag);                 #endif               if (si->ch[ch].gr[gr].window_switching_flag) {                 si->ch[ch].gr[gr].block_type = getbits(bs, 2);                 si->ch[ch].gr[gr].mixed_block_flag = get1bit(bs);                 for (i=0; i<2; i++)                    si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);                 for (i=0; i<3; i++)                    si->ch[ch].gr[gr].subblock_gain[i] = getbits(bs, 3);            /* Set region_count parameters since they are implicit in this case. */                 if (si->ch[ch].gr[gr].block_type == 0) {                   printf("Side info bad: block_type == 0 in split block.\n");                   exit(0);                 }                 else if (si->ch[ch].gr[gr].block_type == 2                      && si->ch[ch].gr[gr].mixed_block_flag == 0)                             si->ch[ch].gr[gr].region0_count = 8; /* MI 9; */                 else si->ch[ch].gr[gr].region0_count = 7; /* MI 8; */                      si->ch[ch].gr[gr].region1_count = 20 -                                                si->ch[ch].gr[gr].region0_count;#ifdef DEBUG_SIDE_INFO                     printf("side_info->ch[%d].gr[%d].block_type       = %d\n",ch,gr,si->ch[ch].gr[gr].block_type);                     printf("side_info->ch[%d].gr[%d].mixed_block_flag = %d\n",ch,gr,si->ch[ch].gr[gr].mixed_block_flag);                     for (i=0; i<2; i++)                     {                          printf("side_info->ch[%d].gr[%d].table_select[%d] = %d\n",ch,gr,i,si->ch[ch].gr[gr].table_select[i]);                      }                     for (i=0; i<3; i++)                     {                         printf("side_info->ch[%d].gr[%d].subblock_gain[%d] = %d\n",ch,gr,i,si->ch[ch].gr[gr].subblock_gain[i]);                     }                     printf("side_info->ch[%d].gr[%d].region0_count = %d\n",ch,gr,si->ch[ch].gr[gr].region0_count);                     printf("side_info->ch[%d].gr[%d].region1_count = %d\n",ch,gr,si->ch[ch].gr[gr].region1_count);#endif                                   }            else {               for (i=0; i<3; i++)                   si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);               si->ch[ch].gr[gr].region0_count = getbits(bs, 4);               si->ch[ch].gr[gr].region1_count = getbits(bs, 3);               si->ch[ch].gr[gr].block_type = 0;#ifdef DEBUG_SIDE_INFO                     for (i=0; i<3; i++)                        {                          printf("side_info->ch[%d].gr[%d].table_select[%d] = %d\n",ch,gr,i,si->ch[ch].gr[gr].table_select[i]);                     }                     printf("side_info->ch[%d].gr[%d].region0_count = %d\n",ch,gr,si->ch[ch].gr[gr].region0_count);                     printf("side_info->ch[%d].gr[%d].region1_count = %d\n",ch,gr,si->ch[ch].gr[gr].region1_count);                     printf("side_info->ch[%d].gr[%d].block_type    = %d\n",ch,gr,si->ch[ch].gr[gr].block_type   );#endif                              }         si->ch[ch].gr[gr].preflag = get1bit(bs);         si->ch[ch].gr[gr].scalefac_scale = get1bit(bs);         si->ch[ch].gr[gr].count1table_select = get1bit(bs);#ifdef DEBUG_SIDE_INFO                  printf("side_info->ch[%d].gr[%d].preflag            =%d\n",ch,gr,si->ch[ch].gr[gr].preflag           );                 printf("side_info->ch[%d].gr[%d].scalefac_scale     =%d\n",ch,gr,si->ch[ch].gr[gr].scalefac_scale    );                 printf("side_info->ch[%d].gr[%d].count1table_select =%d\n",ch,gr,si->ch[ch].gr[gr].count1table_select);#endif          }      }    }    else /* Layer 3 LSF */    {        si->main_data_begin = getbits(bs, 8);        if (stereo == 1)                 si->private_bits = getbits(bs,1);         else si->private_bits = getbits(bs,2);        for (gr=0; gr< 1 ; gr++) {           for (ch=0; ch<stereo; ch++) {              si->ch[ch].gr[gr].part2_3_length = getbits(bs, 12);              si->ch[ch].gr[gr].big_values = getbits(bs, 9);              si->ch[ch].gr[gr].global_gain = getbits(bs, 8);              si->ch[ch].gr[gr].scalefac_compress = getbits(bs, 9);              si->ch[ch].gr[gr].window_switching_flag = get1bit(bs);              if (si->ch[ch].gr[gr].window_switching_flag) {                 si->ch[ch].gr[gr].block_type = getbits(bs, 2);                 si->ch[ch].gr[gr].mixed_block_flag = get1bit(bs);                 for (i=0; i<2; i++)                    si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);                 for (i=0; i<3; i++)                    si->ch[ch].gr[gr].subblock_gain[i] = getbits(bs, 3);            /* Set region_count parameters since they are implicit in this case. */                 if (si->ch[ch].gr[gr].block_type == 0) {                   printf("Side info bad: block_type == 0 in split block.\n");                   exit(0);                 }                 else if (si->ch[ch].gr[gr].block_type == 2                      && si->ch[ch].gr[gr].mixed_block_flag == 0)                             si->ch[ch].gr[gr].region0_count = 8; /* MI 9; */                 else si->ch[ch].gr[gr].region0_count = 7; /* MI 8; */                      si->ch[ch].gr[gr].region1_count = 20 - si->ch[ch].gr[gr].region0_count;              }              else {                for (i=0; i<3; i++)                   si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);               si->ch[ch].gr[gr].region0_count = getbits(bs, 4);               si->ch[ch].gr[gr].region1_count = getbits(bs, 3);               si->ch[ch].gr[gr].block_type = 0;              }         si->ch[ch].gr[gr].scalefac_scale = get1bit(bs);         si->ch[ch].gr[gr].count1table_select = get1bit(bs);         }     }  }}void III_put_side_info(bs, si, fr_ps)frame_params *fr_ps;Bit_stream_struc *bs;III_side_info_t *si;{   int ch, gr, i;   int stereo = fr_ps->stereo; if(fr_ps->header->version != MPEG_PHASE2_LSF) {   putbits(bs, si->main_data_begin,9);   if (stereo == 1)      putbits(bs, si->private_bits, 5);      else putbits(bs, si->private_bits, 3);   for (ch=0; ch<stereo; ch++)      for (i=0; i<4; i++)         put1bit(bs, si->ch[ch].scfsi[i]);   for (gr=0; gr<2; gr++) {      for (ch=0; ch<stereo; ch++) {         putbits(bs, si->ch[ch].gr[gr].part2_3_length, 12);         putbits(bs, si->ch[ch].gr[gr].big_values, 9);         putbits(bs, si->ch[ch].gr[gr].global_gain, 8);         putbits(bs, si->ch[ch].gr[gr].scalefac_compress, 4);         put1bit(bs, si->ch[ch].gr[gr].window_switching_flag);         if (si->ch[ch].gr[gr].window_switching_flag) {            putbits(bs, si->ch[ch].gr[gr].block_type, 2);            put1bit(bs, si->ch[ch].gr[gr].mixed_block_flag);            for (i=0; i<2; i++)               putbits(bs, si->ch[ch].gr[gr].table_select[i], 5);            for (i=0; i<3; i++)               putbits(bs, si->ch[ch].gr[gr].subblock_gain[i], 3);            }         else {            for (i=0; i<3; i++)            putbits(bs, si->ch[ch].gr[gr].table_select[i], 5);            putbits(bs, si->ch[ch].gr[gr].region0_count, 4);            putbits(bs, si->ch[ch].gr[gr].region1_count, 3);            }         put1bit(bs, si->ch[ch].gr[gr].preflag);         put1bit(bs, si->ch[ch].gr[gr].scalefac_scale);         put1bit(bs, si->ch[ch].gr[gr].count1table_select);         }      } } else /* Layer 3 LSF */ {    putbits(bs, si->main_data_begin,8);    if (stereo == 1)      putbits(bs, si->private_bits, 1);      else putbits(bs, si->private_bits, 2);     for (gr=0; gr<1; gr++) {       for (ch=0; ch<stereo; ch++) {         putbits(bs, si->ch[ch].gr[gr].part2_3_length, 12);         putbits(bs, si->ch[ch].gr[gr].big_values, 9);         putbits(bs, si->ch[ch].gr[gr].global_gain, 8);         putbits(bs, si->ch[ch].gr[gr].scalefac_compress, 9);

⌨️ 快捷键说明

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