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

📄 takehiro.c

📁 MP3编码程序和资料
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -