ref: c00c2e541fcdc34f8a015bf9da28f04911fa9483
parent: 15eebf2ac836c134507c6e5c42979d44c1cfdd7c
author: menno <menno>
date: Mon Sep 25 13:39:46 EDT 2000
Added VBR quantizer (but not working yet)
--- a/enc_tf.c
+++ b/enc_tf.c
@@ -193,35 +193,6 @@
}
-#define NZEROS 10
-#define NPOLES 10
-#define GAIN 1.769346444e+01
-
-static float xv1[NZEROS+1], yv1[NPOLES+1];
-static float xv2[NZEROS+1], yv2[NPOLES+1];
-
-static double filter(double in, int ch)
- {
- float *xv, *yv;
- if (ch == 0) { xv = xv1; yv = yv1; }
- else {xv = xv2; yv = yv2; }
- { xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = xv[3]; xv[3] = xv[4]; xv[4] = xv[5]; xv[5] = xv[6]; xv[6] = xv[7]; xv[7] = xv[8]; xv[8] = xv[9]; xv[9] = xv[10];
- xv[10] = in / GAIN;
- yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = yv[3]; yv[3] = yv[4]; yv[4] = yv[5]; yv[5] = yv[6]; yv[6] = yv[7]; yv[7] = yv[8]; yv[8] = yv[9]; yv[9] = yv[10];
- yv[10] = (xv[0] + xv[10]) + 10 * (xv[1] + xv[9]) + 45 * (xv[2] + xv[8])
- + 120 * (xv[3] + xv[7]) + 210 * (xv[4] + xv[6]) + 252 * xv[5]
- + ( -0.0031942899 * yv[0]) + ( -0.0495126652 * yv[1])
- + ( -0.3523340657 * yv[2]) + ( -1.5191103652 * yv[3])
- + ( -4.4065847179 * yv[4]) + ( -9.0160440949 * yv[5])
- + (-13.2344234780 * yv[6]) + (-13.8407183240 * yv[7])
- + ( -9.9529291465 * yv[8]) + ( -4.4996258124 * yv[9]);
- return yv[10];
- }
-}
-
-
-
-
/*******************************************************************************
***
--- a/quant.c
+++ b/quant.c
@@ -396,9 +396,9 @@
double invQuantFac;
double linediff, noise;
- *over_noise = 0.0;
- *tot_noise = 0.0;
- *max_noise = -999.0;
+ *over_noise = 1;
+ *tot_noise = 1;
+ *max_noise = 1E-20;
if (quantInfo->block_type!=ONLY_SHORT_WINDOW)
PulseDecoder(quantInfo, quant);
@@ -492,8 +492,7 @@
int count_bits(AACQuantInfo* quantInfo,
int quant[NUM_COEFF]
-// ,int output_book_vector[SFB_NUM_MAX*2]
- )
+ )
{
int i, bits = 0;
@@ -998,184 +997,333 @@
return 0;
}
-#if 0
+#if 0 // VBR quantizer not finished yet
+
+#if (defined(__GNUC__) && defined(__i386__))
+#define USE_GNUC_ASM
+#endif
+#ifdef _MSC_VER
+#define USE_MSC_ASM
+#endif
+
+/*********************************************************************
+ * XRPOW_FTOI is a macro to convert floats to ints.
+ * if XRPOW_FTOI(x) = nearest_int(x), then QUANTFAC(x)=adj43asm[x]
+ * ROUNDFAC= -0.0946
+ *
+ * if XRPOW_FTOI(x) = floor(x), then QUANTFAC(x)=asj43[x]
+ * ROUNDFAC=0.4054
+ *********************************************************************/
+#ifdef USE_GNUC_ASM
+# define ROUNDFAC -0.0946
+#elif defined (USE_MSC_ASM)
+# define ROUNDFAC -0.0946
+#else
+# define ROUNDFAC 0.4054
+#endif
+
+
+
+int compute_scalefacs(AACQuantInfo* quantInfo,
+ int sf[SFB_NUM_MAX],
+ int scalefac[SFB_NUM_MAX])
+{
+ int sfb;
+ int maxover;
+ int ifqstep = 2;
+
+
+// if (cod_info->preflag)
+// for ( sfb = 11; sfb < SBPSY_l; sfb++ )
+// sf[sfb] += pretab[sfb]*ifqstep;
+
+
+ maxover = 0;
+ for (sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++) {
+
+ if (sf[sfb]<0) {
+ /* ifqstep*scalefac >= -sf[sfb], so round UP */
+ scalefac[sfb]=-sf[sfb]/ifqstep + (-sf[sfb] % ifqstep != 0);
+ if (scalefac[sfb] > /*max_range[sfb]*/10) scalefac[sfb]=10/*max_range[sfb]*/;
+
+ /* sf[sfb] should now be positive: */
+ if ( -(sf[sfb] + scalefac[sfb]*ifqstep) > maxover) {
+ maxover = -(sf[sfb] + scalefac[sfb]*ifqstep);
+ }
+ }
+ }
+
+ return maxover;
+}
+
+
+
+double calc_sfb_noise_ave(double *xr, double *xr34, int bw,int sf)
+{
+ int j;
+ double xfsf=0, xfsf_p1=0, xfsf_m1=0;
+ double sfpow34,sfpow34_p1,sfpow34_m1;
+ double sfpow,sfpow_p1,sfpow_m1;
+
+ sfpow = pow(2.0,((double)sf)*.25);
+ sfpow34 = pow(2.0,-((double)sf)*.1875);
+
+ sfpow_m1 = sfpow*.8408964153;
+ sfpow34_m1 = sfpow34*1.13878863476;
+
+ sfpow_p1 = sfpow*1.189207115;
+ sfpow34_p1 = sfpow34*0.878126080187;
+
+ for ( j=0; j < bw ; j++) {
+ int ix;
+ double temp,temp_p1,temp_m1;
+
+ if (xr34[j]*sfpow34_m1 > 8191) return -1;
+
+ temp = xr34[j]*sfpow34;
+ XRPOW_FTOI(temp, ix);
+ XRPOW_FTOI(temp + QUANTFAC(ix), ix);
+ temp = fabs(xr[j])- pow_quant[ix]*sfpow;
+ temp *= temp;
+
+ temp_p1 = xr34[j]*sfpow34_p1;
+ XRPOW_FTOI(temp_p1, ix);
+ XRPOW_FTOI(temp_p1 + QUANTFAC(ix), ix);
+ temp_p1 = fabs(xr[j])- pow_quant[ix]*sfpow_p1;
+ temp_p1 *= temp_p1;
+
+ temp_m1 = xr34[j]*sfpow34_m1;
+ XRPOW_FTOI(temp_m1, ix);
+ XRPOW_FTOI(temp_m1 + QUANTFAC(ix), ix);
+ temp_m1 = fabs(xr[j])- pow_quant[ix]*sfpow_m1;
+ temp_m1 *= temp_m1;
+
+ xfsf += temp;
+ xfsf_p1 += temp_p1;
+ xfsf_m1 += temp_m1;
+ }
+ if (xfsf_p1>xfsf) xfsf = xfsf_p1;
+ if (xfsf_m1>xfsf) xfsf = xfsf_m1;
+ return xfsf/bw;
+}
+
+int find_scalefac(double *xr,double *xr34,int sfb,
+ double l3_xmin,int bw)
+{
+ double xfsf;
+ int i,sf,sf_ok,delsf;
+
+ /* search will range from sf: -209 -> 45 */
+ sf = -82;
+ delsf = 128;
+
+ sf_ok=10000;
+ for (i=0; i<7; i++) {
+ delsf /= 2;
+ xfsf = calc_sfb_noise_ave(xr,xr34,bw,sf);
+
+ if (xfsf < 0) {
+ /* scalefactors too small */
+ sf += delsf;
+ }else{
+ if (sf_ok==10000) sf_ok=sf;
+ if (xfsf > l3_xmin) {
+ /* distortion. try a smaller scalefactor */
+ sf -= delsf;
+ }else{
+ sf_ok = sf;
+ sf += delsf;
+ }
+ }
+ }
+// assert(sf_ok!=10000);
+
+ return sf;
+}
+
int
-VBR_noise_shaping(lame_global_flags *gfp,
- double xr[576], III_psy_ratio *ratio,
- int l3_enc[2][2][576], int *ath_over, int minbits, int maxbits,
- III_scalefac_t scalefac[2][2],
- int gr,int ch)
+VBR_quantize_granule(AACQuantInfo* quantInfo,
+ double *pow_spectrum,
+ int quant[1024]
+ )
{
- lame_internal_flags *gfc=gfp->internal_flags;
- int start,end,bw,sfb,l, i, vbrmax;
- III_scalefac_t vbrsf;
- III_scalefac_t save_sf;
- int maxover0,maxover1,maxover0p,maxover1p,maxover,mover;
+ quantize(quantInfo, pow_spectrum, quant);
+
+ return count_bits(quantInfo, quant);
+}
+
+int
+VBR_noise_shaping(AACQuantInfo* quantInfo,
+ double xr[1024],
+ double xr34orig[1024],
+ double allowed_dist[SFB_NUM_MAX],
+ int quant[1024], int minbits, int maxbits,
+ int scalefac[SFB_NUM_MAX])
+{
+ int start,end,bw,sfb,l, vbrmax;
+ int bits_used;
+ int vbrsf[SFB_NUM_MAX];
+ int save_sf[SFB_NUM_MAX];
+ int maxover0,maxover1,maxover,mover;
int ifqstep;
- III_psy_xmin l3_xmin;
- III_side_info_t * l3_side;
- gr_info *cod_info;
- double xr34[576];
- int shortblock;
- int global_gain_adjust=0;
+ double xr34[1024];
- l3_side = &gfc->l3_side;
- cod_info = &l3_side->gr[gr].ch[ch].tt;
- shortblock = (cod_info->block_type == SHORT_TYPE);
- *ath_over = calc_xmin( gfp,xr, ratio, cod_info, &l3_xmin);
+
+// for(i=0;i<1024;i++) {
+// double temp=fabs(xr[i]);
+// xr34[i]=sqrt(sqrt(temp)*temp);
+// }
+ memcpy(xr34, xr34orig, sizeof(xr34));
- for(i=0;i<576;i++) {
- double temp=fabs(xr[i]);
- xr34[i]=sqrt(sqrt(temp)*temp);
- }
-
-
vbrmax=-10000;
- int sflist[3]={-10000,-10000,-10000};
- for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
- start = gfc->scalefac_band.l[ sfb ];
- end = gfc->scalefac_band.l[ sfb+1 ];
+ for ( sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++ ) {
+ start = quantInfo->sfb_offset[sfb];
+ end = quantInfo->sfb_offset[sfb+1];
bw = end - start;
- vbrsf.l[sfb] = find_scalefac(&xr[start],&xr34[start],1,sfb,
- l3_xmin.l[sfb],bw);
- if (vbrsf.l[sfb]>vbrmax) vbrmax = vbrsf.l[sfb];
+ vbrsf[sfb] = find_scalefac(&xr[start],&xr34[start],sfb,
+ allowed_dist[sfb],bw);
+ }
- /* code to find the 3 largest (counting duplicates) contributed
- * by Microsoft Employee #12 */
- if (vbrsf.l[sfb]>sflist[0]) {
- sflist[2]=sflist[1];
- sflist[1]=sflist[0];
- sflist[0]=vbrsf.l[sfb];
- } else if (vbrsf.l[sfb]>sflist[1]) {
- sflist[2]=sflist[1];
- sflist[1]=vbrsf.l[sfb];
- } else if (vbrsf.l[sfb]>sflist[2]) {
- sflist[2]=vbrsf.l[sfb];
- }
+#define MAX_SF_DELTA 4
+
+ for ( sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++ ) {
+ if (sfb>0)
+ vbrsf[sfb] = min(vbrsf[sfb-1]+MAX_SF_DELTA,vbrsf[sfb]);
+ if (sfb< quantInfo->nr_of_sfb-1)
+ vbrsf[sfb] = min(vbrsf[sfb+1]+MAX_SF_DELTA,vbrsf[sfb]);
}
-// vbrmax=sflist[2];
+ for ( sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++ )
+ if (vbrsf[sfb]>vbrmax) vbrmax = vbrsf[sfb];
+
+
/* save a copy of vbrsf, incase we have to recomptue scalefacs */
- memcpy(&save_sf,&vbrsf,sizeof(III_scalefac_t));
+ memcpy(&save_sf,&vbrsf,sizeof(int)*SFB_NUM_MAX);
- do {
- memset(&scalefac[gr][ch],0,sizeof(III_scalefac_t));
-
- /******************************************************************
- *
- * long block scalefacs
- *
- ******************************************************************/
+ do {
+
+ memset(scalefac,0,sizeof(int)*SFB_NUM_MAX);
+
maxover0=0;
maxover1=0;
- maxover0p=0;
- maxover1p=0;
- for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
- maxover0 = Max(maxover0,(vbrmax - vbrsf.l[sfb]) - 2*max_range_long[sfb] );
- maxover0p = Max(maxover0,(vbrmax - vbrsf.l[sfb]) - 2*(max_range_long[sfb]+pretab[sfb]) );
- maxover1 = Max(maxover1,(vbrmax - vbrsf.l[sfb]) - 4*max_range_long[sfb] );
- maxover1p = Max(maxover1,(vbrmax - vbrsf.l[sfb]) - 4*(max_range_long[sfb]+pretab[sfb]));
+ for ( sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++ ) {
+ maxover0 = max(maxover0,(vbrmax - vbrsf[sfb]) - 2*/*max_range[sfb]*/10 );
+ maxover1 = max(maxover1,(vbrmax - vbrsf[sfb]) - 4*/*max_range[sfb]*/10 );
}
- mover = Min(maxover0,maxover0p);
+ mover = maxover0;
vbrmax -= mover;
maxover0 -= mover;
- maxover0p -= mover;
maxover1 -= mover;
- maxover1p -= mover;
-
+#if 0
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 {
- fprintf(stderr,"error vbrquantize.c...\n");
- exit(1);
}
+#endif
- /* sf = (cod_info->global_gain-210.0) */
- cod_info->global_gain = vbrmax +210;
- if (cod_info->global_gain>255) cod_info->global_gain=255;
+ quantInfo->common_scalefac = vbrmax +210;
+// assert(cod_info->global_gain < 256);
+ if (quantInfo->common_scalefac>255) quantInfo->common_scalefac = 255;
+
- for ( sfb = 0; sfb < SBPSY_l; sfb++ )
- vbrsf.l[sfb] -= vbrmax;
+ for ( sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++ )
+ vbrsf[sfb] -= vbrmax;
- maxover=compute_scalefacs_long(vbrsf.l,cod_info,scalefac[gr][ch].l);
- assert(maxover <=0);
+ maxover = compute_scalefacs(quantInfo,vbrsf,scalefac);
+// assert(maxover <=0);
/* quantize xr34[] based on computed scalefactors */
- ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4;
- for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
+ ifqstep = 2;
+ for ( sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++ ) {
int ifac;
double fac;
- ifac = ifqstep*scalefac[gr][ch].l[sfb];
- if (cod_info->preflag)
- ifac += ifqstep*pretab[sfb];
+ ifac = ifqstep*scalefac[sfb];
+// if (cod_info->preflag)
+// ifac += ifqstep*pretab[sfb];
- if (ifac+210<Q_MAX)
- fac = 1/IPOW20(ifac+210);
- else
+// if (ifac+210<330)
+// fac = 1/pow(2.0,-((double)ifac)*.1875);
+// else
fac = pow(2.0,.75*ifac/4.0);
- start = gfc->scalefac_band.l[ sfb ];
- end = gfc->scalefac_band.l[ sfb+1 ];
+ start = quantInfo->sfb_offset[sfb];
+ end = quantInfo->sfb_offset[sfb+1];
for ( l = start; l < end; l++ ) {
xr34[l]*=fac;
}
- }
-
- VBR_quantize_granule(gfp,xr,xr34,l3_enc,ratio,l3_xmin,scalefac,gr,ch);
+ }
- if (cod_info->part2_3_length < minbits) {
+ bits_used = VBR_quantize_granule(quantInfo, xr34, quant);
+
+
+ if (bits_used < minbits) {
/* decrease global gain, recompute scale factors */
- if (*ath_over==0) break;
- if (cod_info->part2_3_length-cod_info->part2_length== 0) break;
+// if (digital_silence) break;
if (vbrmax+210 ==0 ) break;
-
- --vbrmax;
- --global_gain_adjust;
- memcpy(&vbrsf,&save_sf,sizeof(III_scalefac_t));
- for(i=0;i<576;i++) {
- double temp=fabs(xr[i]);
- xr34[i]=sqrt(sqrt(temp)*temp);
- }
+
+
+ --vbrmax;
+ memcpy(&vbrsf,&save_sf,sizeof(int)*SFB_NUM_MAX);
+ memcpy(xr34, xr34orig, sizeof(xr34));
}
- } while ((cod_info->part2_3_length < minbits));
+ } while ((bits_used < minbits));
- while (cod_info->part2_3_length > Min(maxbits,4095)) {
+
+ while (bits_used > min(maxbits,4095)) {
/* increase global gain, keep exisiting scale factors */
- ++cod_info->global_gain;
- VBR_quantize_granule(gfp,xr,xr34,l3_enc,ratio,l3_xmin,scalefac,gr,ch);
- ++global_gain_adjust;
+ ++quantInfo->common_scalefac;
+ bits_used = VBR_quantize_granule(quantInfo, xr34, quant);
}
- return global_gain_adjust;
+ return bits_used;
}
-int tf_encode_spectrum_aac(
+int calc_xmin(AACQuantInfo* quantInfo, double xr[1024], double ratio[MAX_SCFAC_BANDS],
+ double allowed_dist[MAX_SCFAC_BANDS], double masking_lower)
+{
+ int start, end, bw,l,ath_over=0;
+ int sfb;
+ double en0, ener;
+
+ for ( sfb = 0; sfb < quantInfo->nr_of_sfb; sfb++ ){
+ start = quantInfo->sfb_offset[sfb];
+ end = quantInfo->sfb_offset[sfb+1];
+ bw = end - start;
+
+ for (en0 = 0.0, l = start; l < end; l++ ) {
+ ener = xr[l] * xr[l];
+ en0 += ener;
+ }
+ en0 /= bw;
+
+ allowed_dist[sfb] = en0 * ratio[sfb] * masking_lower / en0;
+ }
+
+ return 0;
+}
+
+int tf_encode_spectrum_aac_VBR(
double *p_spectrum[MAX_TIME_CHANNELS],
double *PsySigMaskRatio[MAX_TIME_CHANNELS],
double allowed_dist[MAX_TIME_CHANNELS][MAX_SCFAC_BANDS],
@@ -1190,12 +1338,9 @@
)
{
int quant[NUM_COEFF];
- int s_quant[NUM_COEFF];
int i;
int k;
double max_dct_line = 0;
- int store_common_scalefac;
- int best_scale_factor[SFB_NUM_MAX];
double pow_spectrum[NUM_COEFF];
double requant[NUM_COEFF];
int sb;
@@ -1205,15 +1350,12 @@
int *ptr_book_vector;
/* Set up local pointers to quantInfo elements for convenience */
- int* sfb_offset = quantInfo -> sfb_offset;
- int* scale_factor = quantInfo -> scale_factor;
+ int* sfb_offset = quantInfo->sfb_offset;
+ int* scale_factor = quantInfo->scale_factor;
int* common_scalefac = &(quantInfo -> common_scalefac);
- int outer_loop_count, notdone;
- int over, better;
+ int outer_loop_count;
int best_over = 100;
- int best_common_scalefac;
- double noise_thresh;
double sfQuantFac;
double over_noise, tot_noise, max_noise;
double noise[SFB_NUM_MAX];
@@ -1221,6 +1363,14 @@
double best_over_noise = 0;
double best_tot_noise = 0;
+ int max_bits = 3 * average_block_bits;
+ int min_bits = average_block_bits / 1;
+ int totbits, bits_ok;
+ double masking_lower_db = 0;
+ double masking_lower = 0;
+ double qadjust = 0;
+ int used_bits;
+
/* Set block type in quantization info */
quantInfo -> block_type = block_type[MONO_CHAN];
@@ -1328,11 +1478,6 @@
}
}
- /* Compute allowed distortion */
- for(sb = 0; sb < quantInfo->nr_of_sfb; sb++) {
- allowed_dist[MONO_CHAN][sb] = energy[MONO_CHAN][sb] * SigMaskRatio[sb];
- }
-
/** find the maximum spectral coefficient **/
/* Bug fix, 3/10/98 CL */
/* for(i=0; i<NUM_COEFF; i++){ */
@@ -1353,53 +1498,47 @@
}
outer_loop_count = 0;
- max_bits = average_block_bits + 1;
+ used_bits = max_bits + 1;
+ calc_xmin(quantInfo, p_spectrum[0], SigMaskRatio, allowed_dist[0],
+ masking_lower);
+
do {
- int adjusted,shortblock;
+ int shortblock;
totbits=0;
/* ENCODE this data first pass, and on future passes unless it uses
* a very small percentage of the max_frame_bits */
- if (max_bits > average_block_bits) {
+ if (used_bits > max_bits) {
shortblock = (quantInfo->block_type == ONLY_SHORT_WINDOW);
- /* Adjust allowed masking based on quality setting */
- masking_lower_db = dbQ[0] + qadjust;
+ if (qadjust!=0 /*|| shortblock*/) {
+ /* Adjust allowed masking based on quality setting */
+ masking_lower_db = /*dbQ[0]*/0 + qadjust;
-// if (pe[gr][ch]>750)
-// masking_lower_db -= 4*(pe[gr][ch]-750.)/750.;
+// if (pe[gr][ch]>750)
+// masking_lower_db -= 4*(pe[gr][ch]-750.)/750.;
- masking_lower = pow(10.0,masking_lower_db/10);
- adjusted = VBR_noise_shaping (quantInfo, p_spectrum[0], p_ratio[0], quant,
- average_block_bits, &max_bits);
+ masking_lower = pow(10.0,masking_lower_db/10);
+ calc_xmin(quantInfo, p_spectrum[0], SigMaskRatio, allowed_dist[0],
+ masking_lower);
+ }
+
+ used_bits = VBR_noise_shaping(quantInfo, p_spectrum[0], pow_spectrum,
+ allowed_dist[0], quant, min_bits, max_bits, scale_factor);
}
bits_ok=1;
- if (max_bits > average_block_bits) {
- qadjust += Max(.25,(max_bits - average_block_bits)/300.0);
+ if (used_bits > max_bits) {
+ qadjust += max(.25,(used_bits - max_bits)/300.0);
+ min_bits = max(125,min_bits*0.975);
+ max_bits = max(min_bits,max_bits*0.975);
bits_ok=0;
}
} while (!bits_ok);
- if (max_dct_line > 0) {
- *common_scalefac = best_common_scalefac;
- for (sb = 0; sb < quantInfo->nr_of_sfb; sb++) {
- scale_factor[sb] = best_scale_factor[sb];
- }
- for (i = 0; i < 1024; i++)
- quant[i] = s_quant[i]*sign[i];
- } else {
- *common_scalefac = 0;
- for (sb = 0; sb < quantInfo->nr_of_sfb; sb++) {
- scale_factor[sb] = 0;
- }
- for (i = 0; i < 1024; i++)
- quant[i] = 0;
- }
-
calc_noise(quantInfo, p_spectrum[0], quant, requant, noise, allowed_dist[0],
&over_noise, &tot_noise, &max_noise);
count_bits(quantInfo, quant);
@@ -1447,809 +1586,3 @@
return FNO_ERROR;
}
#endif
-#if 0
-
-
-
-/*
- * MP3 quantization
- *
- * Copyright (c) 1999 Mark Taylor
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-
-#if (defined(__GNUC__) && defined(__i386__))
-#define USE_GNUC_ASM
-#endif
-#ifdef _MSC_VER
-#define USE_MSC_ASM
-#endif
-
-
-
-/*********************************************************************
- * XRPOW_FTOI is a macro to convert floats to ints.
- * if XRPOW_FTOI(x) = nearest_int(x), then QUANTFAC(x)=adj43asm[x]
- * ROUNDFAC= -0.0946
- *
- * if XRPOW_FTOI(x) = floor(x), then QUANTFAC(x)=asj43[x]
- * ROUNDFAC=0.4054
- *********************************************************************/
-#ifdef USE_GNUC_ASM
-# define QUANTFAC(rx) adj43asm[rx]
-# define ROUNDFAC -0.0946
-# define XRPOW_FTOI(src, dest) \
- asm ("fistpl %0 " : "=m"(dest) : "t"(src) : "st")
-#elif defined (USE_MSC_ASM)
-# define QUANTFAC(rx) adj43asm[rx]
-# define ROUNDFAC -0.0946
-# define XRPOW_FTOI(src, dest) do { \
- double src_ = (src); \
- int dest_; \
- { \
- __asm fld src_ \
- __asm fistp dest_ \
- } \
- (dest) = dest_; \
- } while (0)
-#else
-# define QUANTFAC(rx) adj43[rx]
-# define ROUNDFAC 0.4054
-# define XRPOW_FTOI(src,dest) ((dest) = (int)(src))
-#endif
-
-
-
-
-
-
-double calc_sfb_noise(double *xr, double *xr34, int stride, int bw, int sf)
-{
- int j;
- double xfsf=0;
- double sfpow,sfpow34;
-
- sfpow = pow(2.0, sf+210); /*pow(2.0,sf/4.0); */
- sfpow34 = IPOW20(sf+210); /*pow(sfpow,-3.0/4.0);*/
-
- for ( j=0; j < stride*bw ; j += stride) {
- int ix;
- double temp;
-
- if (xr34[j]*sfpow34 > IXMAX_VAL) return -1;
-
- temp = xr34[j]*sfpow34;
- XRPOW_FTOI(temp, ix);
- XRPOW_FTOI(temp + QUANTFAC(ix), ix);
- temp = fabs(xr[j])- pow43[ix]*sfpow;
- temp *= temp;
-
- xfsf += temp;
- }
- return xfsf/bw;
-}
-
-
-
-
-
-double calc_sfb_noise_ave(double *xr, double *xr34, int stride, int bw,int sf)
-{
- int j;
- double xfsf=0, xfsf_p1=0, xfsf_m1=0;
- double sfpow34,sfpow34_p1,sfpow34_m1;
- double sfpow,sfpow_p1,sfpow_m1;
-
- sfpow = POW20(sf+210); /*pow(2.0,sf/4.0); */
- sfpow34 = IPOW20(sf+210); /*pow(sfpow,-3.0/4.0);*/
-
- sfpow_m1 = sfpow*.8408964153; /* pow(2,(sf-1)/4.0) */
- sfpow34_m1 = sfpow34*1.13878863476; /* .84089 ^ -3/4 */
-
- sfpow_p1 = sfpow*1.189207115;
- sfpow34_p1 = sfpow34*0.878126080187;
-
- for ( j=0; j < stride*bw ; j += stride) {
- int ix;
- double temp,temp_p1,temp_m1;
-
- if (xr34[j]*sfpow34_m1 > IXMAX_VAL) return -1;
-
- temp = xr34[j]*sfpow34;
- XRPOW_FTOI(temp, ix);
- XRPOW_FTOI(temp + QUANTFAC(ix), ix);
- temp = fabs(xr[j])- pow43[ix]*sfpow;
- temp *= temp;
-
- temp_p1 = xr34[j]*sfpow34_p1;
- XRPOW_FTOI(temp_p1, ix);
- XRPOW_FTOI(temp_p1 + QUANTFAC(ix), ix);
- temp_p1 = fabs(xr[j])- pow43[ix]*sfpow_p1;
- temp_p1 *= temp_p1;
-
- temp_m1 = xr34[j]*sfpow34_m1;
- XRPOW_FTOI(temp_m1, ix);
- XRPOW_FTOI(temp_m1 + QUANTFAC(ix), ix);
- temp_m1 = fabs(xr[j])- pow43[ix]*sfpow_m1;
- temp_m1 *= temp_m1;
-
- xfsf += temp;
- xfsf_p1 += temp_p1;
- xfsf_m1 += temp_m1;
- }
- if (xfsf_p1>xfsf) xfsf = xfsf_p1;
- if (xfsf_m1>xfsf) xfsf = xfsf_m1;
- return xfsf/bw;
-}
-
-
-
-int find_scalefac(double *xr,double *xr34,int stride,int sfb,
- double l3_xmin,int bw)
-{
- double xfsf;
- int i,sf,sf_ok,delsf;
-
- /* search will range from sf: -209 -> 45 */
- sf = -82;
- delsf = 128;
-
- sf_ok=10000;
- for (i=0; i<7; i++) {
- delsf /= 2;
- // xfsf = calc_sfb_noise(xr,xr34,stride,bw,sf);
- xfsf = calc_sfb_noise_ave(xr,xr34,stride,bw,sf);
-
- if (xfsf < 0) {
- /* scalefactors too small */
- sf += delsf;
- }else{
- if (sf_ok==10000) sf_ok=sf;
- if (xfsf > l3_xmin) {
- /* distortion. try a smaller scalefactor */
- sf -= delsf;
- }else{
- sf_ok = sf;
- sf += delsf;
- }
- }
- }
- assert(sf_ok!=10000);
- // assert(delsf==1); /* when for loop goes up to 7 */
-
- return sf;
-}
-
-
-
-/*
- sfb=0..5 scalefac < 16
- sfb>5 scalefac < 8
-
- ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4;
- ol_sf = (cod_info->global_gain-210.0);
- ol_sf -= 8*cod_info->subblock_gain[i];
- ol_sf -= ifqstep*scalefac[gr][ch].s[sfb][i];
-
-*/
-int compute_scalefacs_short(int sf[SBPSY_s][3],gr_info *cod_info,
-int scalefac[SBPSY_s][3],unsigned int sbg[3])
-{
- int maxrange,maxrange1,maxrange2,maxover;
- int sfb,i;
- int ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4;
-
- maxover=0;
- maxrange1 = 15;
- maxrange2 = 7;
-
-
- for (i=0; i<3; ++i) {
- int maxsf1=0,maxsf2=0,minsf=1000;
- /* see if we should use subblock gain */
- for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
- if (sfb < 6) {
- if (-sf[sfb][i]>maxsf1) maxsf1 = -sf[sfb][i];
- } else {
- if (-sf[sfb][i]>maxsf2) maxsf2 = -sf[sfb][i];
- }
- if (-sf[sfb][i]<minsf) minsf = -sf[sfb][i];
- }
-
- /* boost subblock gain as little as possible so we can
- * reach maxsf1 with scalefactors
- * 8*sbg >= maxsf1
- */
- maxsf1 = Max(maxsf1-maxrange1*ifqstep,maxsf2-maxrange2*ifqstep);
- sbg[i]=0;
- if (minsf >0 ) sbg[i] = floor(.125*minsf + .001);
- if (maxsf1 > 0) sbg[i] = Max(sbg[i],maxsf1/8 + (maxsf1 % 8 != 0));
- if (sbg[i] > 7) sbg[i]=7;
-
-
- for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
- sf[sfb][i] += 8*sbg[i];
-
- if (sf[sfb][i] < 0) {
- maxrange = sfb < 6 ? maxrange1 : maxrange2;
- scalefac[sfb][i]=-sf[sfb][i]/ifqstep + (-sf[sfb][i]%ifqstep != 0);
- if (scalefac[sfb][i]>maxrange) scalefac[sfb][i]=maxrange;
-
- if (-(sf[sfb][i] + scalefac[sfb][i]*ifqstep) >maxover) {
- maxover=-(sf[sfb][i] + scalefac[sfb][i]*ifqstep);
- }
- }
- }
- }
-
- return maxover;
-}
-
-
-
-
-
-int max_range_short[SBPSY_s]=
-{15, 15, 15, 15, 15, 15 , 7, 7, 7, 7, 7, 7 };
-int max_range_long[SBPSY_l]=
-{15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
-
-
-/*
- ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4;
- ol_sf = (cod_info->global_gain-210.0);
- ol_sf -= ifqstep*scalefac[gr][ch].l[sfb];
- if (cod_info->preflag && sfb>=11)
- ol_sf -= ifqstep*pretab[sfb];
-*/
-int compute_scalefacs_long(int sf[SBPSY_l],gr_info *cod_info,int scalefac[SBPSY_l])
-{
- int sfb;
- int maxover;
- int ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4;
-
-
- if (cod_info->preflag)
- for ( sfb = 11; sfb < SBPSY_l; sfb++ )
- sf[sfb] += pretab[sfb]*ifqstep;
-
-
- maxover=0;
- for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
-
- if (sf[sfb]<0) {
- /* ifqstep*scalefac >= -sf[sfb], so round UP */
- scalefac[sfb]=-sf[sfb]/ifqstep + (-sf[sfb] % ifqstep != 0);
- if (scalefac[sfb] > max_range_long[sfb]) scalefac[sfb]=max_range_long[sfb];
-
- /* sf[sfb] should now be positive: */
- if ( -(sf[sfb] + scalefac[sfb]*ifqstep) > maxover) {
- maxover = -(sf[sfb] + scalefac[sfb]*ifqstep);
- }
- }
- }
-
- return maxover;
-}
-
-
-
-
-
-
-
-
-/************************************************************************
- *
- * quantize and encode with the given scalefacs and global gain
- *
- * compute scalefactors, l3_enc, and return number of bits needed to encode
- *
- *
- ************************************************************************/
-void
-VBR_quantize_granule(lame_global_flags *gfp,
- double xr[576],
- double xr34[576], int l3_enc[2][2][576],
- III_psy_ratio *ratio, III_psy_xmin l3_xmin,
- III_scalefac_t scalefac[2][2],int gr, int ch)
-{
- lame_internal_flags *gfc=gfp->internal_flags;
- gr_info *cod_info;
- III_side_info_t * l3_side;
- l3_side = &gfc->l3_side;
- cod_info = &l3_side->gr[gr].ch[ch].tt;
-
- /* encode scalefacs */
- if ( gfp->version == 1 )
- scale_bitcount(&scalefac[gr][ch], cod_info);
- else
- scale_bitcount_lsf(&scalefac[gr][ch], cod_info);
-
-
- /* quantize xr34 */
- cod_info->part2_3_length = count_bits(gfp,l3_enc[gr][ch],xr34,cod_info);
- cod_info->part2_3_length += cod_info->part2_length;
-
- if (gfc->use_best_huffman==1 && cod_info->block_type != SHORT_TYPE) {
- best_huffman_divide(gfc, gr, ch, cod_info, l3_enc[gr][ch]);
- }
-
- return;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/************************************************************************
- *
- * VBR_noise_shaping()
- *
- * compute scalefactors, l3_enc, and return number of bits needed to encode
- *
- * return code: 0 scalefactors were found with all noise < masking
- *
- * n>0 scalefactors required too many bits. global gain
- * was decreased by n
- * If n is large, we should probably recompute scalefacs
- * with a lower quality.
- *
- * n<0 scalefactors used less than minbits.
- * global gain was increased by n.
- * If n is large, might want to recompute scalefacs
- * with a higher quality setting?
- *
- ************************************************************************/
-int
-VBR_noise_shaping
-(
- lame_global_flags *gfp,
- double xr[576], III_psy_ratio *ratio,
- int l3_enc[2][2][576], int *ath_over, int minbits, int maxbits,
- III_scalefac_t scalefac[2][2],
- int gr,int ch)
-{
- lame_internal_flags *gfc=gfp->internal_flags;
- int start,end,bw,sfb,l, i, vbrmax;
- III_scalefac_t vbrsf;
- III_scalefac_t save_sf;
- int maxover0,maxover1,maxover0p,maxover1p,maxover,mover;
- int ifqstep;
- III_psy_xmin l3_xmin;
- III_side_info_t * l3_side;
- gr_info *cod_info;
- double xr34[576];
- int shortblock;
- int global_gain_adjust=0;
-
- l3_side = &gfc->l3_side;
- cod_info = &l3_side->gr[gr].ch[ch].tt;
- shortblock = (cod_info->block_type == SHORT_TYPE);
- *ath_over = calc_xmin( gfp,xr, ratio, cod_info, &l3_xmin);
-
-
- for(i=0;i<576;i++) {
- double temp=fabs(xr[i]);
- xr34[i]=sqrt(sqrt(temp)*temp);
- }
-
-
- vbrmax=-10000;
- if (shortblock) {
- for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
- for ( i = 0; i < 3; i++ ) {
- start = gfc->scalefac_band.s[ sfb ];
- end = gfc->scalefac_band.s[ sfb+1 ];
- bw = end - start;
- vbrsf.s[sfb][i] = find_scalefac(&xr[3*start+i],&xr34[3*start+i],3,sfb,
- l3_xmin.s[sfb][i],bw);
- if (vbrsf.s[sfb][i]>vbrmax) vbrmax=vbrsf.s[sfb][i];
- }
- }
- }else{
- int sflist[3]={-10000,-10000,-10000};
- for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
- start = gfc->scalefac_band.l[ sfb ];
- end = gfc->scalefac_band.l[ sfb+1 ];
- bw = end - start;
- vbrsf.l[sfb] = find_scalefac(&xr[start],&xr34[start],1,sfb,
- l3_xmin.l[sfb],bw);
- if (vbrsf.l[sfb]>vbrmax) vbrmax = vbrsf.l[sfb];
-
- /* code to find the 3 largest (counting duplicates) contributed
- * by Microsoft Employee #12 */
- if (vbrsf.l[sfb]>sflist[0]) {
- sflist[2]=sflist[1];
- sflist[1]=sflist[0];
- sflist[0]=vbrsf.l[sfb];
- } else if (vbrsf.l[sfb]>sflist[1]) {
- sflist[2]=sflist[1];
- sflist[1]=vbrsf.l[sfb];
- } else if (vbrsf.l[sfb]>sflist[2]) {
- sflist[2]=vbrsf.l[sfb];
- }
- }
- // vbrmax=sflist[2];
- } /* compute needed scalefactors */
-
- /* save a copy of vbrsf, incase we have to recomptue scalefacs */
- memcpy(&save_sf,&vbrsf,sizeof(III_scalefac_t));
-
-#undef SCALEFAC_SCALE
-
- do {
-
- memset(&scalefac[gr][ch],0,sizeof(III_scalefac_t));
-
- if (shortblock) {
- /******************************************************************
- *
- * short block scalefacs
- *
- ******************************************************************/
- maxover0=0;
- maxover1=0;
- for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
- for ( i = 0; i < 3; i++ ) {
- maxover0 = Max(maxover0,(vbrmax - vbrsf.s[sfb][i]) - (4*14 + 2*max_range_short[sfb]) );
- maxover1 = Max(maxover1,(vbrmax - vbrsf.s[sfb][i]) - (4*14 + 4*max_range_short[sfb]) );
- }
- }
-#ifdef SCALEFAC_SCALE
- mover = Min(maxover0,maxover1);
-#else
- mover = maxover0;
-#endif
-
- vbrmax -= mover;
- maxover0 -= mover;
- maxover1 -= mover;
-
- if (maxover0==0)
- cod_info->scalefac_scale = 0;
- else if (maxover1==0)
- cod_info->scalefac_scale = 1;
-
-
- /* sf = (cod_info->global_gain-210.0) */
- cod_info->global_gain = vbrmax +210;
- if (cod_info->global_gain>255) cod_info->global_gain=255;
-
- for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
- for ( i = 0; i < 3; i++ ) {
- vbrsf.s[sfb][i]-=vbrmax;
- }
- }
- maxover=compute_scalefacs_short(vbrsf.s,cod_info,scalefac[gr][ch].s,cod_info->subblock_gain);
- assert(maxover <=0);
- {
- /* adjust global_gain so at least 1 subblock gain = 0 */
- int minsfb=999;
- for (i=0; i<3; i++) minsfb = Min(minsfb,cod_info->subblock_gain[i]);
- minsfb = Min(cod_info->global_gain/8,minsfb);
- vbrmax -= 8*minsfb;
- cod_info->global_gain -= 8*minsfb;
- for (i=0; i<3; i++) cod_info->subblock_gain[i] -= minsfb;
- }
-
-
-
- /* quantize xr34[] based on computed scalefactors */
- ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4;
- for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
- start = gfc->scalefac_band.s[ sfb ];
- end = gfc->scalefac_band.s[ sfb+1 ];
- for (i=0; i<3; i++) {
- int ifac;
- double fac;
- ifac = (8*cod_info->subblock_gain[i]+ifqstep*scalefac[gr][ch].s[sfb][i]);
- if (ifac+210<Q_MAX)
- fac = 1/IPOW20(ifac+210);
- else
- fac = pow(2.0,.75*ifac/4.0);
- for ( l = start; l < end; l++ )
- xr34[3*l +i]*=fac;
- }
- }
-
-
-
- }else{
- /******************************************************************
- *
- * long block scalefacs
- *
- ******************************************************************/
- maxover0=0;
- maxover1=0;
- maxover0p=0;
- maxover1p=0;
-
-
- for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
- maxover0 = Max(maxover0,(vbrmax - vbrsf.l[sfb]) - 2*max_range_long[sfb] );
- maxover0p = Max(maxover0,(vbrmax - vbrsf.l[sfb]) - 2*(max_range_long[sfb]+pretab[sfb]) );
- maxover1 = Max(maxover1,(vbrmax - vbrsf.l[sfb]) - 4*max_range_long[sfb] );
- maxover1p = Max(maxover1,(vbrmax - vbrsf.l[sfb]) - 4*(max_range_long[sfb]+pretab[sfb]));
- }
- mover = Min(maxover0,maxover0p);
-#ifdef SCALEFAC_SCALE
- mover = Min(mover,maxover1);
- mover = Min(mover,maxover1p);
-#endif
-
-
- 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 {
- fprintf(stderr,"error vbrquantize.c...\n");
- exit(1);
- }
-
-
- /* sf = (cod_info->global_gain-210.0) */
- cod_info->global_gain = vbrmax +210;
- if (cod_info->global_gain>255) cod_info->global_gain=255;
-
- for ( sfb = 0; sfb < SBPSY_l; sfb++ )
- vbrsf.l[sfb] -= vbrmax;
-
-
- maxover=compute_scalefacs_long(vbrsf.l,cod_info,scalefac[gr][ch].l);
- assert(maxover <=0);
-
-
- /* quantize xr34[] based on computed scalefactors */
- ifqstep = ( cod_info->scalefac_scale == 0 ) ? 2 : 4;
- for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
- int ifac;
- double fac;
- ifac = ifqstep*scalefac[gr][ch].l[sfb];
- if (cod_info->preflag)
- ifac += ifqstep*pretab[sfb];
-
- if (ifac+210<Q_MAX)
- fac = 1/IPOW20(ifac+210);
- else
- fac = pow(2.0,.75*ifac/4.0);
-
- start = gfc->scalefac_band.l[ sfb ];
- end = gfc->scalefac_band.l[ sfb+1 ];
- for ( l = start; l < end; l++ ) {
- xr34[l]*=fac;
- }
- }
- }
-
- VBR_quantize_granule(gfp,xr,xr34,l3_enc,ratio,l3_xmin,scalefac,gr,ch);
-
- if (cod_info->part2_3_length < minbits) {
- /* decrease global gain, recompute scale factors */
- if (*ath_over==0) break;
- if (cod_info->part2_3_length-cod_info->part2_length== 0) break;
- if (vbrmax+210 ==0 ) break;
-
- // printf("not enough bits, decreasing vbrmax. g_gainv=%i\n",cod_info->global_gain);
- // printf("%i minbits=%i part2_3_length=%i part2=%i\n",
- // gfp->frameNum,minbits,cod_info->part2_3_length,cod_info->part2_length);
- --vbrmax;
- --global_gain_adjust;
- memcpy(&vbrsf,&save_sf,sizeof(III_scalefac_t));
- for(i=0;i<576;i++) {
- double temp=fabs(xr[i]);
- xr34[i]=sqrt(sqrt(temp)*temp);
- }
-
- }
-
- } while ((cod_info->part2_3_length < minbits));
-
- while (cod_info->part2_3_length > Min(maxbits,4095)) {
- /* increase global gain, keep exisiting scale factors */
- ++cod_info->global_gain;
- VBR_quantize_granule(gfp,xr,xr34,l3_enc,ratio,l3_xmin,scalefac,gr,ch);
- ++global_gain_adjust;
- }
-
- return global_gain_adjust;
-}
-
-
-
-
-void
-VBR_quantize(lame_global_flags *gfp,
- double pe[2][2], double ms_ener_ratio[2],
- double xr[2][2][576], III_psy_ratio ratio[2][2],
- int l3_enc[2][2][576],
- III_scalefac_t scalefac[2][2])
-{
- lame_internal_flags *gfc=gfp->internal_flags;
- int minbits,maxbits,max_frame_bits,totbits,gr,ch,i,bits_ok;
- int bitsPerFrame,mean_bits;
- double qadjust;
- III_side_info_t * l3_side;
- gr_info *cod_info;
- int ath_over[2][2];
- double masking_lower_db;
- // static const double dbQ[10]={-6.0,-5.0,-4.0,-3.0, -2.0, -1.0, -.25, .5, 1.25, 2.0};
- /* from quantize.c VBR algorithm */
- static const double dbQ[10]={-5.0,-3.75,-2.5,-1.25, 0, 0.4, 0.8, 1.2, 1.6,2.0};
-
- qadjust=-1; /* start with -1 db quality improvement over quantize.c VBR */
-
-
- ATH_lower = (4 - VBR_q) * 4.0;
- if (ATH_lower < 0) ATH_lower=0;
- iteration_init(gfp,l3_side,l3_enc);
-
- gfc->bitrate_index=gfc->VBR_min_bitrate;
- getframebits(gfp,&bitsPerFrame, &mean_bits);
- minbits = .4*(mean_bits/numChannel);
-
- gfc->bitrate_index=gfc->VBR_max_bitrate;
- getframebits(gfp,&bitsPerFrame, &mean_bits);
- max_frame_bits = ResvFrameBegin(gfp,l3_side, mean_bits, bitsPerFrame);
- maxbits=2.5*(mean_bits/numChannel);
-
- {
- /* compute a target mean_bits based on compression ratio
- * which was set based on VBR_q
- */
- int bit_rate = gfp->out_samplerate*16*numChannel/(1000.0*gfp->compression_ratio);
- bitsPerFrame = (bit_rate*gfp->framesize*1000)/gfp->out_samplerate;
- mean_bits = (bitsPerFrame - 8*gfc->sideinfo_len) / gfc->mode_gr;
- }
-
- minbits=Max(minbits,.4*(mean_bits/numChannel));
- maxbits=Min(maxbits,2.5*(mean_bits/numChannel));
-
- for (gr = 0; gr < gfc->mode_gr; gr++) {
- for (ch = 0; ch < gfc->stereo; ch++) {
- cod_info->part2_3_length=LARGE_BITS;
- }
- }
-
-
-
- /*
- * loop over all ch,gr, encoding anything with bits > .5*(max_frame_bits/4)
- *
- * If a particular granule uses way too many bits, it will be re-encoded
- * on the next iteration of the loop (with a lower quality setting).
- * But granules which dont use
- * use too many bits will not be re-encoded.
- *
- * minbits: minimum allowed bits for 1 granule 1 channel
- * maxbits: maximum allowwed bits for 1 granule 1 channel
- * max_frame_bits: maximum allowed bits for entire frame
- * (max_frame_bits/4) estimate of average bits per granule per channel
- *
- */
-
- do {
-
- totbits=0;
- for (gr = 0; gr < gfc->mode_gr; gr++) {
- for (ch = 0; ch < numChannel; ch++) {
- int adjusted,shortblock;
-
- /* ENCODE this data first pass, and on future passes unless it uses
- * a very small percentage of the max_frame_bits */
- if (cod_info->part2_3_length > (max_frame_bits/(2*gfc->stereo))) {
-
- shortblock = (quantInfo->block_type == ONLY_SHORT_WINDOW);
-
- /* Adjust allowed masking based on quality setting */
- masking_lower_db = dbQ[gfp->VBR_q] + qadjust;
-
-// if (pe[gr][ch]>750)
-// masking_lower_db -= 4*(pe[gr][ch]-750.)/750.;
-
- gfc->masking_lower = pow(10.0,masking_lower_db/10);
- adjusted = VBR_noise_shaping (gfp,xr[gr][ch],&ratio[gr][ch],l3_enc,&ath_over[gr][ch],minbits,maxbits,scalefac,gr,ch);
- }
- totbits += cod_info->part2_3_length;
- }
- }
- bits_ok=1;
- if (totbits>max_frame_bits) {
- qadjust += Max(.25,(totbits-max_frame_bits)/300.0);
- bits_ok=0;
- }
-
- } while (!bits_ok);
-
-
- /* find optimal scalefac storage. Cant be done above because
- * might enable scfsi which breaks the interation loops */
- totbits=0;
- for (gr = 0; gr < gfc->mode_gr; gr++) {
- for (ch = 0; ch < gfc->stereo; ch++) {
- best_scalefac_store(gfp,gr, ch, l3_enc, l3_side, scalefac);
- totbits += l3_side->gr[gr].ch[ch].tt.part2_3_length;
- }
- }
-
-
- for( gfc->bitrate_index = (gfp->VBR_hard_min ? gfc->VBR_min_bitrate : 1);
- gfc->bitrate_index < gfc->VBR_max_bitrate;
- gfc->bitrate_index++ ) {
-
- getframebits (gfp,&bitsPerFrame, &mean_bits);
- maxbits = ResvFrameBegin(gfp,l3_side, mean_bits, bitsPerFrame);
- if (totbits <= maxbits) break;
- }
- if (gfc->bitrate_index == gfc->VBR_max_bitrate) {
- getframebits (gfp,&bitsPerFrame, &mean_bits);
- maxbits = ResvFrameBegin(gfp,l3_side, mean_bits, bitsPerFrame);
- }
-
- // printf("%i total_bits=%i max_frame_bits=%i index=%i \n",gfp->frameNum,totbits,max_frame_bits,gfc->bitrate_index);
-
- for (gr = 0; gr < gfc->mode_gr; gr++) {
- for (ch = 0; ch < gfc->stereo; ch++) {
- cod_info = &l3_side->gr[gr].ch[ch].tt;
-
-
- ResvAdjust (gfp,cod_info, l3_side, mean_bits);
-
- /*******************************************************************
- * set the sign of l3_enc from the sign of xr
- *******************************************************************/
- for ( i = 0; i < 576; i++) {
- if (xr[gr][ch][i] < 0) l3_enc[gr][ch][i] *= -1;
- }
- }
- }
- ResvFrameEnd (gfp,l3_side, mean_bits);
-}
-
-#endif
\ No newline at end of file