static void short_block_scalefacs(const lame_internal_flags * gfc, gr_info * cod_info, III_scalefac_t * vbrsf, int *VBRmax) { int sfb, maxsfb, b; int maxover, maxover0, maxover1, mover; int v0, v1; int minsfb; int vbrmax = *VBRmax; maxover0 = 0; maxover1 = 0; maxsfb = gfc->sfb21_extra ? SBMAX_s : SBPSY_s; for (sfb = 0; sfb < maxsfb; ++sfb) { for (b = 0; b < 3; ++b) { v0 = (vbrmax - vbrsf->s[sfb][b]) - (4 * 14 + 2 * max_range_short[sfb]); v1 = (vbrmax - vbrsf->s[sfb][b]) - (4 * 14 + 4 * max_range_short[sfb]); if (maxover0 < v0) maxover0 = v0; if (maxover1 < v1) maxover1 = v1; } } if ((gfc->noise_shaping == 2) && (gfc->presetTune.use && !(gfc->presetTune.athadjust_safe_noiseshaping || gfc->ATH->adjust < 1.0))) /* allow scalefac_scale=1 */ mover = Min(maxover0, maxover1); else mover = maxover0; vbrmax -= mover; maxover0 -= mover; maxover1 -= mover; if (maxover0 == 0) cod_info->scalefac_scale = 0; else if (maxover1 == 0) cod_info->scalefac_scale = 1; 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_s; ++sfb) { for (b = 0; b < 3; ++b) { vbrsf->s[sfb][b] -= vbrmax; } } maxover = compute_scalefacs_short(vbrsf->s, cod_info, cod_info->scalefac.s, cod_info->subblock_gain); assert(maxover <= 0); /* adjust global_gain so at least 1 subblock gain = 0 */ minsfb = 999; /* prepare for minimum search */ for (b = 0; b < 3; ++b) if (minsfb > cod_info->subblock_gain[b]) minsfb = cod_info->subblock_gain[b]; if (minsfb > cod_info->global_gain / 8) minsfb = cod_info->global_gain / 8; vbrmax -= 8 * minsfb; cod_info->global_gain -= 8 * minsfb; for (b = 0; b < 3; ++b) cod_info->subblock_gain[b] -= minsfb; *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 */ }