static void long_block_scalefacs(const lame_internal_flags * gfc, gr_info * cod_info, III_scalefac_t * vbrsf, int *VBRmax) { const int *max_rangep; int sfb, maxsfb; int maxover, maxover0, maxover1, maxover0p, maxover1p, mover; int v0, v1, v0p, v1p; int vbrmax = *VBRmax; max_rangep = gfc->is_mpeg1 ? max_range_long : max_range_long_lsf_pretab; maxover0 = 0; maxover1 = 0; maxover0p = 0; /* pretab */ maxover1p = 0; /* pretab */ maxsfb = gfc->sfb21_extra ? SBMAX_l : SBPSY_l; for (sfb = 0; sfb < maxsfb; ++sfb) { v0 = (vbrmax - vbrsf->l[sfb]) - 2 * max_range_long[sfb]; v1 = (vbrmax - vbrsf->l[sfb]) - 4 * max_range_long[sfb]; v0p = (vbrmax - vbrsf->l[sfb]) - 2 * (max_rangep[sfb] + pretab[sfb]); v1p = (vbrmax - vbrsf->l[sfb]) - 4 * (max_rangep[sfb] + pretab[sfb]); if (maxover0 < v0) maxover0 = v0; if (maxover1 < v1) maxover1 = v1; if (maxover0p < v0p) maxover0p = v0p; if (maxover1p < v1p) maxover1p = v1p; } mover = Min(maxover0, maxover0p); if ((gfc->noise_shaping == 2) && (gfc->presetTune.use && !(gfc->presetTune.athadjust_safe_noiseshaping || gfc->ATH->adjust < 1.0))) { /* allow scalefac_scale=1 */ mover = Min(mover, maxover1); mover = Min(mover, maxover1p); } vbrmax -= mover; maxover0 -= mover; maxover0p -= mover; maxover1 -= mover; maxover1p -= mover; if (maxover0 <= 0) { cod_info->scalefac_scale = 0; cod_info->preflag = 0; vbrmax -= maxover0; } else if (maxover0p <= 0) { cod_info->scalefac_scale = 0; cod_info->preflag = 1; vbrmax -= maxover0p; } else if (maxover1 == 0) { cod_info->scalefac_scale = 1; cod_info->preflag = 0; } else if (maxover1p == 0) { cod_info->scalefac_scale = 1; cod_info->preflag = 1; } else { assert(0); /* this should not happen */ } cod_info->global_gain = vbrmax; assert(cod_info->global_gain < 256); if (cod_info->global_gain < 0) { cod_info->global_gain = 0; } else if (cod_info->global_gain > 255) cod_info->global_gain = 255; for (sfb = 0; sfb < SBMAX_l; ++sfb) vbrsf->l[sfb] -= vbrmax; if (gfc->is_mpeg1 == 1) maxover = compute_scalefacs_long(vbrsf->l, cod_info, cod_info->scalefac.l); else maxover = compute_scalefacs_long_lsf(vbrsf->l, cod_info, cod_info->scalefac.l); assert(maxover <= 0); *VBRmax = vbrmax; }
/************************************************************************ * * VBR_iteration_loop() * * ************************************************************************/ void VBR_iteration_loop_new (lame_global_flags *gfp, FLOAT8 pe[2][2], FLOAT8 ms_ener_ratio[2], FLOAT8 xr[2][2][576], III_psy_ratio ratio[2][2], III_side_info_t * l3_side, int l3_enc[2][2][576], III_scalefac_t scalefac[2][2]) { III_psy_xmin l3_xmin[2][2]; FLOAT8 masking_lower_db; FLOAT8 ifqstep; int start,end,bw,sfb, i,ch, gr, over; III_psy_xmin vbrsf; FLOAT8 vbrmax; iteration_init(gfp,l3_side,l3_enc); /* Adjust allowed masking based on quality setting */ /* db_lower varies from -10 to +8 db */ masking_lower_db = -10 + 2*gfp->VBR_q; /* adjust by -6(min)..0(max) depending on bitrate */ masking_lower = pow(10.0,masking_lower_db/10); masking_lower = 1; for (gr = 0; gr < gfp->mode_gr; gr++) { if (convert_mdct) ms_convert(xr[gr],xr[gr]); for (ch = 0; ch < gfp->stereo; ch++) { FLOAT8 xr34[576]; gr_info *cod_info = &l3_side->gr[gr].ch[ch].tt; int shortblock; over = 0; shortblock = (cod_info->block_type == SHORT_TYPE); for(i=0;i<576;i++) { FLOAT8 temp=fabs(xr[gr][ch][i]); xr34[i]=sqrt(sqrt(temp)*temp); } calc_xmin( gfp,xr[gr][ch], &ratio[gr][ch], cod_info, &l3_xmin[gr][ch]); vbrmax=0; if (shortblock) { for ( sfb = 0; sfb < SBPSY_s; sfb++ ) { for ( i = 0; i < 3; i++ ) { start = scalefac_band.s[ sfb ]; end = scalefac_band.s[ sfb+1 ]; bw = end - start; vbrsf.s[sfb][i] = find_scalefac(&xr[gr][ch][3*start+i],&xr34[3*start+i],3,sfb, masking_lower*l3_xmin[gr][ch].s[sfb][i],bw); if (vbrsf.s[sfb][i]>vbrmax) vbrmax=vbrsf.s[sfb][i]; } } }else{ for ( sfb = 0; sfb < SBPSY_l; sfb++ ) { start = scalefac_band.l[ sfb ]; end = scalefac_band.l[ sfb+1 ]; bw = end - start; vbrsf.l[sfb] = find_scalefac(&xr[gr][ch][start],&xr34[start],1,sfb, masking_lower*l3_xmin[gr][ch].l[sfb],bw); if (vbrsf.l[sfb]>vbrmax) vbrmax = vbrsf.l[sfb]; } } /* compute scalefactors */ /* sf = (cod_info->global_gain-210.0)/4.0; */ cod_info->global_gain = floor(4*vbrmax +210 + .5); if (shortblock) { for ( sfb = 0; sfb < SBPSY_s; sfb++ ) { for ( i = 0; i < 3; i++ ) { vbrsf.s[sfb][i] -= vbrmax; } } cod_info->scalefac_scale = 0; if (compute_scalefacs_short(vbrsf.s,cod_info,scalefac[gr][ch].s) > 0) { cod_info->scalefac_scale = 1; if (compute_scalefacs_short(vbrsf.s,cod_info,scalefac[gr][ch].s) >0) { /* what do we do now? */ exit(32); } } }else{ for ( sfb = 0; sfb < SBPSY_l; sfb++ ) vbrsf.l[sfb] -= vbrmax; /* can we get away with scalefac_scale=0? */ cod_info->scalefac_scale = 0; if (compute_scalefacs_long(vbrsf.l,cod_info,scalefac[gr][ch].l) > 0) { cod_info->scalefac_scale = 1; if (compute_scalefacs_long(vbrsf.l,cod_info,scalefac[gr][ch].l) >0) { /* what do we do now? */ exit(32); } } } } /* ch */ } /* gr */ }