📄 l3loop.c
字号:
start = scalefac_band_short[ sfb ]; end = scalefac_band_short[ sfb+1 ]; if ( start < region1Start ) pmax = &max1; else pmax = &max2; for(window=0;window<3;window++) for(line=start;line<end;line+=2) { if((line<0)||(line>576)) ERROR("Invalid line selected..."); x = abs( ix[ (line * 3) + window ] ); y = abs( ix[ ((line + 1) * 3) + window ]); *pmax = *pmax > x ? *pmax : x; *pmax = *pmax > y ? *pmax : y; } } cod_info->table_select[0] = choose_table( max1 ); cod_info->table_select[1] = choose_table( max2 ); } else { if ( cod_info->address1 > 0 ) cod_info->table_select[0] = new_choose_table( ix, 0, cod_info->address1 ); if ( cod_info->address2 > cod_info->address1 ) cod_info->table_select[1] = new_choose_table( ix, cod_info->address1, cod_info->address2 ); if ( cod_info->big_values * 2 > cod_info->address2 ) cod_info->table_select[2] = new_choose_table( ix, cod_info->address2, cod_info->big_values * 2 ); }}int new_choose_table( int ix[576], unsigned int begin, unsigned int end )/*************************************************************************//* Choose the Huffman table that will encode ix[begin..end] with *//* the fewest bits. *//* Note: This code contains knowledge about the sizes and characteristics *//* of the Huffman tables as defined in the IS (Table B.7), and will not work *//* with any arbitrary tables. *//*************************************************************************/{ int i, max; int choice[2]; int sum[2]; max = ix_max(ix,begin,end); if(max==0) return 0; choice[0] = 0; choice[1] = 0; if(max<15) { /* try tables with no linbits */ for ( i = 0; i < 14; i++ ) if ( ht[i].xlen > max ) { choice[ 0 ] = i; break; } if(!choice[0]) ERROR("Can't choose a table ...."); sum[ 0 ] = count_bit( ix, begin, end, choice[0] ); switch ( choice[0] ) { case 2: sum[ 1 ] = count_bit( ix, begin, end, 3 ); if ( sum[1] <= sum[0] ) choice[ 0 ] = 3; break; case 5: sum[ 1 ] = count_bit( ix, begin, end, 6 ); if ( sum[1] <= sum[0] ) choice[ 0 ] = 6; break; case 7: sum[ 1 ] = count_bit( ix, begin, end, 8 ); if ( sum[1] <= sum[0] ) { choice[ 0 ] = 8; sum[ 0 ] = sum[ 1 ]; } sum[ 1 ] = count_bit( ix, begin, end, 9 ); if ( sum[1] <= sum[0] ) choice[ 0 ] = 9; break; case 10: sum[ 1 ] = count_bit( ix, begin, end, 11 ); if ( sum[1] <= sum[0] ) { choice[ 0 ] = 11; sum[ 0 ] = sum[ 1 ]; } sum[ 1 ] = count_bit( ix, begin, end, 12 ); if ( sum[1] <= sum[0] ) choice[ 0 ] = 12; break; case 13: sum[ 1 ] = count_bit( ix, begin, end, 15 ); if ( sum[1] <= sum[0] ) choice[ 0 ] = 15; break; default: break; } } else { /* try tables with linbits */ max -= 15; for(i=15;i<24;i++) { if(ht[i].linmax>=max) { choice[ 0 ] = i; break; } } for(i=24;i<32;i++) { if(ht[i].linmax>=max) { choice[ 1 ] = i; break; } } if(!choice[0] || !choice[1]) ERROR("Hmmmppfff..."); 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];}int choose_table( int max )/*************************************************************************//* choose table *//*************************************************************************/{ 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; } } } if(!choice) ERROR("Can't decide what table to use..."); return choice;}int bigv_bitcount(int ix[576], gr_info *gi)/*************************************************************************//* Function: Count the number of bits necessary to code the bigvalues region. *//*************************************************************************/{ 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; int (*ix_s)[192][3]; 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 = (int (*)[192][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 ]; if(tableindex>=32) ERROR("No valid table..."); 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;}int count_bit(int ix[576], unsigned int start, unsigned int end, unsigned int table )/*************************************************************************//* Function: Count the number of bits necessary to code the subregion. *//*************************************************************************/{ unsigned linbits, ylen; register int i, sum; register int x,y; struct huffcodetab *h; if(table==0) return 0; h = &(ht[table]); sum = 0; ylen = h->ylen; linbits = h->linbits; if(table>15) { /* ESC-table is used */ for(i=start;i<end;i+=2) { x = ix[i]; y = ix[i+1]; if(x>14) { x = 15; sum += linbits; } if(y>14) { y = 15; sum += linbits; } sum += h->hlen[(x*ylen)+y]; if(x!=0) sum++; if(y!=0) sum++; } } else { /* No ESC-words */ for(i=start;i<end;i+=2) { x = ix[i]; y = ix[i+1]; sum += h->hlen[(x*ylen)+y]; if(x!=0) sum++; if(y!=0) sum++; } } return sum;}/* 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.*/int count_bits(int *ix /*int[576]*/, 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 */ return bits;}int bin_search_StepSize(int desired_rate, double start, int *ix, double xrs[576], gr_info * cod_info){ int top,bot,next,last; int bit; top = start; next = start; bot = 200; do { last = next; next = ((long)(top+bot) >> 1); cod_info->quantizerStepSize = next; quantize(xrs,ix,cod_info); bit = count_bits(ix,cod_info); if (bit>desired_rate) top = next; else bot = next; } while((bit!=desired_rate) && abs(last-next)>1); return next;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -