quantize.c
资源名称:NETVIDEO.rar [点击查看]
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:36k
源码类别:
流媒体/Mpeg4/MP4
开发平台:
Visual C++
- #define MAXNOISEXX
- /*
- * 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.
- */
- #include <assert.h>
- #include "util.h"
- #include "l3side.h"
- #include "quantize.h"
- #include "l3bitstream.h"
- #include "reservoir.h"
- #include "quantize-pvt.h"
- #ifdef HAVEGTK
- #include "gtkanal.h"
- #endif
- #ifdef HAVEGTK
- /************************************************************************/
- /* updates plotting data */
- /************************************************************************/
- void
- set_pinfo (
- gr_info *cod_info,
- III_psy_ratio *ratio,
- III_scalefac_t *scalefac,
- FLOAT8 xr[576],
- FLOAT8 xfsf[4][SBPSY_l],
- FLOAT8 noise[4],
- int gr,
- int ch
- )
- {
- int sfb;
- FLOAT ifqstep;
- int i,l,start,end,bw;
- FLOAT8 en0;
- D192_3 *xr_s = (D192_3 *)xr;
- ifqstep = ( cod_info->scalefac_scale == 0 ) ? .5 : 1.0;
- if (cod_info->block_type == SHORT_TYPE) {
- for ( i = 0; i < 3; i++ ) {
- for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
- start = scalefac_band.s[ sfb ];
- end = scalefac_band.s[ sfb + 1 ];
- bw = end - start;
- for ( en0 = 0.0, l = start; l < end; l++ )
- en0 += (*xr_s)[l][i] * (*xr_s)[l][i];
- en0=Max(en0/bw,1e-20);
- /* conversion to FFT units */
- en0 = ratio->en.s[sfb][i]/en0;
- pinfo->xfsf_s[gr][ch][3*sfb+i] = xfsf[i+1][sfb]*en0;
- pinfo->thr_s[gr][ch][3*sfb+i] = ratio->thm.s[sfb][i];
- pinfo->en_s[gr][ch][3*sfb+i] = ratio->en.s[sfb][i];
- pinfo->LAMEsfb_s[gr][ch][3*sfb+i]=
- -2*cod_info->subblock_gain[i]-ifqstep*scalefac->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;
- for ( en0 = 0.0, l = start; l < end; l++ )
- en0 += xr[l] * xr[l];
- en0=Max(en0/bw,1e-20);
- /*
- printf("diff = %f n",10*log10(Max(ratio[gr][ch].en.l[sfb],1e-20))
- -(10*log10(en0)+150));
- */
- /* convert to FFT units */
- en0 = ratio->en.l[sfb]/en0;
- pinfo->xfsf[gr][ch][sfb] = xfsf[0][sfb]*en0;
- pinfo->thr[gr][ch][sfb] = ratio->thm.l[sfb];
- pinfo->en[gr][ch][sfb] = ratio->en.l[sfb];
- pinfo->LAMEsfb[gr][ch][sfb]=-ifqstep*scalefac->l[sfb];
- if (cod_info->preflag && sfb>=11)
- pinfo->LAMEsfb[gr][ch][sfb]-=ifqstep*pretab[sfb];
- }
- }
- pinfo->LAMEqss[gr][ch] = cod_info->global_gain;
- pinfo->LAMEmainbits[gr][ch] = cod_info->part2_3_length;
- pinfo->over [gr][ch] = noise[0];
- pinfo->max_noise [gr][ch] = noise[1];
- pinfo->over_noise[gr][ch] = noise[2];
- pinfo->tot_noise [gr][ch] = noise[3];
- }
- #endif
- /************************************************************************/
- /* iteration_loop() */
- /************************************************************************/
- void
- iteration_loop( 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])
- {
- FLOAT8 xfsf[4][SBPSY_l];
- FLOAT8 noise[4]; /* over,max_noise,over_noise,tot_noise; */
- III_psy_xmin l3_xmin[2];
- gr_info *cod_info;
- int bitsPerFrame;
- int mean_bits;
- int ch, gr, i, bit_rate;
- iteration_init(gfp,l3_side,l3_enc);
- bit_rate = bitrate_table[gfp->version][gfp->bitrate_index];
- getframebits(gfp,&bitsPerFrame, &mean_bits);
- ResvFrameBegin(gfp, l3_side, mean_bits, bitsPerFrame );
- /* quantize! */
- for ( gr = 0; gr < gfp->mode_gr; gr++ ) {
- int targ_bits[2];
- if (convert_mdct)
- ms_convert(xr[gr], xr[gr]);
- on_pe(gfp,pe,l3_side,targ_bits,mean_bits, gr);
- #ifdef RH_SIDE_CBR
- #else
- if (reduce_sidechannel)
- reduce_side(targ_bits,ms_ener_ratio[gr],mean_bits);
- #endif
- for (ch=0 ; ch < gfp->stereo ; ch ++) {
- cod_info = &l3_side->gr[gr].ch[ch].tt;
- if (!init_outer_loop(gfp,xr[gr][ch], cod_info))
- {
- /* xr contains no energy
- * cod_info was set in init_outer_loop above
- */
- memset(&scalefac[gr][ch],0,sizeof(III_scalefac_t));
- memset(l3_enc[gr][ch],0,576*sizeof(int));
- noise[0]=noise[1]=noise[2]=noise[3]=0;
- }
- else
- {
- calc_xmin(gfp,xr[gr][ch], &ratio[gr][ch], cod_info, &l3_xmin[ch]);
- outer_loop( gfp,xr[gr][ch], targ_bits[ch], noise,
- &l3_xmin[ch], l3_enc[gr][ch],
- &scalefac[gr][ch], cod_info, xfsf, ch);
- }
- best_scalefac_store(gfp,gr, ch, l3_enc, l3_side, scalefac);
- if (gfp->use_best_huffman==1 && cod_info->block_type == NORM_TYPE) {
- best_huffman_divide(gr, ch, cod_info, l3_enc[gr][ch]);
- }
- #ifdef HAVEGTK
- if (gfp->gtkflag)
- set_pinfo (cod_info, &ratio[gr][ch], &scalefac[gr][ch], xr[gr][ch], xfsf, noise, gr, ch);
- #endif
- /*#define NORES_TEST */
- #ifndef NORES_TEST
- ResvAdjust(gfp,cod_info, l3_side, mean_bits );
- #endif
- /* set the sign of l3_enc */
- for ( i = 0; i < 576; i++) {
- if (xr[gr][ch][i] < 0)
- l3_enc[gr][ch][i] *= -1;
- }
- }
- } /* loop over gr */
- #ifdef NORES_TEST
- /* replace ResvAdjust above with this code if you do not want
- the second granule to use bits saved by the first granule.
- when combined with --nores, this is usefull for testing only */
- for ( gr = 0; gr < gfp->mode_gr; gr++ ) {
- for ( ch = 0; ch < gfp->stereo; ch++ ) {
- cod_info = &l3_side->gr[gr].ch[ch].tt;
- ResvAdjust(gfp, cod_info, l3_side, mean_bits );
- }
- }
- #endif
- ResvFrameEnd(gfp,l3_side, mean_bits );
- }
- void
- set_masking_lower (int VBR_q,int nbits)
- {
- FLOAT masking_lower_db, adjust;
- /* quality setting */
- /* Adjust allowed masking based on quality setting */
- #ifdef RH_QUALITY_CONTROL
- /* - lower masking depending on Quality setting
- * - quality control together with adjusted ATH MDCT scaling
- * on lower quality setting allocate more noise from
- * ATH masking, and on higher quality setting allocate
- * less noise from ATH masking.
- * - experiments show that going more than 2dB over GPSYCHO's
- * limits ends up in very annoying artefacts
- */
- static FLOAT dbQ[10]={-6.0,-4.5,-3.0,-1.5,0,0.3,0.6,1.0,1.5,2.0};
- assert( VBR_q <= 9 );
- assert( VBR_q >= 0 );
- masking_lower_db = dbQ[VBR_q];
- adjust = 0;
- #else
- /* masking_lower varies from -8 to +10 db */
- masking_lower_db = -6 + 2*VBR_q;
- /* adjust by -6(min)..0(max) depending on bitrate */
- adjust = (nbits-125)/(2500.0-125.0);
- adjust = 4*(adjust-1);
- #endif
- masking_lower_db += adjust;
- masking_lower = pow(10.0,masking_lower_db/10);
- }
- /************************************************************************
- *
- * VBR_iteration_loop()
- *
- * tries to find out how many bits are needed for each granule and channel
- * to get an acceptable quantization. An appropriate bitrate will then be
- * choosed for quantization. rh 8/99
- *
- ************************************************************************/
- void
- VBR_iteration_loop (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])
- {
- #ifdef HAVEGTK
- plotting_data bst_pinfo;
- #endif
- gr_info bst_cod_info, clean_cod_info;
- III_scalefac_t bst_scalefac;
- int bst_l3_enc[576];
- III_psy_xmin l3_xmin;
- gr_info *cod_info = NULL;
- int save_bits[2][2];
- FLOAT8 noise[4]; /* over,max_noise,over_noise,tot_noise; */
- FLOAT8 targ_noise[4]; /* over,max_noise,over_noise,tot_noise; */
- FLOAT8 xfsf[4][SBPSY_l];
- int this_bits, dbits;
- int used_bits=0;
- int min_bits,max_bits,min_mean_bits=0;
- int frameBits[15];
- int bitsPerFrame;
- int bits;
- int mean_bits;
- int i,ch, gr, analog_silence;
- int reparted = 0;
- iteration_init(gfp,l3_side,l3_enc);
- #ifdef RH_QUALITY_CONTROL
- /* with RH_QUALITY_CONTROL we have to set masking_lower only once */
- set_masking_lower(gfp->VBR_q, 0 );
- #endif
- /*******************************************************************
- * how many bits are available for each bitrate?
- *******************************************************************/
- for( gfp->bitrate_index = 1;
- gfp->bitrate_index <= gfp->VBR_max_bitrate;
- gfp->bitrate_index++ ) {
- getframebits (gfp,&bitsPerFrame, &mean_bits);
- if (gfp->bitrate_index == gfp->VBR_min_bitrate) {
- /* always use at least this many bits per granule per channel */
- /* unless we detect analog silence, see below */
- min_mean_bits=mean_bits/gfp->stereo;
- }
- frameBits[gfp->bitrate_index]=
- ResvFrameBegin (gfp,l3_side, mean_bits, bitsPerFrame);
- }
- gfp->bitrate_index=gfp->VBR_max_bitrate;
- /*******************************************************************
- * how many bits would we use of it?
- *******************************************************************/
- analog_silence=0;
- for (gr = 0; gr < gfp->mode_gr; gr++) {
- int num_chan=gfp->stereo;
- #ifdef RH_SIDE_VBR
- /* my experiences are, that side channel reduction
- * does more harm than good when VBR encoding
- * (Robert.Hegemann@gmx.de 2000-02-18)
- */
- #else
- /* determine quality based on mid channel only */
- if (reduce_sidechannel) num_chan=1;
- #endif
- /* copy data to be quantized into xr */
- if (convert_mdct)
- ms_convert(xr[gr],xr[gr]);
- for (ch = 0; ch < num_chan; ch++) {
- int real_bits;
- /******************************************************************
- * find smallest number of bits for an allowable quantization
- ******************************************************************/
- cod_info = &l3_side->gr[gr].ch[ch].tt;
- min_bits = Max(125,min_mean_bits);
- if (!init_outer_loop(gfp,xr[gr][ch], cod_info))
- {
- /* xr contains no energy
- * cod_info was set in init_outer_loop above
- */
- memset(&scalefac[gr][ch],0,sizeof(III_scalefac_t));
- memset(l3_enc[gr][ch],0,576*sizeof(int));
- save_bits[gr][ch] = 0;
- #ifdef HAVEGTK
- if (gfp->gtkflag)
- set_pinfo(cod_info, &ratio[gr][ch], &scalefac[gr][ch], xr[gr][ch], xfsf, noise, gr, ch);
- #endif
- analog_silence=1;
- continue; /* with next channel */
- }
- memcpy( &clean_cod_info, cod_info, sizeof(gr_info) );
- #ifdef RH_QUALITY_CONTROL
- /*
- * masking lower already set in the beginning
- */
- #else
- /*
- * has to be set before calculating l3_xmin
- */
- set_masking_lower( gfp->VBR_q,2500 );
- #endif
- /* check for analolg silence */
- /* if energy < ATH, set min_bits = 125 */
- if (0==calc_xmin(gfp,xr[gr][ch], &ratio[gr][ch], cod_info, &l3_xmin)) {
- analog_silence=1;
- min_bits=125;
- }
- if (cod_info->block_type==SHORT_TYPE) {
- min_bits += Max(1100,pe[gr][ch]);
- min_bits=Min(min_bits,1800);
- }
- max_bits = 1200 + frameBits[gfp->VBR_max_bitrate]/(gfp->stereo*gfp->mode_gr);
- max_bits=Min(max_bits,2500);
- max_bits=Max(max_bits,min_bits);
- dbits = (max_bits-min_bits)/4;
- this_bits = (max_bits+min_bits)/2;
- real_bits = max_bits+1;
- /* bin search to within +/- 10 bits of optimal */
- do {
- int better;
- assert(this_bits>=min_bits);
- assert(this_bits<=max_bits);
- if( this_bits >= real_bits ){
- /*
- * we already found a quantization with fewer bits
- * so we can skip this try
- */
- this_bits -= dbits;
- dbits /= 2;
- continue; /* skips the rest of this do-while loop */
- }
- /* VBR will look for a quantization which has better values
- * then those specified below.*/
- targ_noise[0]=0; /* over */
- targ_noise[1]=0; /* max_noise */
- targ_noise[2]=0; /* over_noise */
- targ_noise[3]=0; /* tot_noise */
- targ_noise[0]=Max(0,targ_noise[0]);
- targ_noise[2]=Max(0,targ_noise[2]);
- /*
- * OK, start with a fresh setting
- * - scalefac will be set up by outer_loop
- * - l3_enc will be set up by outer_loop
- * + cod_info we will restore our initialized one, see below
- */
- memcpy( cod_info, &clean_cod_info, sizeof(gr_info) );
- #ifdef RH_QUALITY_CONTROL
- /*
- * there is no need for a recalculation of l3_xmin,
- * because masking_lower did not change within this do-while
- */
- #else
- /* quality setting */
- set_masking_lower( gfp->VBR_q,this_bits );
- /*
- * compute max allowed distortion, masking lower has changed
- */
- calc_xmin(gfp,xr[gr][ch], &ratio[gr][ch], cod_info, &l3_xmin);
- #endif
- outer_loop( gfp,xr[gr][ch], this_bits, noise,
- &l3_xmin, l3_enc[gr][ch],
- &scalefac[gr][ch], cod_info, xfsf,
- ch);
- /* is quantization as good as we are looking for ? */
- better=VBR_compare((int)targ_noise[0],targ_noise[3],targ_noise[2],
- targ_noise[1],(int)noise[0],noise[3],noise[2],
- noise[1]);
- #ifdef HAVEGTK
- if (gfp->gtkflag)
- set_pinfo(cod_info, &ratio[gr][ch], &scalefac[gr][ch], xr[gr][ch], xfsf, noise, gr, ch);
- #endif
- if (better) {
- /*
- * we now know it can be done with "real_bits"
- * and maybe we can skip some iterations
- */
- real_bits = cod_info->part2_3_length;
- /*
- * save best quantization so far
- */
- memcpy( &bst_scalefac, &scalefac[gr][ch], sizeof(III_scalefac_t) );
- memcpy( bst_l3_enc, l3_enc [gr][ch], sizeof(int)*576 );
- memcpy( &bst_cod_info, cod_info, sizeof(gr_info) );
- #ifdef HAVEGTK
- if (gfp->gtkflag)
- memcpy( &bst_pinfo, pinfo, sizeof(plotting_data) );
- #endif
- /*
- * try with fewer bits
- */
- this_bits -= dbits;
- } else {
- /*
- * try with more bits
- */
- this_bits += dbits;
- }
- dbits /= 2;
- } while (dbits>10) ;
- if (real_bits <= max_bits)
- {
- /* restore best quantization found */
- memcpy( cod_info, &bst_cod_info, sizeof(gr_info) );
- memcpy( &scalefac[gr][ch], &bst_scalefac, sizeof(III_scalefac_t) );
- memcpy( l3_enc [gr][ch], bst_l3_enc, sizeof(int)*576 );
- #ifdef HAVEGTK
- if (gfp->gtkflag)
- memcpy( pinfo, &bst_pinfo, sizeof(plotting_data) );
- #endif
- }
- assert((int)cod_info->part2_3_length <= max_bits);
- save_bits[gr][ch] = cod_info->part2_3_length;
- used_bits += save_bits[gr][ch];
- } /* for ch */
- } /* for gr */
- #ifdef RH_SIDE_VBR
- /* my experiences are, that side channel reduction
- * does more harm than good when VBR encoding
- * (Robert.Hegemann@gmx.de 2000-02-18)
- */
- #else
- if (reduce_sidechannel) {
- /* number of bits needed was found for MID channel above. Use formula
- * (fixed bitrate code) to set the side channel bits */
- for (gr = 0; gr < gfp->mode_gr; gr++) {
- FLOAT8 fac = .33*(.5-ms_ener_ratio[gr])/.5;
- save_bits[gr][1]=((1-fac)/(1+fac))*save_bits[gr][0];
- save_bits[gr][1]=Max(125,save_bits[gr][1]);
- used_bits += save_bits[gr][1];
- }
- }
- #endif
- /******************************************************************
- * find lowest bitrate able to hold used bits
- ******************************************************************/
- for( gfp->bitrate_index = (analog_silence ? 1 : gfp->VBR_min_bitrate );
- gfp->bitrate_index < gfp->VBR_max_bitrate;
- gfp->bitrate_index++ )
- if( used_bits <= frameBits[gfp->bitrate_index] ) break;
- /*******************************************************************
- * calculate quantization for this bitrate
- *******************************************************************/
- getframebits (gfp,&bitsPerFrame, &mean_bits);
- bits=ResvFrameBegin (gfp,l3_side, mean_bits, bitsPerFrame);
- /* repartion available bits in same proportion */
- if (used_bits > bits ) {
- reparted = 1;
- for( gr = 0; gr < gfp->mode_gr; gr++) {
- for(ch = 0; ch < gfp->stereo; ch++) {
- save_bits[gr][ch]=(save_bits[gr][ch]*frameBits[gfp->bitrate_index])/used_bits;
- }
- }
- used_bits=0;
- for( gr = 0; gr < gfp->mode_gr; gr++) {
- for(ch = 0; ch < gfp->stereo; ch++) {
- used_bits += save_bits[gr][ch];
- }
- }
- }
- assert(used_bits <= bits);
- for(gr = 0; gr < gfp->mode_gr; gr++) {
- for(ch = 0; ch < gfp->stereo; ch++) {
- #ifdef RH_SIDE_VBR
- if (reparted)
- #else
- if (reparted || (reduce_sidechannel && ch == 1))
- #endif
- {
- cod_info = &l3_side->gr[gr].ch[ch].tt;
- if (!init_outer_loop(gfp,xr[gr][ch], cod_info))
- {
- /* xr contains no energy
- * cod_info was set in init_outer_loop above
- */
- memset(&scalefac[gr][ch],0,sizeof(III_scalefac_t));
- memset(l3_enc[gr][ch],0,576*sizeof(int));
- noise[0]=noise[1]=noise[2]=noise[3]=0;
- }
- else
- {
- #ifdef RH_QUALITY_CONTROL
- /*
- * masking lower already set in the beginning
- */
- #else
- /* quality setting */
- set_masking_lower( gfp->VBR_q,save_bits[gr][ch] );
- #endif
- calc_xmin(gfp,xr[gr][ch], &ratio[gr][ch], cod_info, &l3_xmin);
- outer_loop( gfp,xr[gr][ch], save_bits[gr][ch], noise,
- &l3_xmin, l3_enc[gr][ch],
- &scalefac[gr][ch], cod_info, xfsf, ch);
- }
- #ifdef HAVEGTK
- if (gfp->gtkflag)
- set_pinfo(cod_info, &ratio[gr][ch], &scalefac[gr][ch], xr[gr][ch], xfsf, noise, gr, ch);
- #endif
- }
- }
- }
- /*******************************************************************
- * update reservoir status after FINAL quantization/bitrate
- *******************************************************************/
- for (gr = 0; gr < gfp->mode_gr; gr++)
- for (ch = 0; ch < gfp->stereo; ch++) {
- cod_info = &l3_side->gr[gr].ch[ch].tt;
- best_scalefac_store(gfp,gr, ch, l3_enc, l3_side, scalefac);
- if (cod_info->block_type == NORM_TYPE) {
- best_huffman_divide(gr, ch, cod_info, l3_enc[gr][ch]);
- }
- #ifdef HAVEGTK
- if (gfp->gtkflag)
- pinfo->LAMEmainbits[gr][ch]=cod_info->part2_3_length;
- #endif
- ResvAdjust (gfp,cod_info, l3_side, mean_bits);
- }
- /*******************************************************************
- * set the sign of l3_enc
- *******************************************************************/
- for (gr = 0; gr < gfp->mode_gr; gr++)
- for (ch = 0; ch < gfp->stereo; ch++) {
- /*
- * is the following code correct?
- *
- int *pi = &l3_enc[gr][ch][0];
- for (i = 0; i < 576; i++) {
- FLOAT8 pr = xr[gr][ch][i];
- if ((pr < 0) && (pi[i] > 0))
- pi[i] *= -1;
- }
- *
- * or is the code used for CBR correct?
- */
- for ( i = 0; i < 576; i++) {
- if (xr[gr][ch][i] < 0) l3_enc[gr][ch][i] *= -1;
- }
- }
- ResvFrameEnd (gfp,l3_side, mean_bits);
- }
- /************************************************************************/
- /* init_outer_loop mt 6/99 */
- /* returns 0 if all energies in xr are zero, else 1 */
- /************************************************************************/
- int init_outer_loop(lame_global_flags *gfp,
- FLOAT8 xr[576], /* could be L/R OR MID/SIDE */
- gr_info *cod_info)
- {
- int i;
- for ( i = 0; i < 4; i++ )
- cod_info->slen[i] = 0;
- cod_info->sfb_partition_table = &nr_of_sfb_block[0][0][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->subblock_gain[0] = 0;
- cod_info->subblock_gain[1] = 0;
- cod_info->subblock_gain[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->global_gain = 210;
- cod_info->count1table_select= 0;
- cod_info->count1bits = 0;
- if (gfp->experimentalZ) {
- /* compute subblock gains */
- int j,b; FLOAT8 en[3],mx;
- if ((cod_info->block_type==SHORT_TYPE) ) {
- /* estimate energy within each subblock */
- for (b=0; b<3; b++) en[b]=0;
- for ( i=0,j = 0; j < 192; j++ ) {
- for (b=0; b<3; b++) {
- en[b]+=xr[i] * xr[i];
- i++;
- }
- }
- mx = 1e-12;
- for (b=0; b<3; b++) mx=Max(mx,en[b]);
- for (b=0; b<3; b++) en[b] = Max(en[b],1e-12)/mx;
- /*printf("ener = %4.2f %4.2f %4.2f n",en[0],en[1],en[2]);*/
- /* pick gain so that 2^(2gain)*en[0] = 1 */
- /* gain = .5* log( 1/en[0] )/LOG2 = -.5*log(en[])/LOG2 */
- for (b=0; b<3; b++) {
- cod_info->subblock_gain[b] = (int)(-.5*log(en[b])/LOG2 + 0.5);
- if (cod_info->subblock_gain[b] > 2)
- cod_info->subblock_gain[b]=2;
- if (cod_info->subblock_gain[b] < 0)
- cod_info->subblock_gain[b]=0;
- }
- /*
- * check if there is some energy we have to quantize
- * if so, then return 1 else 0
- */
- if (1e-99 < en[0]+en[1]+en[2])
- return 1;
- else
- return 0;
- }
- }
- /*
- * check if there is some energy we have to quantize
- * if so, then return 1 else 0
- */
- for (i=0; i<576; i++)
- if ( 1e-99 < fabs (xr[i]) )
- return 1;
- return 0;
- }
- /************************************************************************/
- /* outer_loop */
- /************************************************************************/
- /* Function: The outer iteration loop controls the masking conditions */
- /* of all scalefactorbands. It computes the best scalefac and */
- /* global gain. This module calls the inner iteration loop
- *
- * mt 5/99 completely rewritten to allow for bit reservoir control,
- * mid/side channels with L/R or mid/side masking thresholds,
- * and chooses best quantization instead of last quantization when
- * no distortion free quantization can be found.
- *
- * added VBR support mt 5/99
- ************************************************************************/
- void outer_loop(
- lame_global_flags *gfp,
- FLOAT8 xr[576],
- int targ_bits,
- FLOAT8 best_noise[4],
- III_psy_xmin *l3_xmin, /* the allowed distortion of the scalefactor */
- int l3_enc[576], /* vector of quantized values ix(0..575) */
- III_scalefac_t *scalefac, /* scalefactors */
- gr_info *cod_info,
- FLOAT8 xfsf[4][SBPSY_l],
- int ch)
- {
- III_scalefac_t scalefac_w;
- gr_info save_cod_info;
- int l3_enc_w[576];
- int i, iteration;
- int status,bits_found=0;
- int huff_bits;
- FLOAT8 xrpow[576],temp;
- int better;
- int over=0;
- FLOAT8 max_noise;
- FLOAT8 over_noise;
- FLOAT8 tot_noise;
- int best_over=100;
- FLOAT8 best_max_noise=0;
- FLOAT8 best_over_noise=0;
- FLOAT8 best_tot_noise=0;
- FLOAT8 xfsf_w[4][SBPSY_l];
- FLOAT8 distort[4][SBPSY_l];
- int compute_stepsize=1;
- int notdone=1;
- /* BEGIN MAIN LOOP */
- iteration = 0;
- while ( notdone ) {
- static int OldValue[2] = {180, 180};
- int try_scale=0;
- iteration ++;
- if (compute_stepsize) {
- /* init and compute initial quantization step */
- compute_stepsize=0;
- /* reset of iteration variables */
- memset(&scalefac_w, 0, sizeof(III_scalefac_t));
- for (i=0;i<576;i++) {
- temp=fabs(xr[i]);
- xrpow[i]=sqrt(sqrt(temp)*temp);
- }
- bits_found=bin_search_StepSize2(gfp,targ_bits,OldValue[ch],
- l3_enc_w,xrpow,cod_info);
- OldValue[ch] = cod_info->global_gain;
- }
- /* inner_loop starts with the initial quantization step computed above
- * and slowly increases until the bits < huff_bits.
- * Thus it is important not to start with too large of an inital
- * quantization step. Too small is ok, but inner_loop will take longer
- */
- huff_bits = targ_bits - cod_info->part2_length;
- if (huff_bits < 0) {
- assert(iteration != 1);
- /* scale factors too large, not enough bits. use previous quantizaton */
- notdone=0;
- } else {
- /* if this is the first iteration, see if we can reuse the quantization
- * computed in bin_search_StepSize above */
- int real_bits;
- if (iteration==1) {
- if(bits_found>huff_bits) {
- cod_info->global_gain++;
- real_bits = inner_loop(gfp,xrpow, l3_enc_w, huff_bits, cod_info);
- } else real_bits=bits_found;
- }
- else
- real_bits=inner_loop(gfp,xrpow, l3_enc_w, huff_bits, cod_info);
- cod_info->part2_3_length = real_bits;
- /* compute the distortion in this quantization */
- if (gfp->noise_shaping==0) {
- over=0;
- }else{
- /* coefficients and thresholds both l/r (or both mid/side) */
- over=calc_noise1( xr, l3_enc_w, cod_info,
- xfsf_w,distort, l3_xmin, &scalefac_w, &over_noise,
- &tot_noise, &max_noise);
- }
- /* check if this quantization is better the our saved quantization */
- if (iteration == 1) better=1;
- else
- better=quant_compare(gfp->experimentalX,
- best_over,best_tot_noise,best_over_noise,best_max_noise,
- over, tot_noise, over_noise, max_noise);
- /* save data so we can restore this quantization later */
- if (better) {
- best_over=over;
- best_max_noise=max_noise;
- best_over_noise=over_noise;
- best_tot_noise=tot_noise;
- memcpy(scalefac, &scalefac_w, sizeof(III_scalefac_t));
- memcpy(l3_enc,l3_enc_w,sizeof(int)*576);
- memcpy(&save_cod_info,cod_info,sizeof(save_cod_info));
- #ifdef HAVEGTK
- if (gfp->gtkflag) {
- memcpy(xfsf, xfsf_w, sizeof(xfsf_w));
- }
- #endif
- }
- }
- /* if no bands with distortion, we are done */
- if (gfp->noise_shaping_stop==0)
- if (over==0) notdone=0;
- if (notdone) {
- amp_scalefac_bands( xrpow, cod_info, &scalefac_w, distort);
- /* check to make sure we have not amplified too much */
- /* loop_break returns 0 if there is an unamplified scalefac */
- /* scale_bitcount returns 0 if no scalefactors are too large */
- if ( (status = loop_break(&scalefac_w, cod_info)) == 0 ) {
- if ( gfp->version == 1 ) {
- status = scale_bitcount(&scalefac_w, cod_info);
- }else{
- status = scale_bitcount_lsf(&scalefac_w, cod_info);
- }
- if (status && (cod_info->scalefac_scale==0)) try_scale=1;
- }
- notdone = !status;
- }
- if (try_scale && gfp->experimentalY) {
- init_outer_loop(gfp,xr, cod_info);
- compute_stepsize=1; /* compute a new global gain */
- notdone=1;
- cod_info->scalefac_scale=1;
- }
- } /* done with main iteration */
- memcpy(cod_info,&save_cod_info,sizeof(save_cod_info));
- cod_info->part2_3_length += cod_info->part2_length;
- /* finish up */
- assert( cod_info->global_gain < 256 );
- best_noise[0]=best_over;
- best_noise[1]=best_max_noise;
- best_noise[2]=best_over_noise;
- best_noise[3]=best_tot_noise;
- }
- /*************************************************************************/
- /* calc_noise */
- /*************************************************************************/
- /* mt 5/99: Function: Improved calc_noise for a single channel */
- int calc_noise1( FLOAT8 xr[576], int ix[576], gr_info *cod_info,
- FLOAT8 xfsf[4][SBPSY_l], FLOAT8 distort[4][SBPSY_l],
- III_psy_xmin *l3_xmin, III_scalefac_t *scalefac,
- FLOAT8 *over_noise,
- FLOAT8 *tot_noise, FLOAT8 *max_noise)
- {
- int start, end, l, i, over=0;
- u_int sfb;
- FLOAT8 sum,step,bw;
- #ifdef RH_ATH
- FLOAT8 ath_max;
- #endif
- int count=0;
- FLOAT8 noise;
- *over_noise=0;
- *tot_noise=0;
- *max_noise = -999;
- for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ) {
- FLOAT8 step;
- int s = scalefac->l[sfb];
- if (cod_info->preflag)
- s += pretab[sfb];
- s = cod_info->global_gain - (s << (cod_info->scalefac_scale + 1));
- assert(s<Q_MAX);
- assert(s>=0);
- step = POW20(s);
- start = scalefac_band.l[ sfb ];
- end = scalefac_band.l[ sfb+1 ];
- bw = end - start;
- #ifdef RH_ATH
- ath_max = 0;
- #endif
- for ( sum = 0.0, l = start; l < end; l++ )
- {
- FLOAT8 temp;
- temp = fabs(xr[l]) - pow43[ix[l]] * step;
- #ifdef MAXNOISE
- temp = bw*temp*temp;
- sum = Max(sum,temp);
- #elif RH_ATH
- temp = temp*temp;
- sum += temp;
- ath_max = Max( ath_max, temp/ATH_mdct_long[l] );
- #else
- sum += temp * temp;
- #endif
- }
- xfsf[0][sfb] = sum / bw;
- /* max -30db noise below threshold */
- #ifdef RH_ATH
- noise = 10*log10(Max(.001,Min(ath_max,xfsf[0][sfb]/l3_xmin->l[sfb])));
- #else
- noise = 10*log10(Max(.001,xfsf[0][sfb] / l3_xmin->l[sfb]));
- #endif
- distort[0][sfb] = noise;
- if (noise>0) {
- over++;
- *over_noise += noise;
- }
- *tot_noise += noise;
- *max_noise=Max(*max_noise,noise);
- count++;
- }
- for ( i = 0; i < 3; i++ ) {
- for ( sfb = cod_info->sfb_smax; sfb < SBPSY_s; sfb++ ) {
- int s;
- s = (scalefac->s[sfb][i] << (cod_info->scalefac_scale + 1))
- + cod_info->subblock_gain[i] * 8;
- s = cod_info->global_gain - s;
- assert(s<Q_MAX);
- assert(s>=0);
- step = POW20(s);
- start = scalefac_band.s[ sfb ];
- end = scalefac_band.s[ sfb+1 ];
- bw = end - start;
- #ifdef RH_ATH
- ath_max = 0;
- #endif
- for ( sum = 0.0, l = start; l < end; l++ ) {
- FLOAT8 temp;
- temp = fabs(xr[l * 3 + i]) - pow43[ix[l * 3 + i]] * step;
- #ifdef MAXNOISE
- temp = bw*temp*temp;
- sum = Max(sum,temp);
- #elif RH_ATH
- temp = temp*temp;
- sum += temp;
- ath_max = Max( ath_max, temp/ATH_mdct_short[l] );
- #else
- sum += temp * temp;
- #endif
- }
- xfsf[i+1][sfb] = sum / bw;
- /* max -30db noise below threshold */
- #ifdef RH_ATH
- noise = 10*log10(Max(.001,Min(ath_max,xfsf[i+1][sfb]/l3_xmin->s[sfb][i])));
- #else
- noise = 10*log10(Max(.001,xfsf[i+1][sfb] / l3_xmin->s[sfb][i] ));
- #endif
- distort[i+1][sfb] = noise;
- if (noise > 0) {
- over++;
- *over_noise += noise;
- }
- *tot_noise += noise;
- *max_noise=Max(*max_noise,noise);
- count++;
- }
- }
- if (count>1) *tot_noise /= count;
- if (over>1) *over_noise /= over;
- return over;
- }
- /*************************************************************************/
- /* amp_scalefac_bands */
- /*************************************************************************/
- /*
- Amplify the scalefactor bands that violate the masking threshold.
- See ISO 11172-3 Section C.1.5.4.3.5
- */
- void amp_scalefac_bands(FLOAT8 xrpow[576],
- gr_info *cod_info,
- III_scalefac_t *scalefac,
- FLOAT8 distort[4][SBPSY_l])
- {
- int start, end, l,i;
- u_int sfb;
- FLOAT8 ifqstep34;
- FLOAT8 distort_thresh;
- if ( cod_info->scalefac_scale == 0 )
- ifqstep34 = 1.29683955465100964055;
- else
- ifqstep34 = 1.68179283050742922612;
- /* distort_thresh = 0, unless all bands have distortion
- * less than masking. In that case, just amplify bands with distortion
- * within 95% of largest distortion/masking ratio */
- distort_thresh = -900;
- for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ) {
- distort_thresh = Max(distort[0][sfb],distort_thresh);
- }
- for ( sfb = cod_info->sfb_smax; sfb < 12; sfb++ ) {
- for ( i = 0; i < 3; i++ ) {
- distort_thresh = Max(distort[i+1][sfb],distort_thresh);
- }
- }
- distort_thresh=Min(distort_thresh * 1.05, 0.0);
- for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ) {
- if ( distort[0][sfb]>distort_thresh ) {
- scalefac->l[sfb]++;
- start = scalefac_band.l[sfb];
- end = scalefac_band.l[sfb+1];
- for ( l = start; l < end; l++ )
- xrpow[l] *= ifqstep34;
- }
- }
- for ( i = 0; i < 3; i++ ) {
- for ( sfb = cod_info->sfb_smax; sfb < 12; sfb++ ) {
- if ( distort[i+1][sfb]>distort_thresh) {
- scalefac->s[sfb][i]++;
- start = scalefac_band.s[sfb];
- end = scalefac_band.s[sfb+1];
- for (l = start; l < end; l++)
- xrpow[l * 3 + i] *= ifqstep34;
- }
- }
- }
- }
- int quant_compare(int experimentalX,
- int best_over,FLOAT8 best_tot_noise,FLOAT8 best_over_noise,FLOAT8 best_max_noise,
- int over,FLOAT8 tot_noise, FLOAT8 over_noise, FLOAT8 max_noise)
- {
- /*
- noise is given in decibals (db) relative to masking thesholds.
- over_noise: sum of quantization noise > masking
- tot_noise: sum of all quantization noise
- max_noise: max quantization noise
- */
- int better=0;
- if (experimentalX==0) {
- better = ((over < best_over) ||
- ((over==best_over) && (over_noise<=best_over_noise)) ) ;
- }
- if (experimentalX==1)
- better = max_noise < best_max_noise;
- if (experimentalX==2) {
- better = tot_noise < best_tot_noise;
- }
- if (experimentalX==3) {
- better = (tot_noise < best_tot_noise) &&
- (max_noise < best_max_noise + 2);
- }
- if (experimentalX==4) {
- better = ( ( (0>=max_noise) && (best_max_noise>2)) ||
- ( (0>=max_noise) && (best_max_noise<0) && ((best_max_noise+2)>max_noise) && (tot_noise<best_tot_noise) ) ||
- ( (0>=max_noise) && (best_max_noise>0) && ((best_max_noise+2)>max_noise) && (tot_noise<(best_tot_noise+best_over_noise)) ) ||
- ( (0<max_noise) && (best_max_noise>-0.5) && ((best_max_noise+1)>max_noise) && ((tot_noise+over_noise)<(best_tot_noise+best_over_noise)) ) ||
- ( (0<max_noise) && (best_max_noise>-1) && ((best_max_noise+1.5)>max_noise) && ((tot_noise+over_noise+over_noise)<(best_tot_noise+best_over_noise+best_over_noise)) ) );
- }
- if (experimentalX==5) {
- better = (over_noise < best_over_noise)
- || ((over_noise == best_over_noise)&&(tot_noise < best_tot_noise));
- }
- if (experimentalX==6) {
- better = (over_noise < best_over_noise)
- ||( (over_noise == best_over_noise)
- &&( (max_noise < best_max_noise)
- ||( (max_noise == best_max_noise)
- &&(tot_noise <= best_tot_noise)
- )
- )
- );
- }
- return better;
- }
- int VBR_compare(
- int best_over,FLOAT8 best_tot_noise,FLOAT8 best_over_noise,FLOAT8 best_max_noise,
- int over,FLOAT8 tot_noise, FLOAT8 over_noise, FLOAT8 max_noise)
- {
- /*
- noise is given in decibals (db) relative to masking thesholds.
- over_noise: sum of quantization noise > masking
- tot_noise: sum of all quantization noise
- max_noise: max quantization noise
- */
- int better=0;
- better = ((over <= best_over) &&
- (over_noise<=best_over_noise) &&
- (tot_noise<=best_tot_noise) &&
- (max_noise<=best_max_noise));
- return better;
- }