vbrquantize.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * MP3 quantization
  3.  *
  4.  * Copyright (c) 1999 Mark Taylor
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2, or (at your option)
  9.  * any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; see the file COPYING.  If not, write to
  18.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20. #include <assert.h>
  21. #include "util.h"
  22. #include "l3side.h"
  23. #include "quantize.h"
  24. #include "l3bitstream.h"
  25. #include "reservoir.h"
  26. #include "quantize-pvt.h"
  27. #ifdef HAVEGTK
  28. #include "gtkanal.h"
  29. #endif
  30. #define DEBUGXX
  31. FLOAT8 calc_sfb_ave_noise(FLOAT8 *xr, FLOAT8 *xr34, int stride, int bw, FLOAT8 sfpow)
  32. {
  33.   int j;
  34.   FLOAT8 xfsf=0;
  35.   FLOAT8 sfpow34 = pow(sfpow,3.0/4.0);
  36.   for ( j=0; j < stride*bw ; j += stride) {
  37.     int ix;
  38.     FLOAT8 temp,temp2;
  39.     /*    ix=(int)( xr34[j]/sfpow34  + 0.4054);*/
  40.     ix=floor( xr34[j]/sfpow34);
  41.     if (ix > IXMAX_VAL) return -1.0;
  42.     temp = fabs(xr[j])- pow43[ix]*sfpow;
  43.     if (ix < IXMAX_VAL) {
  44.       temp2 = fabs(xr[j])- pow43[ix+1]*sfpow;
  45.       if (fabs(temp2)<fabs(temp)) temp=temp2;
  46.     }
  47. #ifdef MAXQUANTERROR
  48.     temp *= temp;
  49.     xfsf = bw*Max(xfsf,temp);
  50. #else
  51.     xfsf += temp * temp;
  52. #endif
  53.   }
  54.   return xfsf/bw;
  55. }
  56. FLOAT8 find_scalefac(FLOAT8 *xr,FLOAT8 *xr34,int stride,int sfb,
  57.      FLOAT8 l3_xmin,int bw)
  58. {
  59.   FLOAT8 xfsf,sfpow,sf,sf_ok,delsf;
  60.   int sf4,sf_ok4,delsf4;
  61.   int i;
  62.   /* search will range from sf:  -52.25 -> 11.25  */
  63.   /* search will range from sf4:  -209 -> 45  */
  64.   sf = -20.5;
  65.   sf4 = -82;
  66.   delsf = 32;
  67.   delsf4 = 128;
  68.   sf_ok =10000; 
  69.   sf_ok4=10000;
  70.   for (i=0; i<7; i++) {
  71.     delsf /= 2;
  72.     delsf4 /= 2;
  73.     sfpow = pow(2.0,sf);
  74.     /* sfpow = pow(2.0,sf4/4.0); */
  75.     xfsf = calc_sfb_ave_noise(xr,xr34,stride,bw,sfpow);
  76.     if (xfsf < 0) {
  77.       /* scalefactors too small */
  78.       sf += delsf; 
  79.       sf4 += delsf4;
  80.     }else{
  81.       if (sf_ok==10000) sf_ok=sf;  
  82.       if (sf_ok4==10000) sf_ok4=sf4;  
  83.       if (xfsf > l3_xmin)  {
  84. /* distortion.  try a smaller scalefactor */
  85. sf -= delsf;
  86. sf4 -= delsf4;
  87.       }else{
  88. sf_ok=sf;
  89. sf_ok4 = sf4;
  90. sf += delsf;
  91. sf4 += delsf4;
  92.       }
  93.     }
  94.   } 
  95.   /* sf_ok accurate to within +/- 2*final_value_of_delsf */
  96.   assert(sf_ok!=10000);
  97.   /* NOTE: noise is not a monotone function of the sf, even though
  98.    * the number of bits used is!  do a brute force search in the 
  99.    * neighborhood of sf_ok: 
  100.    * 
  101.    *  sf = sf_ok + 1.75     works  1% of the time 
  102.    *  sf = sf_ok + 1.50     works  1% of the time 
  103.    *  sf = sf_ok + 1.25     works  2% of the time 
  104.    *  sf = sf_ok + 1.00     works  3% of the time 
  105.    *  sf = sf_ok + 0.75     works  9% of the time 
  106.    *  sf = sf_ok + 0.50     0 %  (because it was tried above)
  107.    *  sf = sf_ok + 0.25     works 39% of the time 
  108.    *  sf = sf_ok + 0.00     works the rest of the time
  109.    */
  110.   sf = sf_ok + 0.75;
  111.   sf4 = sf_ok4 + 3;
  112.   while (sf>(sf_ok+.01)) { 
  113.     /* sf = sf_ok + 2*delsf was tried above, skip it:  */
  114.     if (fabs(sf-(sf_ok+2*delsf))  < .01) sf -=.25;
  115.     if (sf4 == sf_ok4+2*delsf4) sf4 -=1;
  116.     sfpow = pow(2.0,sf);
  117.     /* sfpow = pow(2.0,sf4/4.0) */
  118.     xfsf = calc_sfb_ave_noise(xr,xr34,stride,bw,sfpow);
  119.     if (xfsf > 0) {
  120.       if (xfsf <= l3_xmin) return sf;
  121.     }
  122.     sf -= .25;
  123.     sf4 -= 1;
  124.   }
  125.   return sf_ok;
  126. }
  127. /*
  128.     sfb=0..5  scalefac < 16 
  129.     sfb>5     scalefac < 8
  130.     ifqstep = ( cod_info->scalefac_scale == 0 ) ? .5 : 1.0;
  131.     ol_sf =  (cod_info->global_gain-210.0)/4.0;
  132.     ol_sf -= 2*cod_info->subblock_gain[i];
  133.     ol_sf -= ifqstep*scalefac[gr][ch].s[sfb][i];
  134. */
  135. FLOAT8 compute_scalefacs_short(FLOAT8 vbrsf[SBPSY_s][3],gr_info *cod_info,int scalefac[SBPSY_s][3])
  136. {
  137.   FLOAT8 maxrange,maxover;
  138.   FLOAT8 sf[SBPSY_s][3];
  139.   int sfb,i;
  140.   int ifqstep_inv = ( cod_info->scalefac_scale == 0 ) ? 2 : 1;
  141.   /* make a working copy of the desired scalefacs */
  142.   memcpy(sf,vbrsf,SBPSY_s*3*sizeof(FLOAT8));
  143.   /* see if we should use subblock gain */
  144.   maxover=0;
  145.   for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
  146.     for (i=0; i<3; ++i) {
  147.       /* ifqstep*scalefac + 2*subblock_gain >= -sf[sfb] */
  148.       scalefac[sfb][i]=floor( -sf[sfb][i]*ifqstep_inv  +.75 + .0001)   ;
  149.       
  150.       if (sfb < 6) maxrange = 15.0/ifqstep_inv;
  151.       else maxrange = 7.0/ifqstep_inv;
  152.       
  153.       if (maxrange + sf[sfb][i] > maxover) maxover = maxrange+sf[sfb][i];
  154.     }
  155.   }
  156.   return maxover;
  157. }
  158. /*
  159.   sfb=0..10  scalefac < 16 
  160.   sfb>10     scalefac < 8
  161.   ifqstep = ( cod_info->scalefac_scale == 0 ) ? .5 : 1.0;
  162.   ol_sf =  (cod_info->global_gain-210.0)/4.0;
  163.   ol_sf -= ifqstep*scalefac[gr][ch].l[sfb];
  164.   if (cod_info->preflag && sfb>=11) 
  165.   ol_sf -= ifqstep*pretab[sfb];
  166. */
  167. FLOAT8 compute_scalefacs_long(FLOAT8 vbrsf[SBPSY_l],gr_info *cod_info,int scalefac[SBPSY_l])
  168. {
  169.   int sfb;
  170.   FLOAT8 sf[SBPSY_l];
  171.   FLOAT8 maxrange,maxover;
  172.   int ifqstep_inv = ( cod_info->scalefac_scale == 0 ) ? 2 : 1;
  173.   /* make a working copy of the desired scalefacs */
  174.   memcpy(sf,vbrsf,SBPSY_l*sizeof(FLOAT8));
  175.   cod_info->preflag=0;
  176.   for ( sfb = 11; sfb < SBPSY_l; sfb++ ) {
  177.     if (sf[sfb] + pretab[sfb]/ifqstep_inv > 0) break;
  178.   }
  179.   if (sfb==SBPSY_l) {
  180.     cod_info->preflag=1;
  181.     for ( sfb = 11; sfb < SBPSY_l; sfb++ ) 
  182.       sf[sfb] += pretab[sfb]/ifqstep_inv;
  183.   }
  184.   maxover=0;
  185.   for ( sfb = 0; sfb < SBPSY_l; sfb++ ) {
  186.     /* ifqstep*scalefac >= -sf[sfb] */
  187.     scalefac[sfb]=floor( -sf[sfb]*ifqstep_inv  +.75 + .0001)   ;
  188.     if (sfb < 11) maxrange = 15.0/ifqstep_inv;
  189.     else maxrange = 7.0/ifqstep_inv;
  190.     if (maxrange + sf[sfb] > maxover) maxover = maxrange+sf[sfb];
  191.   }
  192.   return maxover;
  193. }
  194.   
  195.   
  196. /************************************************************************
  197.  *
  198.  * VBR_iteration_loop()   
  199.  *
  200.  *
  201.  ************************************************************************/
  202. void
  203. VBR_iteration_loop_new (lame_global_flags *gfp,
  204.                 FLOAT8 pe[2][2], FLOAT8 ms_ener_ratio[2],
  205.                 FLOAT8 xr[2][2][576], III_psy_ratio ratio[2][2],
  206.                 III_side_info_t * l3_side, int l3_enc[2][2][576],
  207.                 III_scalefac_t scalefac[2][2])
  208. {
  209.   III_psy_xmin l3_xmin[2][2];
  210.   FLOAT8    masking_lower_db;
  211.   FLOAT8    ifqstep;
  212.   int       start,end,bw,sfb, i,ch, gr, over;
  213.   III_psy_xmin vbrsf;
  214.   FLOAT8 vbrmax;
  215.   iteration_init(gfp,l3_side,l3_enc);
  216.   /* Adjust allowed masking based on quality setting */
  217.   /* db_lower varies from -10 to +8 db */
  218.   masking_lower_db = -10 + 2*gfp->VBR_q;
  219.   /* adjust by -6(min)..0(max) depending on bitrate */
  220.   masking_lower = pow(10.0,masking_lower_db/10);
  221.   masking_lower = 1;
  222.   for (gr = 0; gr < gfp->mode_gr; gr++) {
  223.     if (convert_mdct)
  224.       ms_convert(xr[gr],xr[gr]);
  225.     for (ch = 0; ch < gfp->stereo; ch++) { 
  226.       FLOAT8 xr34[576];
  227.       gr_info *cod_info = &l3_side->gr[gr].ch[ch].tt;
  228.       int shortblock;
  229.       over = 0;
  230.       shortblock = (cod_info->block_type == SHORT_TYPE);
  231.       for(i=0;i<576;i++) {
  232. FLOAT8 temp=fabs(xr[gr][ch][i]);
  233. xr34[i]=sqrt(sqrt(temp)*temp);
  234.       }
  235.       calc_xmin( gfp,xr[gr][ch], &ratio[gr][ch], cod_info, &l3_xmin[gr][ch]);
  236.       vbrmax=0;
  237.       if (shortblock) {
  238. for ( sfb = 0; sfb < SBPSY_s; sfb++ )  {
  239.   for ( i = 0; i < 3; i++ ) {
  240.     start = scalefac_band.s[ sfb ];
  241.     end   = scalefac_band.s[ sfb+1 ];
  242.     bw = end - start;
  243.     vbrsf.s[sfb][i] = find_scalefac(&xr[gr][ch][3*start+i],&xr34[3*start+i],3,sfb,
  244.    masking_lower*l3_xmin[gr][ch].s[sfb][i],bw);
  245.     if (vbrsf.s[sfb][i]>vbrmax) vbrmax=vbrsf.s[sfb][i];
  246.   }
  247. }
  248.       }else{
  249. for ( sfb = 0; sfb < SBPSY_l; sfb++ )   {
  250.   start = scalefac_band.l[ sfb ];
  251.   end   = scalefac_band.l[ sfb+1 ];
  252.   bw = end - start;
  253.   vbrsf.l[sfb] = find_scalefac(&xr[gr][ch][start],&xr34[start],1,sfb,
  254.     masking_lower*l3_xmin[gr][ch].l[sfb],bw);
  255.   if (vbrsf.l[sfb]>vbrmax) vbrmax = vbrsf.l[sfb];
  256. }
  257.       } /* compute scalefactors */
  258.       /* sf =  (cod_info->global_gain-210.0)/4.0; */
  259.       cod_info->global_gain = floor(4*vbrmax +210 + .5);
  260.       if (shortblock) {
  261. for ( sfb = 0; sfb < SBPSY_s; sfb++ ) {
  262.   for ( i = 0; i < 3; i++ ) {
  263.     vbrsf.s[sfb][i] -= vbrmax;
  264.   }
  265. }
  266. cod_info->scalefac_scale = 0;
  267. if (compute_scalefacs_short(vbrsf.s,cod_info,scalefac[gr][ch].s) > 0) {
  268.   cod_info->scalefac_scale = 1;
  269.   if (compute_scalefacs_short(vbrsf.s,cod_info,scalefac[gr][ch].s) >0) {
  270.     /* what do we do now? */
  271.     exit(32);
  272.   }
  273. }
  274.       }else{
  275. for ( sfb = 0; sfb < SBPSY_l; sfb++ )   
  276.   vbrsf.l[sfb] -= vbrmax;
  277. /* can we get away with scalefac_scale=0? */
  278. cod_info->scalefac_scale = 0;
  279. if (compute_scalefacs_long(vbrsf.l,cod_info,scalefac[gr][ch].l) > 0) {
  280.   cod_info->scalefac_scale = 1;
  281.   if (compute_scalefacs_long(vbrsf.l,cod_info,scalefac[gr][ch].l) >0) {
  282.     /* what do we do now? */
  283.     exit(32);
  284.   }
  285. }
  286.       } 
  287.     } /* ch */
  288.   } /* gr */
  289. }