📄 takehiro.c
字号:
int count_bits(lame_global_flags *gfp,int *ix, FLOAT8 *xr, gr_info *cod_info) { lame_internal_flags *gfc=gfp->internal_flags; int bits=0,i; /* since quantize_xrpow uses table lookup, we need to check this first: */ FLOAT8 w = (IXMAX_VAL) / IPOW20(cod_info->global_gain); for ( i = 0; i < 576; i++ ) { if (xr[i] > w) return LARGE_BITS; }#ifdef ASM_QUANTIZE if (gfc->quantization) quantize_xrpow_ASM(xr, ix, cod_info->global_gain); else quantize_xrpow_ISO_ASM(xr, ix, cod_info->global_gain);#else if (gfc->quantization) quantize_xrpow(xr, ix, cod_info); else quantize_xrpow_ISO(xr, ix, cod_info);#endif bits=count_bits_long(gfc, ix, cod_info); return bits;}/*********************************************************************** re-calculate the best scalefac_compress using scfsi the saved bits are kept in the bit reservoir. **********************************************************************/INLINE voidrecalc_divide_init(lame_internal_flags *gfc, gr_info cod_info, int gr, int ch, int *ix,int r01_bits[],int r01_div[],int r0_tbl[],int r1_tbl[]){ int r0, r1, bigv, r0t, r1t, bits; bigv = cod_info.big_values; for (r0 = 0; r0 <= 7 + 15; r0++) { r01_bits[r0] = LARGE_BITS; } for (r0 = 0; r0 < 16; r0++) { int a1 = gfc->scalefac_band.l[r0 + 1], r0bits; if (a1 >= bigv) break; r0bits = cod_info.part2_length; r0t = choose_table(ix, ix + a1, &r0bits); for (r1 = 0; r1 < 8; r1++) { int a2 = gfc->scalefac_band.l[r0 + r1 + 2]; if (a2 >= bigv) break; bits = r0bits; r1t = choose_table(ix + a1, ix + a2, &bits); if (r01_bits[r0 + r1] > bits) { r01_bits[r0 + r1] = bits; r01_div[r0 + r1] = r0; r0_tbl[r0 + r1] = r0t; r1_tbl[r0 + r1] = r1t; } } }}INLINE voidrecalc_divide_sub(lame_internal_flags *gfc,gr_info cod_info2, int gr, int ch, gr_info *gi, int *ix,int r01_bits[],int r01_div[],int r0_tbl[],int r1_tbl[]){ int bits, r2, a2, bigv, r2t; bigv = cod_info2.big_values; for (r2 = 2; r2 < SBMAX_l + 1; r2++) { a2 = gfc->scalefac_band.l[r2]; if (a2 >= bigv) break; bits = r01_bits[r2 - 2] + cod_info2.count1bits; if (gi->part2_3_length <= bits) break; r2t = choose_table(ix + a2, ix + bigv, &bits); if (gi->part2_3_length <= bits) continue; memcpy(gi, &cod_info2, sizeof(gr_info)); gi->part2_3_length = bits; gi->region0_count = r01_div[r2 - 2]; gi->region1_count = r2 - 2 - r01_div[r2 - 2]; gi->table_select[0] = r0_tbl[r2 - 2]; gi->table_select[1] = r1_tbl[r2 - 2]; gi->table_select[2] = r2t; }}void best_huffman_divide(lame_internal_flags *gfc, int gr, int ch, gr_info *gi, int *ix){ int i, a1, a2; gr_info cod_info2; int r01_bits[7 + 15 + 1]; int r01_div[7 + 15 + 1]; int r0_tbl[7 + 15 + 1]; int r1_tbl[7 + 15 + 1]; memcpy(&cod_info2, gi, sizeof(gr_info)); if (gi->block_type == NORM_TYPE) { recalc_divide_init(gfc, cod_info2, gr, ch, ix,r01_bits,r01_div,r0_tbl,r1_tbl); recalc_divide_sub(gfc,cod_info2, gr, ch, gi, ix,r01_bits,r01_div,r0_tbl,r1_tbl); } i = cod_info2.big_values; if (i == 0 || (unsigned int)(ix[i-2] | ix[i-1]) > 1) return; i = gi->count1 + 2; if (i > 576) return; /* Determines the number of bits to encode the quadruples. */ memcpy(&cod_info2, gi, sizeof(gr_info)); cod_info2.count1 = i; a1 = a2 = 0; assert(i <= 576); for (; i > cod_info2.big_values; i -= 4) { int p = ((ix[i-4] * 2 + ix[i-3]) * 2 + ix[i-2]) * 2 + ix[i-1]; a1 += t32l[p]; a2 += t33l[p]; } cod_info2.big_values = i; cod_info2.count1table_select = 0; if (a1 > a2) { a1 = a2; cod_info2.count1table_select = 1; } cod_info2.count1bits = a1; cod_info2.part2_3_length = a1 + cod_info2.part2_length; if (cod_info2.block_type == NORM_TYPE) recalc_divide_sub(gfc, cod_info2, gr, ch, gi, ix,r01_bits,r01_div,r0_tbl,r1_tbl); else { /* Count the number of bits necessary to code the bigvalues region. */ a1 = gfc->scalefac_band.l[7 + 1]; if (a1 > i) { a1 = i; } if (a1 > 0) cod_info2.table_select[0] = choose_table(ix, ix + a1, (int *)&cod_info2.part2_3_length); if (i > a1) cod_info2.table_select[1] = choose_table(ix + a1, ix + i, (int *)&cod_info2.part2_3_length); if (gi->part2_3_length > cod_info2.part2_3_length) memcpy(gi, &cod_info2, sizeof(gr_info)); }}voidscfsi_calc(int ch, III_side_info_t *l3_side, III_scalefac_t scalefac[2][2]){ int i, s1, s2, c1, c2; int sfb; gr_info *gi = &l3_side->gr[1].ch[ch].tt; static const int scfsi_band[5] = { 0, 6, 11, 16, 21 }; static const int slen1_n[16] = { 0, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8,16,16 }; static const int slen2_n[16] = { 0, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8 }; for (i = 0; i < 4; i++) l3_side->scfsi[ch][i] = 0; for (i = 0; i < (int)(sizeof(scfsi_band) / sizeof(int)) - 1; i++) { for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1]; sfb++) { if (scalefac[0][ch].l[sfb] != scalefac[1][ch].l[sfb]) break; } if (sfb == scfsi_band[i + 1]) { for (sfb = scfsi_band[i]; sfb < scfsi_band[i + 1]; sfb++) { scalefac[1][ch].l[sfb] = -1; } l3_side->scfsi[ch][i] = 1; } } s1 = c1 = 0; for (sfb = 0; sfb < 11; sfb++) { if (scalefac[1][ch].l[sfb] < 0) continue; c1++; if (s1 < scalefac[1][ch].l[sfb]) s1 = scalefac[1][ch].l[sfb]; } s2 = c2 = 0; for (; sfb < SBPSY_l; sfb++) { if (scalefac[1][ch].l[sfb] < 0) continue; c2++; if (s2 < scalefac[1][ch].l[sfb]) s2 = scalefac[1][ch].l[sfb]; } for (i = 0; i < 16; i++) { if (s1 < slen1_n[i] && s2 < slen2_n[i]) { int c = slen1_tab[i] * c1 + slen2_tab[i] * c2; if ((int)gi->part2_length > c) { gi->part2_length = c; gi->scalefac_compress = i; } } }}/*Find the optimal way to store the scalefactors.Only call this routine after final scalefactors have beenchosen and the channel/granule will not be re-encoded. */void best_scalefac_store(lame_global_flags *gfp,int gr, int ch, int l3_enc[2][2][576], III_side_info_t *l3_side, III_scalefac_t scalefac[2][2]){ lame_internal_flags *gfc=gfp->internal_flags; /* use scalefac_scale if we can */ gr_info *gi = &l3_side->gr[gr].ch[ch].tt; u_int sfb,i,j,j2,l,start,end; /* remove scalefacs from bands with ix=0. This idea comes * from the AAC ISO docs. added mt 3/00 */ /* check if l3_enc=0 */ for ( sfb = 0; sfb < gi->sfb_lmax; sfb++ ) { if (scalefac[gr][ch].l[sfb]>0) { start = gfc->scalefac_band.l[ sfb ]; end = gfc->scalefac_band.l[ sfb+1 ]; for ( l = start; l < end; l++ ) if (l3_enc[gr][ch][l]!=0) break; if (l==end) scalefac[gr][ch].l[sfb]=0; } } for ( j=0, sfb = gi->sfb_smax; sfb < SBPSY_s; sfb++ ) { start = gfc->scalefac_band.s[ sfb ]; end = gfc->scalefac_band.s[ sfb+1 ]; for ( i = 0; i < 3; i++ ) { if (scalefac[gr][ch].s[sfb][i]>0) { j2 = j; for ( l = start; l < end; l++ ) if (l3_enc[gr][ch][j2++ /*3*l+i*/]!=0) break; if (l==end) scalefac[gr][ch].s[sfb][i]=0; } j += end-start; } } gi->part2_3_length -= gi->part2_length; if (!gi->scalefac_scale && !gi->preflag) { int b, s = 0; for (sfb = 0; sfb < gi->sfb_lmax; sfb++) { s |= scalefac[gr][ch].l[sfb]; } for (sfb = gi->sfb_smax; sfb < SBPSY_s; sfb++) { for (b = 0; b < 3; b++) { s |= scalefac[gr][ch].s[sfb][b]; } } if (!(s & 1) && s != 0) { for (sfb = 0; sfb < gi->sfb_lmax; sfb++) { scalefac[gr][ch].l[sfb] /= 2; } for (sfb = gi->sfb_smax; sfb < SBPSY_s; sfb++) { for (b = 0; b < 3; b++) { scalefac[gr][ch].s[sfb][b] /= 2; } } gi->scalefac_scale = 1; gi->part2_length = 99999999; if (gfc->mode_gr == 2) { scale_bitcount(&scalefac[gr][ch], gi); } else { scale_bitcount_lsf(&scalefac[gr][ch], gi); } } } for ( i = 0; i < 4; i++ ) l3_side->scfsi[ch][i] = 0; if (gfc->mode_gr==2 && gr == 1 && l3_side->gr[0].ch[ch].tt.block_type != SHORT_TYPE && l3_side->gr[1].ch[ch].tt.block_type != SHORT_TYPE) { scfsi_calc(ch, l3_side, scalefac); } gi->part2_3_length += gi->part2_length;}void huffman_init(){ int i; for (i = 0; i < 16*16; i++) { largetbl[i] = (((int)ht[16].hlen[i]) << 16) + ht[24].hlen[i]; } for (i = 0; i < 3*3; i++) { table23[i] = (((int)ht[2].hlen[i]) << 16) + ht[3].hlen[i]; } for (i = 0; i < 4*4; i++) { table56[i] = (((int)ht[5].hlen[i]) << 16) + ht[6].hlen[i]; }#ifdef MMX_choose_table for (i = 0; i < 6; i++) { int j; for (j = 0; j < 6; j++) { table789[i*16+j] = (((long long)ht[7].hlen[i*6+j]) << 32) + (((long long)ht[8].hlen[i*6+j]) << 16) + (((long long)ht[9].hlen[i*6+j])); } } for (i = 0; i < 8; i++) { int j; for (j = 0; j < 8; j++) { tableABC[i*16+j] = (((long long)ht[10].hlen[i*8+j]) << 32) + (((long long)ht[11].hlen[i*8+j]) << 16) + (((long long)ht[12].hlen[i*8+j])); } } for (i = 0; i < 16*16; i++) { tableDEF[i] = (((long long)ht[13].hlen[i]) << 32) + (((long long)ht[14].hlen[i]) << 16) + (((long long)ht[15].hlen[i])); } for (i = 0; i < 13; i++) { int t1, t2; for (t2 = 24; t2 < 32; t2++) { if (ht[t2].xlen > i) { break; } } for (t1 = t2 - 8; t1 < 24; t1++) { if (ht[t1].xlen > i) { break; } } choose_table_H[i] = t1+t2*256; linbits32[i] = ((long long)ht[t1].xlen << 48) + ((long long)ht[t1].xlen << 32) + ((long long)ht[t2].xlen << 16) + ((long long)ht[t2].xlen); }#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -