loop.c
来自「ISO mp3 sources (distribution 10) Layer」· C语言 代码 · 共 2,221 行 · 第 1/5 页
C
2,221 行
sum[ 0 ] = count_bit( ix, begin, end, choice[0] ); sum[ 1 ] = count_bit( ix, begin, end, choice[1] ); if ( sum[1] < sum[0] ) choice[ 0 ] = choice[ 1 ]; } return choice[ 0 ];}/*************************************************************************//* choose table *//*************************************************************************/int choose_table( int max ){ int i, choice; if ( max == 0 ) return 0; max = abs( max ); choice = 0; if ( max < 15 ) { for ( i = 0; i < 15; i++ ) { if ( ht[i].xlen > max ) { choice = i; break; } } } else { max -= 15; for (i = 15; i < 32; i++ ) { if ( ht[i].linmax >= max ) { choice = i; break; } } } assert( choice ); return choice;}/*************************************************************************//* bigv_bitcount *//*************************************************************************//*Function: Count the number of bits necessary to code the bigvalues region.*/int bigv_bitcount( int ix[576], gr_info *gi ){ int bits = 0; if ( gi->window_switching_flag && gi->block_type == 2 ) { /* Within each scalefactor band, data is given for successive time windows, beginning with window 0 and ending with window 2. Within each window, the quantized values are then arranged in order of increasing frequency... */ int sfb, window, line, start, end; I192_3 *ix_s; if ( gi->mixed_block_flag ) { unsigned int table; if ( (table = gi->table_select[0]) != 0 ) bits += count_bit( ix, 0, gi->address1, table ); sfb = 2; } else sfb = 0; ix_s = (I192_3 *) &ix[0]; for ( ; sfb < 13; sfb++ ) { unsigned tableindex = 100; start = scalefac_band_short[ sfb ]; end = scalefac_band_short[ sfb+1 ]; if ( start < 12 ) tableindex = gi->table_select[ 0 ]; else tableindex = gi->table_select[ 1 ]; assert( tableindex < 32 ); for ( window = 0; window < 3; window++ ) for ( line = start; line < end; line += 2 ) { unsigned int code, ext; int cbits, xbits; int x = (*ix_s)[line][window]; int y = (*ix_s)[line + 1][window]; bits += HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits ); } } } else { unsigned int table; if( (table=gi->table_select[0]) != 0 ) /* region0 */ bits += count_bit(ix, 0, gi->address1, table ); if( (table=gi->table_select[1]) != 0 ) /* region1 */ bits += count_bit(ix, gi->address1, gi->address2, table ); if( (table=gi->table_select[2]) != 0 ) /* region2 */ bits += count_bit(ix, gi->address2, gi->address3, table ); } return bits;}/*************************************************************************//* count_bit *//*************************************************************************//* Function: Count the number of bits necessary to code the subregion. */int count_bit( int ix[576], unsigned int start, unsigned int end, unsigned int table ){ int i, sum; sum = 0; for ( i = start; i < end; i += 2 ) { unsigned int code, ext; int cbits, xbits; sum += HuffmanCode( table, ix[i], ix[i+1], &code, &ext, &cbits, &xbits ); } return sum;}#ifndef HAVE_NINTintnint( double in ){ int temp; if( in < 0 ) temp = (int)(in - 0.5); else temp = (int)(in + 0.5); return(temp);}doubleaint(double in) { return((long) in);}#endif/* Seymour's comment: Jan 8 1995 When mixed_block_flag is set, the low subbands 0-1 undergo the long window transform and are each split into 18 frequency lines, while the remaining 30 subbands undergo the short window transform and are each split into 6 frequency lines. A problem now arises, as neither the short or long scale factor bands apply to this mixed spectrum. The standard resolves this situation by using the first 8 long scale factor bands for the low spectrum and the short scale factor bands in the range of 3 to 11 (inclusive) for the remaining frequency lines. These scale factor bands do not match exactly to the 0-1 subbands for all sampling frequencies (32,44.1 and 48 kHz); however they were designed so that there would not be a frequency gap or overlap at the switch over point. (Note multiply short frequency lines by 3 to account for wider frequency line.) *//*************************************************************************//* gr_deco *//*************************************************************************/void gr_deco( gr_info *cod_info ){ if ( cod_info->window_switching_flag != 0 && cod_info->block_type == 2 ) if ( cod_info->mixed_block_flag == 0 ) { cod_info->sfb_lmax = 0; /* No sb*/ cod_info->sfb_smax = 0; } else { cod_info->sfb_lmax = 8; cod_info->sfb_smax = 3; } else { cod_info->sfb_lmax = SFB_LMAX - 1; cod_info->sfb_smax = SFB_SMAX - 1; /* No sb */ }}/* The following optional code written by Seymour Shlien will speed up the outer_loop code which is called by iteration_loop. When BIN_SEARCH is defined, the outer_loop function precedes the call to the function inner_loop with a call to bin_search gain defined below, which returns a good starting quantizerStepSize.*/#if defined(BIN_SEARCH) || defined(PERFORM) int count_bits(ix,cod_info) int *ix; /* I576 *ix; */gr_info *cod_info;{int bits,max; calc_runlen(ix,cod_info); /*rzero,count1,big_values*/ max = ix_max( ix, 0,576); if(max > 8192) return 100000; /* report unsuitable quantizer */ bits = count1_bitcount(ix, cod_info); /*count1_table selection*/ subdivide(cod_info); /* bigvalues sfb division */ bigv_tab_select(ix,cod_info); /* codebook selection*/ bits += bigv_bitcount(ix,cod_info); /* bit count *//* printf("\nglobal_gain = %f bits= %d ",cod_info->quantizerStepSize,bits);*/return bits;}#endif#ifdef BIN_SEARCHint bin_search_StepSize(int desired_rate, double start, int *ix, double xrs[576], gr_info * cod_info){double top,bot,next,last;int bit;top = start;bot = 200;next = start;do { last = next; next = aint((top+bot)/2.0); cod_info->quantizerStepSize = next; quantize(xrs,ix,cod_info); bit = count_bits(ix,cod_info); if (bit>desired_rate) top = next; else bot = next;/* printf("\n%f %f %f %d %d",next, top,bot,bit,desired_rate);*/ } while ((bit != desired_rate) && fabs(last - next) > 1.0);return next;}#endif#ifdef PERFORM/* The following code is used for exposing some problems with the outer_loop code. PERFORM should be defined to the frame number you wish to have additional output recorded in the file encode.log - Seymour Shlien 14-Jan-97*//*float worst_xfsf_to_xmin_ratio(l3_xmin,xfsf,block_type,gr,ch)double xfsf[4][CBLIMIT];III_psy_xmin *l3_xmin;int block_type,gr,ch;*/float worst_xfsf_to_xmin_ratio(III_psy_xmin *l3_xmin, double xfsf[4][CBLIMIT] ,int block_type,int gr,int ch){float ratio,maxratio;int i,j;maxratio =-100.0;if (block_type != 2) for(i=0;i<21;i++) { ratio = 10.*log10(xfsf[0][i] /l3_xmin->l[gr][ch][i]); if (ratio > maxratio) maxratio = ratio; }else { for(j=0;j<3;j++)/* for(i = cod_info->sfb_smax; i <SFB_SMAX; i++) */ for(i = 0; i <11; i++) { ratio = 10.*log10(xfsf[j+1][i] /l3_xmin->s[gr][ch][i][j]); if (ratio > maxratio) maxratio = ratio; } }return maxratio;} print_ratios(handle_out,l3_xmin,xfsf,block_type,gr,ch)FILE *handle_out;double xfsf[4][CBLIMIT];III_psy_xmin *l3_xmin;int gr,ch;int block_type;{float ratio;int i,j;if(block_type !=2) for (i=0;i<21;i++) { ratio = 100.0; /* signals undefined value in output */ if(l3_xmin->l[gr][ch][i] >1.0e-20) ratio = 10.*log10(xfsf[0][i] /l3_xmin->l[gr][ch][i]); fprintf(handle_out,"%6.2f ",ratio); if(i%5==4) fprintf(handle_out,"\n"); }else for(j=0;j<3;j++) { fprintf(handle_out,"\n block %d\n",j); for(i = 0; i <11; i++) { ratio = 10.*log10(xfsf[j+1][i] /l3_xmin->s[gr][ch][i][j]); fprintf(handle_out,"%6.2f ",ratio); if(i%5==4) fprintf(handle_out,"\n"); } }fprintf(handle_out,"\n");}print_scalefacs(handle_out,scalefac,block_type,gr,ch)FILE *handle_out;III_scalefac_t *scalefac;int gr,ch;int block_type;{int sfb,j;if(block_type !=2) for ( sfb = 0; sfb < 21; sfb++ ) { fprintf(handle_out,"%6d ", scalefac->l[gr][ch][sfb]); if(sfb%5==4) fprintf(handle_out,"\n"); }else for (j=0;j<3;j++) { fprintf(handle_out,"\n block %d\n",j); for (sfb=0;sfb<11;sfb++) { fprintf(handle_out,"%6d ",scalefac->s[gr][ch][sfb][j]); if(sfb%5==4) fprintf(handle_out,"\n"); } }fprintf(handle_out,"\n");}print_quantized_values(FILE *handle, int ix[576], gr_info *cod_info){int sfb,start,end,i,bw;for (sfb=0;sfb<cod_info->sfb_lmax;sfb++) { start = scalefac_band_long[sfb]; end = scalefac_band_long[sfb+1]; bw = end - start; fprintf(handle,"scalefac band %d from %d to %d\n",sfb,start,end); for (i=0;i<bw;i++) { fprintf(handle,"%8d",ix[start+i]); if(i%5==4) fprintf(handle,"\n"); } fprintf(handle,"\n"); }}test_inner_loop(double xr[2][2][576], int l3_enc[2][2][576], int max_bits, gr_info *cod_info, int gr, int ch, double xfsf[4][CBLIMIT], III_psy_xmin *l3_xmin) { int bits, c1bits, bvbits; double *xrs; /* D576 *xr; */ int *ix; /* I576 *ix; */ xrs = &xr[gr][ch][0]; ix = l3_enc[gr][ch]; assert( max_bits >= 0 ); cod_info->quantizerStepSize -= 1.0;; do { do { cod_info->quantizerStepSize += 1.0; quantize( xrs, ix, cod_info ); } while ( ix_max(ix, 0, 576) > 8191 + 14 ); /* within table range? */ bits = count_bits(ix,cod_info); if(frameNum == PERFORM) { fprintf(log_output,"StepSize=%f bits = %d huff_bits = %d\n", cod_info->quantizerStepSize,bits,max_bits); calc_noise( &xr[gr][ch][0], &l3_enc[gr][ch][0], cod_info, xfsf ); /* distortion calculation */ print_ratios(log_output,l3_xmin,xfsf,cod_info->block_type,gr,ch); fprintf(log_output,"\n\n"); } } while ( bits > max_bits ); return bits;} #endif PERFORM
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?