static void set_pinfo ( lame_global_flags *gfp, gr_info * const cod_info, const III_psy_ratio * const ratio, const III_scalefac_t * const scalefac, const int gr, const int ch ) { lame_internal_flags *gfc=gfp->internal_flags; int sfb; int j,i,l,start,end,bw; FLOAT8 en0,en1; FLOAT ifqstep = ( cod_info->scalefac_scale == 0 ) ? .5 : 1.0; III_psy_xmin l3_xmin; calc_noise_result noise; III_psy_xmin xfsf; calc_xmin (gfp, ratio, cod_info, &l3_xmin); calc_noise (gfc, cod_info->l3_enc, cod_info, &l3_xmin, scalefac, &xfsf, &noise); if (cod_info->block_type == SHORT_TYPE) { for (j=0, sfb = 0; sfb < SBMAX_s; sfb++ ) { start = gfc->scalefac_band.s[ sfb ]; end = gfc->scalefac_band.s[ sfb + 1 ]; bw = end - start; for ( i = 0; i < 3; i++ ) { for ( en0 = 0.0, l = start; l < end; l++ ) { en0 += cod_info->xr[j] * cod_info->xr[j]; ++j; } en0=Max(en0/bw,1e-20); #if 0 { double tot1,tot2; if (sfb<SBMAX_s-1) { if (sfb==0) { tot1=0; tot2=0; } tot1 += en0; tot2 += ratio->en.s[sfb][i]; DEBUGF("%i %i sfb=%i mdct=%f fft=%f fft-mdct=%f db \n", gr,ch,sfb, 10*log10(Max(1e-25,ratio->en.s[sfb][i])), 10*log10(Max(1e-25,en0)), 10*log10((Max(1e-25,en0)/Max(1e-25,ratio->en.s[sfb][i])))); if (sfb==SBMAX_s-2) { DEBUGF("%i %i toti %f %f ratio=%f db \n",gr,ch, 10*log10(Max(1e-25,tot2)), 10*log(Max(1e-25,tot1)), 10*log10(Max(1e-25,tot1)/(Max(1e-25,tot2)))); } } /* masking: multiplied by en0/fft_energy average seems to be about -135db. */ } #endif /* convert to MDCT units */ en1=1e15; /* scaling so it shows up on FFT plot */ gfc->pinfo->xfsf_s[gr][ch][3*sfb+i] = en1*xfsf.s[sfb][i]*l3_xmin.s[sfb][i]/bw; gfc->pinfo->en_s[gr][ch][3*sfb+i] = en1*en0; if (ratio->en.s[sfb][i]>0) en0 = en0/ratio->en.s[sfb][i]; else en0=0; if (gfp->ATHonly || gfp->ATHshort) en0=0; gfc->pinfo->thr_s[gr][ch][3*sfb+i] = en1*Max(en0*ratio->thm.s[sfb][i],gfc->ATH->s[sfb]); /* there is no scalefactor bands >= SBPSY_s */ if (sfb < SBPSY_s) { gfc->pinfo->LAMEsfb_s[gr][ch][3*sfb+i]= -ifqstep*scalefac->s[sfb][i]; } else { gfc->pinfo->LAMEsfb_s[gr][ch][3*sfb+i]=0; } gfc->pinfo->LAMEsfb_s[gr][ch][3*sfb+i] -= 2*cod_info->subblock_gain[i]; } } } else { for ( sfb = 0; sfb < SBMAX_l; sfb++ ) { start = gfc->scalefac_band.l[ sfb ]; end = gfc->scalefac_band.l[ sfb+1 ]; bw = end - start; for ( en0 = 0.0, l = start; l < end; l++ ) en0 += cod_info->xr[l] * cod_info->xr[l]; en0/=bw; /* DEBUGF("diff = %f \n",10*log10(Max(ratio[gr][ch].en.l[sfb],1e-20)) -(10*log10(en0)+150)); */ #if 0 { double tot1,tot2; if (sfb==0) { tot1=0; tot2=0; } tot1 += en0; tot2 += ratio->en.l[sfb]; DEBUGF("%i %i sfb=%i mdct=%f fft=%f fft-mdct=%f db \n", gr,ch,sfb, 10*log10(Max(1e-25,ratio->en.l[sfb])), 10*log10(Max(1e-25,en0)), 10*log10((Max(1e-25,en0)/Max(1e-25,ratio->en.l[sfb])))); if (sfb==SBMAX_l-1) { DEBUGF("%i %i toti %f %f ratio=%f db \n", gr,ch, 10*log10(Max(1e-25,tot2)), 10*log(Max(1e-25,tot1)), 10*log10(Max(1e-25,tot1)/(Max(1e-25,tot2)))); } /* masking: multiplied by en0/fft_energy average seems to be about -147db. */ } #endif /* convert to MDCT units */ en1=1e15; /* scaling so it shows up on FFT plot */ gfc->pinfo->xfsf[gr][ch][sfb] = en1*xfsf.l[sfb]*l3_xmin.l[sfb]/bw; gfc->pinfo->en[gr][ch][sfb] = en1*en0; if (ratio->en.l[sfb]>0) en0 = en0/ratio->en.l[sfb]; else en0=0; if (gfp->ATHonly) en0=0; gfc->pinfo->thr[gr][ch][sfb] = en1*Max(en0*ratio->thm.l[sfb],gfc->ATH->l[sfb]); /* there is no scalefactor bands >= SBPSY_l */ if (sfb<SBPSY_l) { if (scalefac->l[sfb]<0) /* scfsi! */ gfc->pinfo->LAMEsfb[gr][ch][sfb] = gfc->pinfo->LAMEsfb[0][ch][sfb]; else gfc->pinfo->LAMEsfb[gr][ch][sfb] = -ifqstep*scalefac->l[sfb]; }else{ gfc->pinfo->LAMEsfb[gr][ch][sfb] = 0; } if (cod_info->preflag && sfb>=11) gfc->pinfo->LAMEsfb[gr][ch][sfb] -= ifqstep*pretab[sfb]; } /* for sfb */ } /* block type long */ gfc->pinfo->LAMEqss [gr][ch] = cod_info->global_gain; gfc->pinfo->LAMEmainbits[gr][ch] = cod_info->part2_3_length; gfc->pinfo->LAMEsfbits [gr][ch] = cod_info->part2_length; gfc->pinfo->over [gr][ch] = noise.over_count; gfc->pinfo->max_noise [gr][ch] = noise.max_noise; gfc->pinfo->over_noise[gr][ch] = noise.over_noise; gfc->pinfo->tot_noise [gr][ch] = noise.tot_noise; }
/************************************************************************ * * 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 */ }
/* * shine_iteration_loop: * ------------------ */ void shine_iteration_loop(shine_global_config *config) { shine_psy_xmin_t l3_xmin; gr_info *cod_info; int max_bits; int ch, gr, i; int *ix; for(ch=config->wave.channels; ch--; ) { for(gr=0; gr<config->mpeg.granules_per_frame; gr++) { /* setup pointers */ ix = config->l3_enc[ch][gr]; config->l3loop.xr = config->mdct_freq[ch][gr]; /* Precalculate the square, abs, and maximum, * for use later on. */ for (i=GRANULE_SIZE, config->l3loop.xrmax=0; i--;) { config->l3loop.xrsq[i] = mulsr(config->l3loop.xr[i],config->l3loop.xr[i]); config->l3loop.xrabs[i] = labs(config->l3loop.xr[i]); if(config->l3loop.xrabs[i]>config->l3loop.xrmax) config->l3loop.xrmax=config->l3loop.xrabs[i]; } cod_info = (gr_info *) &(config->side_info.gr[gr].ch[ch]); cod_info->sfb_lmax = SFB_LMAX - 1; /* gr_deco */ calc_xmin(&config->ratio, cod_info, &l3_xmin, gr, ch ); if ( config->mpeg.version == MPEG_I ) calc_scfsi(&l3_xmin,ch,gr,config); /* calculation of number of available bit( per granule ) */ max_bits = shine_max_reservoir_bits(&config->pe[ch][gr],config); /* reset of iteration variables */ memset(config->scalefactor.l[gr][ch],0,sizeof(config->scalefactor.l[gr][ch])); memset(config->scalefactor.s[gr][ch],0,sizeof(config->scalefactor.s[gr][ch])); for ( i=4; i--; ) cod_info->slen[i] = 0; cod_info->part2_3_length = 0; cod_info->big_values = 0; cod_info->count1 = 0; cod_info->scalefac_compress = 0; cod_info->table_select[0] = 0; cod_info->table_select[1] = 0; cod_info->table_select[2] = 0; cod_info->region0_count = 0; cod_info->region1_count = 0; cod_info->part2_length = 0; cod_info->preflag = 0; cod_info->scalefac_scale = 0; cod_info->count1table_select= 0; /* all spectral values zero ? */ if(config->l3loop.xrmax) cod_info->part2_3_length = shine_outer_loop(max_bits,&l3_xmin,ix, gr,ch,config); shine_ResvAdjust(cod_info, config ); cod_info->global_gain = cod_info->quantizerStepSize+210; } /* for gr */ } /* for ch */ shine_ResvFrameEnd(config); }
/* * L3_iteration_loop: * ------------------ */ void L3_iteration_loop(struct config_t *cfg, double pe[][2], long mdct_freq_org[2][2][samp_per_frame2], L3_psy_ratio_t *ratio, L3_side_info_t *side_info, int l3_enc[2][2][samp_per_frame2], int mean_bits, L3_scalefac_t *scalefactor) { L3_psy_xmin_t l3_xmin; gr_info *cod_info; int *main_data_begin; int max_bits; int ch, gr, i; static int firstcall = 1; int *ix; main_data_begin = &side_info->main_data_begin; if ( firstcall ) { *main_data_begin = 0; firstcall=0; } scalefac_band_long = &sfBandIndex[cfg->mpeg.samplerate_index + (cfg->mpeg.type * 3)].l[0]; for(ch=cfg->wave.channels; ch--; ) { for(gr=0; gr<2; gr++) { /* setup pointers */ ix = l3_enc[gr][ch]; xr = mdct_freq_org[gr][ch]; /* Precalculate the square, abs, and maximum, * for use later on. */ for (i=samp_per_frame2, xrmax=0; i--;) { xrsq[i] = mulsr(xr[i],xr[i]); xrabs[i] = labs(xr[i]); if(xrabs[i]>xrmax) xrmax=xrabs[i]; } cod_info = (gr_info *) &(side_info->gr[gr].ch[ch]); cod_info->sfb_lmax = SFB_LMAX - 1; /* gr_deco */ calc_xmin(ratio, cod_info, &l3_xmin, gr, ch ); calc_scfsi(side_info,&l3_xmin,ch,gr); /* calculation of number of available bit( per granule ) */ max_bits = ResvMaxBits(cfg, side_info,&pe[gr][ch],mean_bits); /* reset of iteration variables */ memset(scalefactor->l[gr][ch],0,22); memset(scalefactor->s[gr][ch],0,14); for ( i=4; i--; ) cod_info->slen[i] = 0; cod_info->part2_3_length = 0; cod_info->big_values = 0; cod_info->count1 = 0; cod_info->scalefac_compress = 0; cod_info->table_select[0] = 0; cod_info->table_select[1] = 0; cod_info->table_select[2] = 0; cod_info->region0_count = 0; cod_info->region1_count = 0; cod_info->part2_length = 0; cod_info->preflag = 0; cod_info->scalefac_scale = 0; cod_info->count1table_select= 0; /* all spectral values zero ? */ if(xrmax) cod_info->part2_3_length = outer_loop(max_bits,&l3_xmin,ix, scalefactor, gr,ch,side_info ); ResvAdjust(cfg, cod_info, side_info, mean_bits ); cod_info->global_gain = cod_info->quantizerStepSize+210; } /* for gr */ } /* for ch */ ResvFrameEnd(cfg, side_info,mean_bits); }