📄 decode.c
字号:
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 + -