xref: /plan9/sys/src/games/mp3enc/quantize.c (revision 8f5875f3e9b20916b4c52ad4336922bc8653eb7b)
1*8f5875f3SDavid du Colombier /*
2*8f5875f3SDavid du Colombier  * MP3 quantization
3*8f5875f3SDavid du Colombier  *
4*8f5875f3SDavid du Colombier  * Copyright (c) 1999 Mark Taylor
5*8f5875f3SDavid du Colombier  *
6*8f5875f3SDavid du Colombier  * This library is free software; you can redistribute it and/or
7*8f5875f3SDavid du Colombier  * modify it under the terms of the GNU Library General Public
8*8f5875f3SDavid du Colombier  * License as published by the Free Software Foundation; either
9*8f5875f3SDavid du Colombier  * version 2 of the License, or (at your option) any later version.
10*8f5875f3SDavid du Colombier  *
11*8f5875f3SDavid du Colombier  * This library is distributed in the hope that it will be useful,
12*8f5875f3SDavid du Colombier  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*8f5875f3SDavid du Colombier  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the GNU
14*8f5875f3SDavid du Colombier  * Library General Public License for more details.
15*8f5875f3SDavid du Colombier  *
16*8f5875f3SDavid du Colombier  * You should have received a copy of the GNU Library General Public
17*8f5875f3SDavid du Colombier  * License along with this library; if not, write to the
18*8f5875f3SDavid du Colombier  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19*8f5875f3SDavid du Colombier  * Boston, MA 02111-1307, USA.
20*8f5875f3SDavid du Colombier  */
21*8f5875f3SDavid du Colombier 
22*8f5875f3SDavid du Colombier /* $Id: quantize.c,v 1.57 2001/02/27 06:14:57 markt Exp $ */
23*8f5875f3SDavid du Colombier 
24*8f5875f3SDavid du Colombier #ifdef HAVE_CONFIG_H
25*8f5875f3SDavid du Colombier # include <config.h>
26*8f5875f3SDavid du Colombier #endif
27*8f5875f3SDavid du Colombier 
28*8f5875f3SDavid du Colombier #include <math.h>
29*8f5875f3SDavid du Colombier #include <assert.h>
30*8f5875f3SDavid du Colombier #include "util.h"
31*8f5875f3SDavid du Colombier #include "l3side.h"
32*8f5875f3SDavid du Colombier #include "quantize.h"
33*8f5875f3SDavid du Colombier #include "reservoir.h"
34*8f5875f3SDavid du Colombier #include "quantize_pvt.h"
35*8f5875f3SDavid du Colombier #include "lame-analysis.h"
36*8f5875f3SDavid du Colombier 
37*8f5875f3SDavid du Colombier #ifdef WITH_DMALLOC
38*8f5875f3SDavid du Colombier #include <dmalloc.h>
39*8f5875f3SDavid du Colombier #endif
40*8f5875f3SDavid du Colombier 
41*8f5875f3SDavid du Colombier 
42*8f5875f3SDavid du Colombier /************************************************************************
43*8f5875f3SDavid du Colombier  *
44*8f5875f3SDavid du Colombier  *      init_outer_loop()
45*8f5875f3SDavid du Colombier  *  mt 6/99
46*8f5875f3SDavid du Colombier  *
47*8f5875f3SDavid du Colombier  *  initializes cod_info, scalefac and xrpow
48*8f5875f3SDavid du Colombier  *
49*8f5875f3SDavid du Colombier  *  returns 0 if all energies in xr are zero, else 1
50*8f5875f3SDavid du Colombier  *
51*8f5875f3SDavid du Colombier  ************************************************************************/
52*8f5875f3SDavid du Colombier 
53*8f5875f3SDavid du Colombier static int
init_outer_loop(gr_info * const cod_info,III_scalefac_t * const scalefac,const int is_mpeg1,const FLOAT8 xr[576],FLOAT8 xrpow[576])54*8f5875f3SDavid du Colombier init_outer_loop(
55*8f5875f3SDavid du Colombier     gr_info *const cod_info,
56*8f5875f3SDavid du Colombier     III_scalefac_t *const scalefac,
57*8f5875f3SDavid du Colombier     const int is_mpeg1,
58*8f5875f3SDavid du Colombier     const FLOAT8 xr[576],
59*8f5875f3SDavid du Colombier     FLOAT8 xrpow[576] )
60*8f5875f3SDavid du Colombier {
61*8f5875f3SDavid du Colombier     FLOAT8 tmp, sum = 0;
62*8f5875f3SDavid du Colombier     int i;
63*8f5875f3SDavid du Colombier 
64*8f5875f3SDavid du Colombier     /*  initialize fresh cod_info
65*8f5875f3SDavid du Colombier      */
66*8f5875f3SDavid du Colombier     cod_info->part2_3_length      = 0;
67*8f5875f3SDavid du Colombier     cod_info->big_values          = 0;
68*8f5875f3SDavid du Colombier     cod_info->count1              = 0;
69*8f5875f3SDavid du Colombier     cod_info->global_gain         = 210;
70*8f5875f3SDavid du Colombier     cod_info->scalefac_compress   = 0;
71*8f5875f3SDavid du Colombier     /* window_switching_flag was set in psymodel.c? */
72*8f5875f3SDavid du Colombier     /* block_type            was set in psymodel.c? */
73*8f5875f3SDavid du Colombier     /* mixed_block_flag      would be set in ^      */
74*8f5875f3SDavid du Colombier     cod_info->table_select [0]    = 0;
75*8f5875f3SDavid du Colombier     cod_info->table_select [1]    = 0;
76*8f5875f3SDavid du Colombier     cod_info->table_select [2]    = 0;
77*8f5875f3SDavid du Colombier     cod_info->subblock_gain[0]    = 0;
78*8f5875f3SDavid du Colombier     cod_info->subblock_gain[1]    = 0;
79*8f5875f3SDavid du Colombier     cod_info->subblock_gain[2]    = 0;
80*8f5875f3SDavid du Colombier     cod_info->region0_count       = 0;
81*8f5875f3SDavid du Colombier     cod_info->region1_count       = 0;
82*8f5875f3SDavid du Colombier     cod_info->preflag             = 0;
83*8f5875f3SDavid du Colombier     cod_info->scalefac_scale      = 0;
84*8f5875f3SDavid du Colombier     cod_info->count1table_select  = 0;
85*8f5875f3SDavid du Colombier     cod_info->part2_length        = 0;
86*8f5875f3SDavid du Colombier     if (cod_info->block_type == SHORT_TYPE) {
87*8f5875f3SDavid du Colombier         cod_info->sfb_lmax        = 0;
88*8f5875f3SDavid du Colombier         cod_info->sfb_smin        = 0;
89*8f5875f3SDavid du Colombier 	if (cod_info->mixed_block_flag) {
90*8f5875f3SDavid du Colombier             /*
91*8f5875f3SDavid du Colombier              *  MPEG-1:      sfbs 0-7 long block, 3-12 short blocks
92*8f5875f3SDavid du Colombier              *  MPEG-2(.5):  sfbs 0-5 long block, 3-12 short blocks
93*8f5875f3SDavid du Colombier              */
94*8f5875f3SDavid du Colombier             cod_info->sfb_lmax    = is_mpeg1 ? 8 : 6;
95*8f5875f3SDavid du Colombier 	    cod_info->sfb_smin    = 3;
96*8f5875f3SDavid du Colombier 	}
97*8f5875f3SDavid du Colombier     } else {
98*8f5875f3SDavid du Colombier         cod_info->sfb_lmax        = SBPSY_l;
99*8f5875f3SDavid du Colombier         cod_info->sfb_smin        = SBPSY_s;
100*8f5875f3SDavid du Colombier     }
101*8f5875f3SDavid du Colombier     cod_info->count1bits          = 0;
102*8f5875f3SDavid du Colombier     cod_info->sfb_partition_table = nr_of_sfb_block[0][0];
103*8f5875f3SDavid du Colombier     cod_info->slen[0]             = 0;
104*8f5875f3SDavid du Colombier     cod_info->slen[1]             = 0;
105*8f5875f3SDavid du Colombier     cod_info->slen[2]             = 0;
106*8f5875f3SDavid du Colombier     cod_info->slen[3]             = 0;
107*8f5875f3SDavid du Colombier 
108*8f5875f3SDavid du Colombier     /*  fresh scalefactors are all zero
109*8f5875f3SDavid du Colombier      */
110*8f5875f3SDavid du Colombier     memset(scalefac, 0, sizeof(III_scalefac_t));
111*8f5875f3SDavid du Colombier 
112*8f5875f3SDavid du Colombier     /*  check if there is some energy we have to quantize
113*8f5875f3SDavid du Colombier      *  and calculate xrpow matching our fresh scalefactors
114*8f5875f3SDavid du Colombier      */
115*8f5875f3SDavid du Colombier     for (i = 0; i < 576; ++i) {
116*8f5875f3SDavid du Colombier         tmp = fabs (xr[i]);
117*8f5875f3SDavid du Colombier 	sum += tmp;
118*8f5875f3SDavid du Colombier         xrpow[i] = sqrt (tmp * sqrt(tmp));
119*8f5875f3SDavid du Colombier     }
120*8f5875f3SDavid du Colombier    /*  return 1 if we have something to quantize, else 0
121*8f5875f3SDavid du Colombier     */
122*8f5875f3SDavid du Colombier    return sum > (FLOAT8)1E-20;
123*8f5875f3SDavid du Colombier }
124*8f5875f3SDavid du Colombier 
125*8f5875f3SDavid du Colombier 
126*8f5875f3SDavid du Colombier 
127*8f5875f3SDavid du Colombier /************************************************************************
128*8f5875f3SDavid du Colombier  *
129*8f5875f3SDavid du Colombier  *      bin_search_StepSize()
130*8f5875f3SDavid du Colombier  *
131*8f5875f3SDavid du Colombier  *  author/date??
132*8f5875f3SDavid du Colombier  *
133*8f5875f3SDavid du Colombier  *  binary step size search
134*8f5875f3SDavid du Colombier  *  used by outer_loop to get a quantizer step size to start with
135*8f5875f3SDavid du Colombier  *
136*8f5875f3SDavid du Colombier  ************************************************************************/
137*8f5875f3SDavid du Colombier 
138*8f5875f3SDavid du Colombier typedef enum {
139*8f5875f3SDavid du Colombier     BINSEARCH_NONE,
140*8f5875f3SDavid du Colombier     BINSEARCH_UP,
141*8f5875f3SDavid du Colombier     BINSEARCH_DOWN
142*8f5875f3SDavid du Colombier } binsearchDirection_t;
143*8f5875f3SDavid du Colombier 
144*8f5875f3SDavid du Colombier int
bin_search_StepSize(lame_internal_flags * const gfc,gr_info * const cod_info,const int desired_rate,const int start,const FLOAT8 xrpow[576],int l3enc[576])145*8f5875f3SDavid du Colombier bin_search_StepSize(
146*8f5875f3SDavid du Colombier           lame_internal_flags * const gfc,
147*8f5875f3SDavid du Colombier           gr_info * const cod_info,
148*8f5875f3SDavid du Colombier     const int             desired_rate,
149*8f5875f3SDavid du Colombier     const int             start,
150*8f5875f3SDavid du Colombier     const FLOAT8          xrpow [576],
151*8f5875f3SDavid du Colombier           int             l3enc [576] )
152*8f5875f3SDavid du Colombier {
153*8f5875f3SDavid du Colombier     int nBits;
154*8f5875f3SDavid du Colombier     int CurrentStep;
155*8f5875f3SDavid du Colombier     int flag_GoneOver = 0;
156*8f5875f3SDavid du Colombier     int StepSize      = start;
157*8f5875f3SDavid du Colombier 
158*8f5875f3SDavid du Colombier     binsearchDirection_t Direction = BINSEARCH_NONE;
159*8f5875f3SDavid du Colombier     assert(gfc->CurrentStep);
160*8f5875f3SDavid du Colombier     CurrentStep = gfc->CurrentStep;
161*8f5875f3SDavid du Colombier 
162*8f5875f3SDavid du Colombier     do {
163*8f5875f3SDavid du Colombier         cod_info->global_gain = StepSize;
164*8f5875f3SDavid du Colombier         nBits = count_bits(gfc,l3enc,xrpow,cod_info);
165*8f5875f3SDavid du Colombier 
166*8f5875f3SDavid du Colombier         if (CurrentStep == 1) break; /* nothing to adjust anymore */
167*8f5875f3SDavid du Colombier 
168*8f5875f3SDavid du Colombier         if (flag_GoneOver) CurrentStep /= 2;
169*8f5875f3SDavid du Colombier 
170*8f5875f3SDavid du Colombier         if (nBits > desired_rate) {
171*8f5875f3SDavid du Colombier             /* increase Quantize_StepSize */
172*8f5875f3SDavid du Colombier             if (Direction == BINSEARCH_DOWN && !flag_GoneOver) {
173*8f5875f3SDavid du Colombier                 flag_GoneOver = 1;
174*8f5875f3SDavid du Colombier                 CurrentStep  /= 2; /* late adjust */
175*8f5875f3SDavid du Colombier             }
176*8f5875f3SDavid du Colombier             Direction = BINSEARCH_UP;
177*8f5875f3SDavid du Colombier             StepSize += CurrentStep;
178*8f5875f3SDavid du Colombier             if (StepSize > 255) break;
179*8f5875f3SDavid du Colombier         }
180*8f5875f3SDavid du Colombier         else if (nBits < desired_rate) {
181*8f5875f3SDavid du Colombier             /* decrease Quantize_StepSize */
182*8f5875f3SDavid du Colombier             if (Direction == BINSEARCH_UP && !flag_GoneOver) {
183*8f5875f3SDavid du Colombier                 flag_GoneOver = 1;
184*8f5875f3SDavid du Colombier                 CurrentStep  /= 2; /* late adjust */
185*8f5875f3SDavid du Colombier             }
186*8f5875f3SDavid du Colombier             Direction = BINSEARCH_DOWN;
187*8f5875f3SDavid du Colombier             StepSize -= CurrentStep;
188*8f5875f3SDavid du Colombier             if (StepSize < 0) break;
189*8f5875f3SDavid du Colombier         }
190*8f5875f3SDavid du Colombier         else break; /* nBits == desired_rate;; most unlikely to happen.*/
191*8f5875f3SDavid du Colombier     } while (1); /* For-ever, break is adjusted. */
192*8f5875f3SDavid du Colombier 
193*8f5875f3SDavid du Colombier     CurrentStep = start - StepSize;
194*8f5875f3SDavid du Colombier 
195*8f5875f3SDavid du Colombier     gfc->CurrentStep = CurrentStep/4 != 0 ? 4 : 2;
196*8f5875f3SDavid du Colombier 
197*8f5875f3SDavid du Colombier     return nBits;
198*8f5875f3SDavid du Colombier }
199*8f5875f3SDavid du Colombier 
200*8f5875f3SDavid du Colombier 
201*8f5875f3SDavid du Colombier 
202*8f5875f3SDavid du Colombier 
203*8f5875f3SDavid du Colombier /***************************************************************************
204*8f5875f3SDavid du Colombier  *
205*8f5875f3SDavid du Colombier  *         inner_loop ()
206*8f5875f3SDavid du Colombier  *
207*8f5875f3SDavid du Colombier  *  author/date??
208*8f5875f3SDavid du Colombier  *
209*8f5875f3SDavid du Colombier  *  The code selects the best global gain for a particular set of scalefacs
210*8f5875f3SDavid du Colombier  *
211*8f5875f3SDavid du Colombier  ***************************************************************************/
212*8f5875f3SDavid du Colombier 
213*8f5875f3SDavid du Colombier int
inner_loop(lame_internal_flags * const gfc,gr_info * const cod_info,const int max_bits,const FLOAT8 xrpow[576],int l3enc[576])214*8f5875f3SDavid du Colombier inner_loop(
215*8f5875f3SDavid du Colombier           lame_internal_flags * const gfc,
216*8f5875f3SDavid du Colombier           gr_info * const cod_info,
217*8f5875f3SDavid du Colombier     const int             max_bits,
218*8f5875f3SDavid du Colombier     const FLOAT8          xrpow [576],
219*8f5875f3SDavid du Colombier           int             l3enc [576] )
220*8f5875f3SDavid du Colombier {
221*8f5875f3SDavid du Colombier     int bits;
222*8f5875f3SDavid du Colombier 
223*8f5875f3SDavid du Colombier     assert(max_bits >= 0);
224*8f5875f3SDavid du Colombier 
225*8f5875f3SDavid du Colombier     /*  scalefactors may have changed, so count bits
226*8f5875f3SDavid du Colombier      */
227*8f5875f3SDavid du Colombier     bits=count_bits(gfc,l3enc,xrpow,cod_info);
228*8f5875f3SDavid du Colombier 
229*8f5875f3SDavid du Colombier     /*  increase quantizer stepsize until needed bits are below maximum
230*8f5875f3SDavid du Colombier      */
231*8f5875f3SDavid du Colombier     while (bits > max_bits) {
232*8f5875f3SDavid du Colombier         cod_info->global_gain++;
233*8f5875f3SDavid du Colombier         bits = count_bits (gfc, l3enc, xrpow, cod_info);
234*8f5875f3SDavid du Colombier     }
235*8f5875f3SDavid du Colombier 
236*8f5875f3SDavid du Colombier     return bits;
237*8f5875f3SDavid du Colombier }
238*8f5875f3SDavid du Colombier 
239*8f5875f3SDavid du Colombier 
240*8f5875f3SDavid du Colombier 
241*8f5875f3SDavid du Colombier /*************************************************************************
242*8f5875f3SDavid du Colombier  *
243*8f5875f3SDavid du Colombier  *      loop_break()
244*8f5875f3SDavid du Colombier  *
245*8f5875f3SDavid du Colombier  *  author/date??
246*8f5875f3SDavid du Colombier  *
247*8f5875f3SDavid du Colombier  *  Function: Returns zero if there is a scalefac which has not been
248*8f5875f3SDavid du Colombier  *            amplified. Otherwise it returns one.
249*8f5875f3SDavid du Colombier  *
250*8f5875f3SDavid du Colombier  *************************************************************************/
251*8f5875f3SDavid du Colombier 
252*8f5875f3SDavid du Colombier inline
253*8f5875f3SDavid du Colombier static int
loop_break(const gr_info * const cod_info,const III_scalefac_t * const scalefac)254*8f5875f3SDavid du Colombier loop_break(
255*8f5875f3SDavid du Colombier     const gr_info        * const cod_info,
256*8f5875f3SDavid du Colombier     const III_scalefac_t * const scalefac )
257*8f5875f3SDavid du Colombier {
258*8f5875f3SDavid du Colombier     unsigned int i, sfb;
259*8f5875f3SDavid du Colombier 
260*8f5875f3SDavid du Colombier     for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++)
261*8f5875f3SDavid du Colombier         if (scalefac->l[sfb] == 0)
262*8f5875f3SDavid du Colombier             return 0;
263*8f5875f3SDavid du Colombier 
264*8f5875f3SDavid du Colombier     for (sfb = cod_info->sfb_smin; sfb < SBPSY_s; sfb++)
265*8f5875f3SDavid du Colombier         for (i = 0; i < 3; i++)
266*8f5875f3SDavid du Colombier             if (scalefac->s[sfb][i] == 0 && cod_info->subblock_gain[i] == 0)
267*8f5875f3SDavid du Colombier                 return 0;
268*8f5875f3SDavid du Colombier 
269*8f5875f3SDavid du Colombier     return 1;
270*8f5875f3SDavid du Colombier }
271*8f5875f3SDavid du Colombier 
272*8f5875f3SDavid du Colombier 
273*8f5875f3SDavid du Colombier 
274*8f5875f3SDavid du Colombier 
275*8f5875f3SDavid du Colombier /*************************************************************************
276*8f5875f3SDavid du Colombier  *
277*8f5875f3SDavid du Colombier  *      quant_compare()
278*8f5875f3SDavid du Colombier  *
279*8f5875f3SDavid du Colombier  *  author/date??
280*8f5875f3SDavid du Colombier  *
281*8f5875f3SDavid du Colombier  *  several different codes to decide which quantization is better
282*8f5875f3SDavid du Colombier  *
283*8f5875f3SDavid du Colombier  *************************************************************************/
284*8f5875f3SDavid du Colombier 
285*8f5875f3SDavid du Colombier inline
286*8f5875f3SDavid du Colombier static int
quant_compare(const int experimentalX,const calc_noise_result * const best,const calc_noise_result * const calc)287*8f5875f3SDavid du Colombier quant_compare(
288*8f5875f3SDavid du Colombier     const int                       experimentalX,
289*8f5875f3SDavid du Colombier     const calc_noise_result * const best,
290*8f5875f3SDavid du Colombier     const calc_noise_result * const calc )
291*8f5875f3SDavid du Colombier {
292*8f5875f3SDavid du Colombier     /*
293*8f5875f3SDavid du Colombier        noise is given in decibels (dB) relative to masking thesholds.
294*8f5875f3SDavid du Colombier 
295*8f5875f3SDavid du Colombier        over_noise:  ??? (the previous comment is fully wrong)
296*8f5875f3SDavid du Colombier        tot_noise:   ??? (the previous comment is fully wrong)
297*8f5875f3SDavid du Colombier        max_noise:   max quantization noise
298*8f5875f3SDavid du Colombier 
299*8f5875f3SDavid du Colombier      */
300*8f5875f3SDavid du Colombier     int better;
301*8f5875f3SDavid du Colombier 
302*8f5875f3SDavid du Colombier     switch (experimentalX) {
303*8f5875f3SDavid du Colombier         default:
304*8f5875f3SDavid du Colombier         case 0:
305*8f5875f3SDavid du Colombier 	    better = calc->over_count  < best->over_count
306*8f5875f3SDavid du Colombier                ||  ( calc->over_count == best->over_count  &&
307*8f5875f3SDavid du Colombier                      calc->over_noise  < best->over_noise )
308*8f5875f3SDavid du Colombier                ||  ( calc->over_count == best->over_count  &&
309*8f5875f3SDavid du Colombier                      calc->over_noise == best->over_noise  &&
310*8f5875f3SDavid du Colombier                      calc->tot_noise   < best->tot_noise  );
311*8f5875f3SDavid du Colombier 	    break;
312*8f5875f3SDavid du Colombier         case 1:
313*8f5875f3SDavid du Colombier 	    better = calc->max_noise < best->max_noise;
314*8f5875f3SDavid du Colombier 	    break;
315*8f5875f3SDavid du Colombier         case 2:
316*8f5875f3SDavid du Colombier 	    better = calc->tot_noise < best->tot_noise;
317*8f5875f3SDavid du Colombier 	    break;
318*8f5875f3SDavid du Colombier         case 3:
319*8f5875f3SDavid du Colombier 	    better = calc->tot_noise < best->tot_noise  &&
320*8f5875f3SDavid du Colombier                      calc->max_noise < best->max_noise+2;
321*8f5875f3SDavid du Colombier 	    break;
322*8f5875f3SDavid du Colombier         case 4:
323*8f5875f3SDavid du Colombier 	    better = ( calc->max_noise <= 0  &&
324*8f5875f3SDavid du Colombier                        best->max_noise >  2 )
325*8f5875f3SDavid du Colombier                  ||  ( calc->max_noise <= 0  &&
326*8f5875f3SDavid du Colombier                        best->max_noise <  0  &&
327*8f5875f3SDavid du Colombier                        best->max_noise >  calc->max_noise-2  &&
328*8f5875f3SDavid du Colombier                        calc->tot_noise <  best->tot_noise )
329*8f5875f3SDavid du Colombier                  ||  ( calc->max_noise <= 0  &&
330*8f5875f3SDavid du Colombier                        best->max_noise >  0  &&
331*8f5875f3SDavid du Colombier                        best->max_noise >  calc->max_noise-2  &&
332*8f5875f3SDavid du Colombier                        calc->tot_noise <  best->tot_noise+best->over_noise )
333*8f5875f3SDavid du Colombier                  ||  ( calc->max_noise >  0  &&
334*8f5875f3SDavid du Colombier                        best->max_noise > -0.5  &&
335*8f5875f3SDavid du Colombier                        best->max_noise >  calc->max_noise-1  &&
336*8f5875f3SDavid du Colombier                        calc->tot_noise+calc->over_noise < best->tot_noise+best->over_noise )
337*8f5875f3SDavid du Colombier                  ||  ( calc->max_noise >  0  &&
338*8f5875f3SDavid du Colombier                        best->max_noise > -1  &&
339*8f5875f3SDavid du Colombier                        best->max_noise >  calc->max_noise-1.5  &&
340*8f5875f3SDavid du Colombier                        calc->tot_noise+calc->over_noise+calc->over_noise < best->tot_noise+best->over_noise+best->over_noise );
341*8f5875f3SDavid du Colombier             break;
342*8f5875f3SDavid du Colombier         case 5:
343*8f5875f3SDavid du Colombier 	    better =   calc->over_noise  < best->over_noise
344*8f5875f3SDavid du Colombier                  ||  ( calc->over_noise == best->over_noise  &&
345*8f5875f3SDavid du Colombier                        calc->tot_noise   < best->tot_noise );
346*8f5875f3SDavid du Colombier 	    break;
347*8f5875f3SDavid du Colombier         case 6:
348*8f5875f3SDavid du Colombier 	    better =   calc->over_noise  < best->over_noise
349*8f5875f3SDavid du Colombier                  ||  ( calc->over_noise == best->over_noise  &&
350*8f5875f3SDavid du Colombier                      ( calc->max_noise   < best->max_noise
351*8f5875f3SDavid du Colombier 		     ||  ( calc->max_noise  == best->max_noise  &&
352*8f5875f3SDavid du Colombier                            calc->tot_noise  <= best->tot_noise )
353*8f5875f3SDavid du Colombier 		      ));
354*8f5875f3SDavid du Colombier 	    break;
355*8f5875f3SDavid du Colombier         case 7:
356*8f5875f3SDavid du Colombier 	    better =   calc->over_count < best->over_count
357*8f5875f3SDavid du Colombier                    ||  calc->over_noise < best->over_noise;
358*8f5875f3SDavid du Colombier 	    break;
359*8f5875f3SDavid du Colombier         case 8:
360*8f5875f3SDavid du Colombier 	    better =   calc->klemm_noise < best->klemm_noise;
361*8f5875f3SDavid du Colombier             break;
362*8f5875f3SDavid du Colombier     }
363*8f5875f3SDavid du Colombier 
364*8f5875f3SDavid du Colombier     return better;
365*8f5875f3SDavid du Colombier }
366*8f5875f3SDavid du Colombier 
367*8f5875f3SDavid du Colombier 
368*8f5875f3SDavid du Colombier 
369*8f5875f3SDavid du Colombier /*************************************************************************
370*8f5875f3SDavid du Colombier  *
371*8f5875f3SDavid du Colombier  *          amp_scalefac_bands()
372*8f5875f3SDavid du Colombier  *
373*8f5875f3SDavid du Colombier  *  author/date??
374*8f5875f3SDavid du Colombier  *
375*8f5875f3SDavid du Colombier  *  Amplify the scalefactor bands that violate the masking threshold.
376*8f5875f3SDavid du Colombier  *  See ISO 11172-3 Section C.1.5.4.3.5
377*8f5875f3SDavid du Colombier  *
378*8f5875f3SDavid du Colombier  *  distort[] = noise/masking
379*8f5875f3SDavid du Colombier  *  distort[] > 1   ==> noise is not masked
380*8f5875f3SDavid du Colombier  *  distort[] < 1   ==> noise is masked
381*8f5875f3SDavid du Colombier  *  max_dist = maximum value of distort[]
382*8f5875f3SDavid du Colombier  *
383*8f5875f3SDavid du Colombier  *  Three algorithms:
384*8f5875f3SDavid du Colombier  *  noise_shaping_amp
385*8f5875f3SDavid du Colombier  *        0             Amplify all bands with distort[]>1.
386*8f5875f3SDavid du Colombier  *
387*8f5875f3SDavid du Colombier  *        1             Amplify all bands with distort[] >= max_dist^(.5);
388*8f5875f3SDavid du Colombier  *                     ( 50% in the db scale)
389*8f5875f3SDavid du Colombier  *
390*8f5875f3SDavid du Colombier  *        2             Amplify first band with distort[] >= max_dist;
391*8f5875f3SDavid du Colombier  *
392*8f5875f3SDavid du Colombier  *
393*8f5875f3SDavid du Colombier  *  For algorithms 0 and 1, if max_dist < 1, then amplify all bands
394*8f5875f3SDavid du Colombier  *  with distort[] >= .95*max_dist.  This is to make sure we always
395*8f5875f3SDavid du Colombier  *  amplify at least one band.
396*8f5875f3SDavid du Colombier  *
397*8f5875f3SDavid du Colombier  *
398*8f5875f3SDavid du Colombier  *************************************************************************/
399*8f5875f3SDavid du Colombier static void
amp_scalefac_bands(lame_global_flags * gfp,const gr_info * const cod_info,III_scalefac_t * const scalefac,III_psy_xmin * distort,FLOAT8 xrpow[576])400*8f5875f3SDavid du Colombier amp_scalefac_bands(
401*8f5875f3SDavid du Colombier     lame_global_flags *gfp,
402*8f5875f3SDavid du Colombier     const gr_info  *const cod_info,
403*8f5875f3SDavid du Colombier     III_scalefac_t *const scalefac,
404*8f5875f3SDavid du Colombier     III_psy_xmin *distort,
405*8f5875f3SDavid du Colombier     FLOAT8 xrpow[576] )
406*8f5875f3SDavid du Colombier {
407*8f5875f3SDavid du Colombier   lame_internal_flags *gfc=gfp->internal_flags;
408*8f5875f3SDavid du Colombier   int start, end, l,i,j,sfb;
409*8f5875f3SDavid du Colombier   FLOAT8 ifqstep34, trigger;
410*8f5875f3SDavid du Colombier 
411*8f5875f3SDavid du Colombier   if (cod_info->scalefac_scale == 0) {
412*8f5875f3SDavid du Colombier     ifqstep34 = 1.29683955465100964055; /* 2**(.75*.5)*/
413*8f5875f3SDavid du Colombier   } else {
414*8f5875f3SDavid du Colombier     ifqstep34 = 1.68179283050742922612;  /* 2**(.75*1) */
415*8f5875f3SDavid du Colombier   }
416*8f5875f3SDavid du Colombier 
417*8f5875f3SDavid du Colombier   /* compute maximum value of distort[]  */
418*8f5875f3SDavid du Colombier   trigger = 0;
419*8f5875f3SDavid du Colombier   for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++) {
420*8f5875f3SDavid du Colombier     if (trigger < distort->l[sfb])
421*8f5875f3SDavid du Colombier         trigger = distort->l[sfb];
422*8f5875f3SDavid du Colombier   }
423*8f5875f3SDavid du Colombier   for (sfb = cod_info->sfb_smin; sfb < SBPSY_s; sfb++) {
424*8f5875f3SDavid du Colombier     for (i = 0; i < 3; i++ ) {
425*8f5875f3SDavid du Colombier       if (trigger < distort->s[sfb][i])
426*8f5875f3SDavid du Colombier           trigger = distort->s[sfb][i];
427*8f5875f3SDavid du Colombier     }
428*8f5875f3SDavid du Colombier   }
429*8f5875f3SDavid du Colombier 
430*8f5875f3SDavid du Colombier   switch (gfc->noise_shaping_amp) {
431*8f5875f3SDavid du Colombier 
432*8f5875f3SDavid du Colombier   case 2:
433*8f5875f3SDavid du Colombier     /* amplify exactly 1 band */
434*8f5875f3SDavid du Colombier     //trigger = distort_thresh;
435*8f5875f3SDavid du Colombier     break;
436*8f5875f3SDavid du Colombier 
437*8f5875f3SDavid du Colombier   case 1:
438*8f5875f3SDavid du Colombier     /* amplify bands within 50% of max (on db scale) */
439*8f5875f3SDavid du Colombier     if (trigger>1.0)
440*8f5875f3SDavid du Colombier         trigger = pow(trigger, .5);
441*8f5875f3SDavid du Colombier     else
442*8f5875f3SDavid du Colombier       trigger *= .95;
443*8f5875f3SDavid du Colombier     break;
444*8f5875f3SDavid du Colombier 
445*8f5875f3SDavid du Colombier   case 0:
446*8f5875f3SDavid du Colombier   default:
447*8f5875f3SDavid du Colombier     /* ISO algorithm.  amplify all bands with distort>1 */
448*8f5875f3SDavid du Colombier     if (trigger>1.0)
449*8f5875f3SDavid du Colombier         trigger=1.0;
450*8f5875f3SDavid du Colombier     else
451*8f5875f3SDavid du Colombier         trigger *= .95;
452*8f5875f3SDavid du Colombier     break;
453*8f5875f3SDavid du Colombier   }
454*8f5875f3SDavid du Colombier 
455*8f5875f3SDavid du Colombier   for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ) {
456*8f5875f3SDavid du Colombier     start = gfc->scalefac_band.l[sfb];
457*8f5875f3SDavid du Colombier     end   = gfc->scalefac_band.l[sfb+1];
458*8f5875f3SDavid du Colombier     if (distort->l[sfb]>=trigger  ) {
459*8f5875f3SDavid du Colombier       scalefac->l[sfb]++;
460*8f5875f3SDavid du Colombier       for ( l = start; l < end; l++ )
461*8f5875f3SDavid du Colombier 	xrpow[l] *= ifqstep34;
462*8f5875f3SDavid du Colombier       if (gfc->noise_shaping_amp==2) goto done;
463*8f5875f3SDavid du Colombier     }
464*8f5875f3SDavid du Colombier   }
465*8f5875f3SDavid du Colombier 
466*8f5875f3SDavid du Colombier   for ( j=0,sfb = cod_info->sfb_smin; sfb < SBPSY_s; sfb++ ) {
467*8f5875f3SDavid du Colombier     start = gfc->scalefac_band.s[sfb];
468*8f5875f3SDavid du Colombier     end   = gfc->scalefac_band.s[sfb+1];
469*8f5875f3SDavid du Colombier     for ( i = 0; i < 3; i++ ) {
470*8f5875f3SDavid du Colombier       int j2 = j;
471*8f5875f3SDavid du Colombier       if ( distort->s[sfb][i]>=trigger) {
472*8f5875f3SDavid du Colombier 	scalefac->s[sfb][i]++;
473*8f5875f3SDavid du Colombier 	for (l = start; l < end; l++)
474*8f5875f3SDavid du Colombier 	  xrpow[j2++] *= ifqstep34;
475*8f5875f3SDavid du Colombier         if (gfc->noise_shaping_amp==2) goto done;
476*8f5875f3SDavid du Colombier       }
477*8f5875f3SDavid du Colombier       j += end-start;
478*8f5875f3SDavid du Colombier     }
479*8f5875f3SDavid du Colombier   }
480*8f5875f3SDavid du Colombier  done:
481*8f5875f3SDavid du Colombier  return;
482*8f5875f3SDavid du Colombier }
483*8f5875f3SDavid du Colombier 
484*8f5875f3SDavid du Colombier /*************************************************************************
485*8f5875f3SDavid du Colombier  *
486*8f5875f3SDavid du Colombier  *      inc_scalefac_scale()
487*8f5875f3SDavid du Colombier  *
488*8f5875f3SDavid du Colombier  *  Takehiro Tominaga 2000-xx-xx
489*8f5875f3SDavid du Colombier  *
490*8f5875f3SDavid du Colombier  *  turns on scalefac scale and adjusts scalefactors
491*8f5875f3SDavid du Colombier  *
492*8f5875f3SDavid du Colombier  *************************************************************************/
493*8f5875f3SDavid du Colombier 
494*8f5875f3SDavid du Colombier static void
inc_scalefac_scale(const lame_internal_flags * const gfc,gr_info * const cod_info,III_scalefac_t * const scalefac,FLOAT8 xrpow[576])495*8f5875f3SDavid du Colombier inc_scalefac_scale (
496*8f5875f3SDavid du Colombier     const lame_internal_flags        * const gfc,
497*8f5875f3SDavid du Colombier           gr_info        * const cod_info,
498*8f5875f3SDavid du Colombier           III_scalefac_t * const scalefac,
499*8f5875f3SDavid du Colombier           FLOAT8                 xrpow[576] )
500*8f5875f3SDavid du Colombier {
501*8f5875f3SDavid du Colombier     int start, end, l,i,j;
502*8f5875f3SDavid du Colombier     int sfb;
503*8f5875f3SDavid du Colombier     const FLOAT8 ifqstep34 = 1.29683955465100964055;
504*8f5875f3SDavid du Colombier 
505*8f5875f3SDavid du Colombier     for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++) {
506*8f5875f3SDavid du Colombier         int s = scalefac->l[sfb] + (cod_info->preflag ? pretab[sfb] : 0);
507*8f5875f3SDavid du Colombier         if (s & 1) {
508*8f5875f3SDavid du Colombier             s++;
509*8f5875f3SDavid du Colombier             start = gfc->scalefac_band.l[sfb];
510*8f5875f3SDavid du Colombier             end   = gfc->scalefac_band.l[sfb+1];
511*8f5875f3SDavid du Colombier             for (l = start; l < end; l++)
512*8f5875f3SDavid du Colombier                 xrpow[l] *= ifqstep34;
513*8f5875f3SDavid du Colombier         }
514*8f5875f3SDavid du Colombier         scalefac->l[sfb]  = s >> 1;
515*8f5875f3SDavid du Colombier         cod_info->preflag = 0;
516*8f5875f3SDavid du Colombier     }
517*8f5875f3SDavid du Colombier 
518*8f5875f3SDavid du Colombier     for (j = 0, sfb = cod_info->sfb_smin; sfb < SBPSY_s; sfb++) {
519*8f5875f3SDavid du Colombier     start = gfc->scalefac_band.s[sfb];
520*8f5875f3SDavid du Colombier     end   = gfc->scalefac_band.s[sfb+1];
521*8f5875f3SDavid du Colombier     for (i = 0; i < 3; i++) {
522*8f5875f3SDavid du Colombier         int j2 = j;
523*8f5875f3SDavid du Colombier         if (scalefac->s[sfb][i] & 1) {
524*8f5875f3SDavid du Colombier         scalefac->s[sfb][i]++;
525*8f5875f3SDavid du Colombier         for (l = start; l < end; l++)
526*8f5875f3SDavid du Colombier             xrpow[j2++] *= ifqstep34;
527*8f5875f3SDavid du Colombier         }
528*8f5875f3SDavid du Colombier         scalefac->s[sfb][i] >>= 1;
529*8f5875f3SDavid du Colombier         j += end-start;
530*8f5875f3SDavid du Colombier     }
531*8f5875f3SDavid du Colombier     }
532*8f5875f3SDavid du Colombier     cod_info->scalefac_scale = 1;
533*8f5875f3SDavid du Colombier }
534*8f5875f3SDavid du Colombier 
535*8f5875f3SDavid du Colombier 
536*8f5875f3SDavid du Colombier 
537*8f5875f3SDavid du Colombier /*************************************************************************
538*8f5875f3SDavid du Colombier  *
539*8f5875f3SDavid du Colombier  *      inc_subblock_gain()
540*8f5875f3SDavid du Colombier  *
541*8f5875f3SDavid du Colombier  *  Takehiro Tominaga 2000-xx-xx
542*8f5875f3SDavid du Colombier  *
543*8f5875f3SDavid du Colombier  *  increases the subblock gain and adjusts scalefactors
544*8f5875f3SDavid du Colombier  *
545*8f5875f3SDavid du Colombier  *************************************************************************/
546*8f5875f3SDavid du Colombier 
547*8f5875f3SDavid du Colombier static int
inc_subblock_gain(const lame_internal_flags * const gfc,gr_info * const cod_info,III_scalefac_t * const scalefac,FLOAT8 xrpow[576])548*8f5875f3SDavid du Colombier inc_subblock_gain (
549*8f5875f3SDavid du Colombier     const lame_internal_flags        * const gfc,
550*8f5875f3SDavid du Colombier           gr_info        * const cod_info,
551*8f5875f3SDavid du Colombier           III_scalefac_t * const scalefac,
552*8f5875f3SDavid du Colombier           FLOAT8                 xrpow[576] )
553*8f5875f3SDavid du Colombier {
554*8f5875f3SDavid du Colombier     int window;
555*8f5875f3SDavid du Colombier 
556*8f5875f3SDavid du Colombier     for (window = 0; window < 3; window++) {
557*8f5875f3SDavid du Colombier         int s1, s2, l;
558*8f5875f3SDavid du Colombier         int sfb;
559*8f5875f3SDavid du Colombier         s1 = s2 = 0;
560*8f5875f3SDavid du Colombier 
561*8f5875f3SDavid du Colombier         for (sfb = cod_info->sfb_smin; sfb < 6; sfb++) {
562*8f5875f3SDavid du Colombier             if (s1 < scalefac->s[sfb][window])
563*8f5875f3SDavid du Colombier             s1 = scalefac->s[sfb][window];
564*8f5875f3SDavid du Colombier         }
565*8f5875f3SDavid du Colombier         for (; sfb < SBPSY_s; sfb++) {
566*8f5875f3SDavid du Colombier             if (s2 < scalefac->s[sfb][window])
567*8f5875f3SDavid du Colombier             s2 = scalefac->s[sfb][window];
568*8f5875f3SDavid du Colombier         }
569*8f5875f3SDavid du Colombier 
570*8f5875f3SDavid du Colombier         if (s1 < 16 && s2 < 8)
571*8f5875f3SDavid du Colombier             continue;
572*8f5875f3SDavid du Colombier 
573*8f5875f3SDavid du Colombier         if (cod_info->subblock_gain[window] >= 7)
574*8f5875f3SDavid du Colombier             return 1;
575*8f5875f3SDavid du Colombier 
576*8f5875f3SDavid du Colombier         /* even though there is no scalefactor for sfb12
577*8f5875f3SDavid du Colombier          * subblock gain affects upper frequencies too, that's why
578*8f5875f3SDavid du Colombier          * we have to go up to SBMAX_s
579*8f5875f3SDavid du Colombier          */
580*8f5875f3SDavid du Colombier         cod_info->subblock_gain[window]++;
581*8f5875f3SDavid du Colombier         for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) {
582*8f5875f3SDavid du Colombier             int i, width;
583*8f5875f3SDavid du Colombier             int s = scalefac->s[sfb][window];
584*8f5875f3SDavid du Colombier             FLOAT8 amp;
585*8f5875f3SDavid du Colombier 
586*8f5875f3SDavid du Colombier             if (s < 0)
587*8f5875f3SDavid du Colombier                 continue;
588*8f5875f3SDavid du Colombier             s = s - (4 >> cod_info->scalefac_scale);
589*8f5875f3SDavid du Colombier             if (s >= 0) {
590*8f5875f3SDavid du Colombier                 scalefac->s[sfb][window] = s;
591*8f5875f3SDavid du Colombier                 continue;
592*8f5875f3SDavid du Colombier             }
593*8f5875f3SDavid du Colombier 
594*8f5875f3SDavid du Colombier             scalefac->s[sfb][window] = 0;
595*8f5875f3SDavid du Colombier             width = gfc->scalefac_band.s[sfb] - gfc->scalefac_band.s[sfb+1];
596*8f5875f3SDavid du Colombier             i = gfc->scalefac_band.s[sfb] * 3 + width * window;
597*8f5875f3SDavid du Colombier             amp = IPOW20(210 + (s << (cod_info->scalefac_scale + 1)));
598*8f5875f3SDavid du Colombier             for (l = 0; l < width; l++) {
599*8f5875f3SDavid du Colombier                 xrpow[l] *= amp;
600*8f5875f3SDavid du Colombier             }
601*8f5875f3SDavid du Colombier         }
602*8f5875f3SDavid du Colombier     }
603*8f5875f3SDavid du Colombier     return 0;
604*8f5875f3SDavid du Colombier }
605*8f5875f3SDavid du Colombier 
606*8f5875f3SDavid du Colombier 
607*8f5875f3SDavid du Colombier 
608*8f5875f3SDavid du Colombier /********************************************************************
609*8f5875f3SDavid du Colombier  *
610*8f5875f3SDavid du Colombier  *      balance_noise()
611*8f5875f3SDavid du Colombier  *
612*8f5875f3SDavid du Colombier  *  Takehiro Tominaga /date??
613*8f5875f3SDavid du Colombier  *  Robert Hegemann 2000-09-06: made a function of it
614*8f5875f3SDavid du Colombier  *
615*8f5875f3SDavid du Colombier  *  amplifies scalefactor bands,
616*8f5875f3SDavid du Colombier  *   - if all are already amplified returns 0
617*8f5875f3SDavid du Colombier  *   - if some bands are amplified too much:
618*8f5875f3SDavid du Colombier  *      * try to increase scalefac_scale
619*8f5875f3SDavid du Colombier  *      * if already scalefac_scale was set
620*8f5875f3SDavid du Colombier  *          try on short blocks to increase subblock gain
621*8f5875f3SDavid du Colombier  *
622*8f5875f3SDavid du Colombier  ********************************************************************/
623*8f5875f3SDavid du Colombier inline
624*8f5875f3SDavid du Colombier static int
balance_noise(lame_global_flags * const gfp,gr_info * const cod_info,III_scalefac_t * const scalefac,III_psy_xmin * distort,FLOAT8 xrpow[576])625*8f5875f3SDavid du Colombier balance_noise (
626*8f5875f3SDavid du Colombier     lame_global_flags  *const gfp,
627*8f5875f3SDavid du Colombier     gr_info        * const cod_info,
628*8f5875f3SDavid du Colombier     III_scalefac_t * const scalefac,
629*8f5875f3SDavid du Colombier     III_psy_xmin           *distort,
630*8f5875f3SDavid du Colombier     FLOAT8                 xrpow[576] )
631*8f5875f3SDavid du Colombier {
632*8f5875f3SDavid du Colombier     lame_internal_flags *const gfc = (lame_internal_flags *)gfp->internal_flags;
633*8f5875f3SDavid du Colombier     int status;
634*8f5875f3SDavid du Colombier 
635*8f5875f3SDavid du Colombier     amp_scalefac_bands ( gfp, cod_info, scalefac, distort, xrpow);
636*8f5875f3SDavid du Colombier 
637*8f5875f3SDavid du Colombier     /* check to make sure we have not amplified too much
638*8f5875f3SDavid du Colombier      * loop_break returns 0 if there is an unamplified scalefac
639*8f5875f3SDavid du Colombier      * scale_bitcount returns 0 if no scalefactors are too large
640*8f5875f3SDavid du Colombier      */
641*8f5875f3SDavid du Colombier 
642*8f5875f3SDavid du Colombier     status = loop_break (cod_info, scalefac);
643*8f5875f3SDavid du Colombier 
644*8f5875f3SDavid du Colombier     if (status)
645*8f5875f3SDavid du Colombier         return 0; /* all bands amplified */
646*8f5875f3SDavid du Colombier 
647*8f5875f3SDavid du Colombier     /* not all scalefactors have been amplified.  so these
648*8f5875f3SDavid du Colombier      * scalefacs are possibly valid.  encode them:
649*8f5875f3SDavid du Colombier      */
650*8f5875f3SDavid du Colombier     if (gfc->is_mpeg1)
651*8f5875f3SDavid du Colombier         status = scale_bitcount (scalefac, cod_info);
652*8f5875f3SDavid du Colombier     else
653*8f5875f3SDavid du Colombier         status = scale_bitcount_lsf (gfc, scalefac, cod_info);
654*8f5875f3SDavid du Colombier 
655*8f5875f3SDavid du Colombier     if (!status)
656*8f5875f3SDavid du Colombier         return 1; /* amplified some bands not exceeding limits */
657*8f5875f3SDavid du Colombier 
658*8f5875f3SDavid du Colombier     /*  some scalefactors are too large.
659*8f5875f3SDavid du Colombier      *  lets try setting scalefac_scale=1
660*8f5875f3SDavid du Colombier      */
661*8f5875f3SDavid du Colombier     if (gfc->noise_shaping > 1) {
662*8f5875f3SDavid du Colombier 	if (!cod_info->scalefac_scale) {
663*8f5875f3SDavid du Colombier 	    inc_scalefac_scale (gfc, cod_info, scalefac, xrpow);
664*8f5875f3SDavid du Colombier 	    status = 0;
665*8f5875f3SDavid du Colombier 	} else {
666*8f5875f3SDavid du Colombier 	    if (cod_info->block_type == SHORT_TYPE ) {
667*8f5875f3SDavid du Colombier 		status = inc_subblock_gain (gfc, cod_info, scalefac, xrpow)
668*8f5875f3SDavid du Colombier 		    || loop_break (cod_info, scalefac);
669*8f5875f3SDavid du Colombier 	    }
670*8f5875f3SDavid du Colombier 	}
671*8f5875f3SDavid du Colombier     }
672*8f5875f3SDavid du Colombier 
673*8f5875f3SDavid du Colombier     if (!status) {
674*8f5875f3SDavid du Colombier         if (gfc->is_mpeg1 == 1)
675*8f5875f3SDavid du Colombier             status = scale_bitcount (scalefac, cod_info);
676*8f5875f3SDavid du Colombier         else
677*8f5875f3SDavid du Colombier             status = scale_bitcount_lsf (gfc, scalefac, cod_info);
678*8f5875f3SDavid du Colombier     }
679*8f5875f3SDavid du Colombier     return !status;
680*8f5875f3SDavid du Colombier }
681*8f5875f3SDavid du Colombier 
682*8f5875f3SDavid du Colombier 
683*8f5875f3SDavid du Colombier 
684*8f5875f3SDavid du Colombier /************************************************************************
685*8f5875f3SDavid du Colombier  *
686*8f5875f3SDavid du Colombier  *  outer_loop ()
687*8f5875f3SDavid du Colombier  *
688*8f5875f3SDavid du Colombier  *  Function: The outer iteration loop controls the masking conditions
689*8f5875f3SDavid du Colombier  *  of all scalefactorbands. It computes the best scalefac and
690*8f5875f3SDavid du Colombier  *  global gain. This module calls the inner iteration loop
691*8f5875f3SDavid du Colombier  *
692*8f5875f3SDavid du Colombier  *  mt 5/99 completely rewritten to allow for bit reservoir control,
693*8f5875f3SDavid du Colombier  *  mid/side channels with L/R or mid/side masking thresholds,
694*8f5875f3SDavid du Colombier  *  and chooses best quantization instead of last quantization when
695*8f5875f3SDavid du Colombier  *  no distortion free quantization can be found.
696*8f5875f3SDavid du Colombier  *
697*8f5875f3SDavid du Colombier  *  added VBR support mt 5/99
698*8f5875f3SDavid du Colombier  *
699*8f5875f3SDavid du Colombier  *  some code shuffle rh 9/00
700*8f5875f3SDavid du Colombier  ************************************************************************/
701*8f5875f3SDavid du Colombier 
702*8f5875f3SDavid du Colombier static int
outer_loop(lame_global_flags * gfp,gr_info * const cod_info,const FLOAT8 xr[576],const III_psy_xmin * const l3_xmin,III_scalefac_t * const scalefac,FLOAT8 xrpow[576],int l3enc[576],const int ch,const int targ_bits)703*8f5875f3SDavid du Colombier outer_loop (
704*8f5875f3SDavid du Colombier    lame_global_flags *gfp,
705*8f5875f3SDavid du Colombier           gr_info        * const cod_info,
706*8f5875f3SDavid du Colombier     const FLOAT8                 xr[576],   /* magnitudes of spectral values */
707*8f5875f3SDavid du Colombier     const III_psy_xmin   * const l3_xmin,   /* allowed distortion of the scalefactor */
708*8f5875f3SDavid du Colombier           III_scalefac_t * const scalefac,  /* scalefactors */
709*8f5875f3SDavid du Colombier           FLOAT8                 xrpow[576], /* coloured magnitudes of spectral values */
710*8f5875f3SDavid du Colombier           int                    l3enc[576], /* vector of quantized values ix(0..575) */
711*8f5875f3SDavid du Colombier     const int                    ch,
712*8f5875f3SDavid du Colombier     const int                    targ_bits )  /* maximum allowed bits */
713*8f5875f3SDavid du Colombier {
714*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
715*8f5875f3SDavid du Colombier     III_scalefac_t save_scalefac;
716*8f5875f3SDavid du Colombier     gr_info save_cod_info;
717*8f5875f3SDavid du Colombier     FLOAT8 save_xrpow[576];
718*8f5875f3SDavid du Colombier     III_psy_xmin   distort;
719*8f5875f3SDavid du Colombier     calc_noise_result noise_info;
720*8f5875f3SDavid du Colombier     calc_noise_result best_noise_info;
721*8f5875f3SDavid du Colombier     int l3_enc_w[576];
722*8f5875f3SDavid du Colombier     int iteration = 0;
723*8f5875f3SDavid du Colombier     int bits_found = 0;
724*8f5875f3SDavid du Colombier     int huff_bits;
725*8f5875f3SDavid du Colombier     int real_bits;
726*8f5875f3SDavid du Colombier     int better;
727*8f5875f3SDavid du Colombier     int over=0;
728*8f5875f3SDavid du Colombier 
729*8f5875f3SDavid du Colombier     int notdone = 1;
730*8f5875f3SDavid du Colombier     int copy = 0;
731*8f5875f3SDavid du Colombier     int age = 0;
732*8f5875f3SDavid du Colombier 
733*8f5875f3SDavid du Colombier     noise_info.over_count = 100;
734*8f5875f3SDavid du Colombier     noise_info.tot_count  = 100;
735*8f5875f3SDavid du Colombier     noise_info.max_noise  = 0;
736*8f5875f3SDavid du Colombier     noise_info.tot_noise  = 0;
737*8f5875f3SDavid du Colombier     noise_info.over_noise = 0;
738*8f5875f3SDavid du Colombier 
739*8f5875f3SDavid du Colombier     best_noise_info.over_count = 100;
740*8f5875f3SDavid du Colombier 
741*8f5875f3SDavid du Colombier     bits_found = bin_search_StepSize (gfc, cod_info, targ_bits,
742*8f5875f3SDavid du Colombier                                       gfc->OldValue[ch], xrpow, l3_enc_w);
743*8f5875f3SDavid du Colombier     gfc->OldValue[ch] = cod_info->global_gain;
744*8f5875f3SDavid du Colombier 
745*8f5875f3SDavid du Colombier     /* BEGIN MAIN LOOP */
746*8f5875f3SDavid du Colombier     do {
747*8f5875f3SDavid du Colombier         iteration ++;
748*8f5875f3SDavid du Colombier 
749*8f5875f3SDavid du Colombier         /* inner_loop starts with the initial quantization step computed above
750*8f5875f3SDavid du Colombier          * and slowly increases until the bits < huff_bits.
751*8f5875f3SDavid du Colombier          * Thus it is important not to start with too large of an inital
752*8f5875f3SDavid du Colombier          * quantization step.  Too small is ok, but inner_loop will take longer
753*8f5875f3SDavid du Colombier          */
754*8f5875f3SDavid du Colombier         huff_bits = targ_bits - cod_info->part2_length;
755*8f5875f3SDavid du Colombier         if (huff_bits < 0) {
756*8f5875f3SDavid du Colombier             assert(iteration != 1);
757*8f5875f3SDavid du Colombier             /*  scale factors too large, not enough bits.
758*8f5875f3SDavid du Colombier              *  use previous quantizaton */
759*8f5875f3SDavid du Colombier             break;
760*8f5875f3SDavid du Colombier         }
761*8f5875f3SDavid du Colombier         /*  if this is the first iteration,
762*8f5875f3SDavid du Colombier          *  see if we can reuse the quantization computed in
763*8f5875f3SDavid du Colombier          *  bin_search_StepSize above */
764*8f5875f3SDavid du Colombier 
765*8f5875f3SDavid du Colombier         if (iteration == 1) {
766*8f5875f3SDavid du Colombier             if (bits_found > huff_bits) {
767*8f5875f3SDavid du Colombier                 cod_info->global_gain++;
768*8f5875f3SDavid du Colombier                 real_bits = inner_loop (gfc, cod_info, huff_bits, xrpow,
769*8f5875f3SDavid du Colombier                                         l3_enc_w);
770*8f5875f3SDavid du Colombier             } else {
771*8f5875f3SDavid du Colombier                 real_bits = bits_found;
772*8f5875f3SDavid du Colombier             }
773*8f5875f3SDavid du Colombier         } else {
774*8f5875f3SDavid du Colombier             real_bits = inner_loop (gfc, cod_info, huff_bits, xrpow,
775*8f5875f3SDavid du Colombier                                     l3_enc_w);
776*8f5875f3SDavid du Colombier         }
777*8f5875f3SDavid du Colombier 
778*8f5875f3SDavid du Colombier         cod_info->part2_3_length = real_bits;
779*8f5875f3SDavid du Colombier 
780*8f5875f3SDavid du Colombier         /* compute the distortion in this quantization */
781*8f5875f3SDavid du Colombier         if (gfc->noise_shaping)
782*8f5875f3SDavid du Colombier             /* coefficients and thresholds both l/r (or both mid/side) */
783*8f5875f3SDavid du Colombier             over = calc_noise (gfc, xr, l3_enc_w, cod_info, l3_xmin,
784*8f5875f3SDavid du Colombier                                scalefac, &distort, &noise_info);
785*8f5875f3SDavid du Colombier         else {
786*8f5875f3SDavid du Colombier             /* fast mode, no noise shaping, we are ready */
787*8f5875f3SDavid du Colombier             best_noise_info = noise_info;
788*8f5875f3SDavid du Colombier             over = 0;
789*8f5875f3SDavid du Colombier             copy = 0;
790*8f5875f3SDavid du Colombier             memcpy(l3enc, l3_enc_w, sizeof(int)*576);
791*8f5875f3SDavid du Colombier             break;
792*8f5875f3SDavid du Colombier         }
793*8f5875f3SDavid du Colombier 
794*8f5875f3SDavid du Colombier 
795*8f5875f3SDavid du Colombier         /* check if this quantization is better
796*8f5875f3SDavid du Colombier          * than our saved quantization */
797*8f5875f3SDavid du Colombier         if (iteration == 1) /* the first iteration is always better */
798*8f5875f3SDavid du Colombier             better = 1;
799*8f5875f3SDavid du Colombier         else
800*8f5875f3SDavid du Colombier             better = quant_compare (gfp->experimentalX,
801*8f5875f3SDavid du Colombier                                     &best_noise_info, &noise_info);
802*8f5875f3SDavid du Colombier 
803*8f5875f3SDavid du Colombier         /* save data so we can restore this quantization later */
804*8f5875f3SDavid du Colombier         if (better) {
805*8f5875f3SDavid du Colombier             copy = 0;
806*8f5875f3SDavid du Colombier             best_noise_info = noise_info;
807*8f5875f3SDavid du Colombier             memcpy(l3enc, l3_enc_w, sizeof(int)*576);
808*8f5875f3SDavid du Colombier             age = 0;
809*8f5875f3SDavid du Colombier         }
810*8f5875f3SDavid du Colombier         else
811*8f5875f3SDavid du Colombier             age ++;
812*8f5875f3SDavid du Colombier 
813*8f5875f3SDavid du Colombier 
814*8f5875f3SDavid du Colombier         /******************************************************************/
815*8f5875f3SDavid du Colombier         /* stopping criterion */
816*8f5875f3SDavid du Colombier         /******************************************************************/
817*8f5875f3SDavid du Colombier         /* if no bands with distortion and -X0, we are done */
818*8f5875f3SDavid du Colombier         if (0==gfc->noise_shaping_stop &&
819*8f5875f3SDavid du Colombier             0==gfp->experimentalX &&
820*8f5875f3SDavid du Colombier 	    (over == 0 || best_noise_info.over_count == 0) )
821*8f5875f3SDavid du Colombier             break;
822*8f5875f3SDavid du Colombier         /* Otherwise, allow up to 3 unsuccesful tries in serial, then stop
823*8f5875f3SDavid du Colombier          * if our best quantization so far had no distorted bands. This
824*8f5875f3SDavid du Colombier          * gives us more possibilities for different quant_compare modes.
825*8f5875f3SDavid du Colombier          * Much more than 3 makes not a big difference, it is only slower.
826*8f5875f3SDavid du Colombier          */
827*8f5875f3SDavid du Colombier         if (age > 3 && best_noise_info.over_count == 0)
828*8f5875f3SDavid du Colombier             break;
829*8f5875f3SDavid du Colombier 
830*8f5875f3SDavid du Colombier 
831*8f5875f3SDavid du Colombier 
832*8f5875f3SDavid du Colombier 
833*8f5875f3SDavid du Colombier 
834*8f5875f3SDavid du Colombier         /* Check if the last scalefactor band is distorted.
835*8f5875f3SDavid du Colombier          * in VBR mode we can't get rid of the distortion, so quit now
836*8f5875f3SDavid du Colombier          * and VBR mode will try again with more bits.
837*8f5875f3SDavid du Colombier          * (makes a 10% speed increase, the files I tested were
838*8f5875f3SDavid du Colombier          * binary identical, 2000/05/20 Robert.Hegemann@gmx.de)
839*8f5875f3SDavid du Colombier          * distort[] > 1 means noise > allowed noise
840*8f5875f3SDavid du Colombier          */
841*8f5875f3SDavid du Colombier         if (gfc->sfb21_extra) {
842*8f5875f3SDavid du Colombier             if (cod_info->block_type == SHORT_TYPE) {
843*8f5875f3SDavid du Colombier                 if (distort.s[SBMAX_s-1][0] > 1 ||
844*8f5875f3SDavid du Colombier                     distort.s[SBMAX_s-1][1] > 1 ||
845*8f5875f3SDavid du Colombier                     distort.s[SBMAX_s-1][2] > 1) break;
846*8f5875f3SDavid du Colombier             } else {
847*8f5875f3SDavid du Colombier                 if (distort.l[SBMAX_l-1] > 1) break;
848*8f5875f3SDavid du Colombier             }
849*8f5875f3SDavid du Colombier         }
850*8f5875f3SDavid du Colombier 
851*8f5875f3SDavid du Colombier         /* save data so we can restore this quantization later */
852*8f5875f3SDavid du Colombier         if (better) {
853*8f5875f3SDavid du Colombier             copy = 1;
854*8f5875f3SDavid du Colombier             save_scalefac = *scalefac;
855*8f5875f3SDavid du Colombier             save_cod_info = *cod_info;
856*8f5875f3SDavid du Colombier             if (gfp->VBR == vbr_rh || gfp->VBR == vbr_mtrh) {
857*8f5875f3SDavid du Colombier                 /* store for later reuse */
858*8f5875f3SDavid du Colombier                 memcpy(save_xrpow, xrpow, sizeof(FLOAT8)*576);
859*8f5875f3SDavid du Colombier             }
860*8f5875f3SDavid du Colombier         }
861*8f5875f3SDavid du Colombier 
862*8f5875f3SDavid du Colombier         notdone = balance_noise (gfp, cod_info, scalefac, &distort, xrpow);
863*8f5875f3SDavid du Colombier 
864*8f5875f3SDavid du Colombier         if (notdone == 0)
865*8f5875f3SDavid du Colombier             break;
866*8f5875f3SDavid du Colombier     }
867*8f5875f3SDavid du Colombier     while (1); /* main iteration loop, breaks adjusted */
868*8f5875f3SDavid du Colombier 
869*8f5875f3SDavid du Colombier     /*  finish up
870*8f5875f3SDavid du Colombier      */
871*8f5875f3SDavid du Colombier     if (copy) {
872*8f5875f3SDavid du Colombier         *cod_info = save_cod_info;
873*8f5875f3SDavid du Colombier         *scalefac = save_scalefac;
874*8f5875f3SDavid du Colombier         if (gfp->VBR == vbr_rh || gfp->VBR == vbr_mtrh)
875*8f5875f3SDavid du Colombier             /* restore for reuse on next try */
876*8f5875f3SDavid du Colombier             memcpy(xrpow, save_xrpow, sizeof(FLOAT8)*576);
877*8f5875f3SDavid du Colombier     }
878*8f5875f3SDavid du Colombier     cod_info->part2_3_length += cod_info->part2_length;
879*8f5875f3SDavid du Colombier 
880*8f5875f3SDavid du Colombier     assert (cod_info->global_gain < 256);
881*8f5875f3SDavid du Colombier 
882*8f5875f3SDavid du Colombier     return best_noise_info.over_count;
883*8f5875f3SDavid du Colombier }
884*8f5875f3SDavid du Colombier 
885*8f5875f3SDavid du Colombier 
886*8f5875f3SDavid du Colombier 
887*8f5875f3SDavid du Colombier 
888*8f5875f3SDavid du Colombier /************************************************************************
889*8f5875f3SDavid du Colombier  *
890*8f5875f3SDavid du Colombier  *      iteration_finish()
891*8f5875f3SDavid du Colombier  *
892*8f5875f3SDavid du Colombier  *  Robert Hegemann 2000-09-06
893*8f5875f3SDavid du Colombier  *
894*8f5875f3SDavid du Colombier  *  update reservoir status after FINAL quantization/bitrate
895*8f5875f3SDavid du Colombier  *
896*8f5875f3SDavid du Colombier  *  rh 2000-09-06: it will not work with CBR due to the bitstream formatter
897*8f5875f3SDavid du Colombier  *            you will get "Error: MAX_HEADER_BUF too small in bitstream.c"
898*8f5875f3SDavid du Colombier  *
899*8f5875f3SDavid du Colombier  ************************************************************************/
900*8f5875f3SDavid du Colombier 
901*8f5875f3SDavid du Colombier static void
iteration_finish(lame_internal_flags * gfc,FLOAT8 xr[2][2][576],int l3_enc[2][2][576],III_psy_ratio ratio[2][2],III_scalefac_t scalefac[2][2],const int mean_bits)902*8f5875f3SDavid du Colombier iteration_finish (
903*8f5875f3SDavid du Colombier     lame_internal_flags *gfc,
904*8f5875f3SDavid du Colombier     FLOAT8          xr      [2][2][576],
905*8f5875f3SDavid du Colombier     int             l3_enc  [2][2][576],
906*8f5875f3SDavid du Colombier     III_psy_ratio   ratio   [2][2],
907*8f5875f3SDavid du Colombier     III_scalefac_t  scalefac[2][2],
908*8f5875f3SDavid du Colombier     const int       mean_bits )
909*8f5875f3SDavid du Colombier {
910*8f5875f3SDavid du Colombier     III_side_info_t *l3_side = &gfc->l3_side;
911*8f5875f3SDavid du Colombier     int gr, ch, i;
912*8f5875f3SDavid du Colombier 
913*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
914*8f5875f3SDavid du Colombier         for (ch = 0; ch < gfc->channels_out; ch++) {
915*8f5875f3SDavid du Colombier             gr_info *cod_info = &l3_side->gr[gr].ch[ch].tt;
916*8f5875f3SDavid du Colombier 
917*8f5875f3SDavid du Colombier             /*  try some better scalefac storage
918*8f5875f3SDavid du Colombier              */
919*8f5875f3SDavid du Colombier             best_scalefac_store (gfc, gr, ch, l3_enc, l3_side, scalefac);
920*8f5875f3SDavid du Colombier 
921*8f5875f3SDavid du Colombier             /*  best huffman_divide may save some bits too
922*8f5875f3SDavid du Colombier              */
923*8f5875f3SDavid du Colombier             if (gfc->use_best_huffman == 1)
924*8f5875f3SDavid du Colombier                 best_huffman_divide (gfc, gr, ch, cod_info, l3_enc[gr][ch]);
925*8f5875f3SDavid du Colombier 
926*8f5875f3SDavid du Colombier             /*  update reservoir status after FINAL quantization/bitrate
927*8f5875f3SDavid du Colombier              */
928*8f5875f3SDavid du Colombier             ResvAdjust (gfc, cod_info, l3_side, mean_bits);
929*8f5875f3SDavid du Colombier 
930*8f5875f3SDavid du Colombier             /*  set the sign of l3_enc from the sign of xr
931*8f5875f3SDavid du Colombier              */
932*8f5875f3SDavid du Colombier             for (i = 0; i < 576; i++) {
933*8f5875f3SDavid du Colombier                 if (xr[gr][ch][i] < 0) l3_enc[gr][ch][i] *= -1;
934*8f5875f3SDavid du Colombier             }
935*8f5875f3SDavid du Colombier         } /* for ch */
936*8f5875f3SDavid du Colombier     }    /* for gr */
937*8f5875f3SDavid du Colombier 
938*8f5875f3SDavid du Colombier     ResvFrameEnd (gfc, l3_side, mean_bits);
939*8f5875f3SDavid du Colombier }
940*8f5875f3SDavid du Colombier 
941*8f5875f3SDavid du Colombier 
942*8f5875f3SDavid du Colombier 
943*8f5875f3SDavid du Colombier /*********************************************************************
944*8f5875f3SDavid du Colombier  *
945*8f5875f3SDavid du Colombier  *      VBR_encode_granule()
946*8f5875f3SDavid du Colombier  *
947*8f5875f3SDavid du Colombier  *  2000-09-04 Robert Hegemann
948*8f5875f3SDavid du Colombier  *
949*8f5875f3SDavid du Colombier  *********************************************************************/
950*8f5875f3SDavid du Colombier 
951*8f5875f3SDavid du Colombier static void
VBR_encode_granule(lame_global_flags * gfp,gr_info * const cod_info,FLOAT8 xr[576],const III_psy_xmin * const l3_xmin,III_scalefac_t * const scalefac,FLOAT8 xrpow[576],int l3_enc[576],const int ch,int min_bits,int max_bits)952*8f5875f3SDavid du Colombier VBR_encode_granule (
953*8f5875f3SDavid du Colombier           lame_global_flags *gfp,
954*8f5875f3SDavid du Colombier           gr_info        * const cod_info,
955*8f5875f3SDavid du Colombier           FLOAT8                 xr[576],     /* magnitudes of spectral values */
956*8f5875f3SDavid du Colombier     const III_psy_xmin   * const l3_xmin,     /* allowed distortion of the scalefactor */
957*8f5875f3SDavid du Colombier           III_scalefac_t * const scalefac,    /* scalefactors */
958*8f5875f3SDavid du Colombier           FLOAT8                 xrpow[576],  /* coloured magnitudes of spectral values */
959*8f5875f3SDavid du Colombier           int                    l3_enc[576], /* vector of quantized values ix(0..575) */
960*8f5875f3SDavid du Colombier     const int                    ch,
961*8f5875f3SDavid du Colombier           int                    min_bits,
962*8f5875f3SDavid du Colombier           int                    max_bits )
963*8f5875f3SDavid du Colombier {
964*8f5875f3SDavid du Colombier     //lame_internal_flags *gfc=gfp->internal_flags;
965*8f5875f3SDavid du Colombier     gr_info         bst_cod_info;
966*8f5875f3SDavid du Colombier     III_scalefac_t  bst_scalefac;
967*8f5875f3SDavid du Colombier     FLOAT8          bst_xrpow [576];
968*8f5875f3SDavid du Colombier     int             bst_l3_enc[576];
969*8f5875f3SDavid du Colombier     int Max_bits  = max_bits;
970*8f5875f3SDavid du Colombier     int real_bits = max_bits+1;
971*8f5875f3SDavid du Colombier     int this_bits = min_bits+(max_bits-min_bits)/2;
972*8f5875f3SDavid du Colombier     int dbits, over;
973*8f5875f3SDavid du Colombier 
974*8f5875f3SDavid du Colombier     assert(Max_bits <= MAX_BITS);
975*8f5875f3SDavid du Colombier 
976*8f5875f3SDavid du Colombier     bst_cod_info = *cod_info;
977*8f5875f3SDavid du Colombier     memset(&bst_scalefac, 0, sizeof(III_scalefac_t));
978*8f5875f3SDavid du Colombier     memcpy(&bst_xrpow, xrpow, sizeof(FLOAT8)*576);
979*8f5875f3SDavid du Colombier 
980*8f5875f3SDavid du Colombier     /*  search within round about 40 bits of optimal
981*8f5875f3SDavid du Colombier      */
982*8f5875f3SDavid du Colombier     do {
983*8f5875f3SDavid du Colombier         assert(this_bits >= min_bits);
984*8f5875f3SDavid du Colombier         assert(this_bits <= max_bits);
985*8f5875f3SDavid du Colombier 
986*8f5875f3SDavid du Colombier         over = outer_loop ( gfp, cod_info, xr, l3_xmin, scalefac,
987*8f5875f3SDavid du Colombier                             xrpow, l3_enc, ch, this_bits );
988*8f5875f3SDavid du Colombier 
989*8f5875f3SDavid du Colombier         /*  is quantization as good as we are looking for ?
990*8f5875f3SDavid du Colombier          *  in this case: is no scalefactor band distorted?
991*8f5875f3SDavid du Colombier          */
992*8f5875f3SDavid du Colombier         if (over <= 0) {
993*8f5875f3SDavid du Colombier             /*  now we know it can be done with "real_bits"
994*8f5875f3SDavid du Colombier              *  and maybe we can skip some iterations
995*8f5875f3SDavid du Colombier              */
996*8f5875f3SDavid du Colombier             real_bits = cod_info->part2_3_length;
997*8f5875f3SDavid du Colombier 
998*8f5875f3SDavid du Colombier             /*  store best quantization so far
999*8f5875f3SDavid du Colombier              */
1000*8f5875f3SDavid du Colombier             bst_cod_info = *cod_info;
1001*8f5875f3SDavid du Colombier             bst_scalefac = *scalefac;
1002*8f5875f3SDavid du Colombier             memcpy(bst_xrpow, xrpow, sizeof(FLOAT8)*576);
1003*8f5875f3SDavid du Colombier             memcpy(bst_l3_enc, l3_enc, sizeof(int)*576);
1004*8f5875f3SDavid du Colombier 
1005*8f5875f3SDavid du Colombier             /*  try with fewer bits
1006*8f5875f3SDavid du Colombier              */
1007*8f5875f3SDavid du Colombier             max_bits  = real_bits-32;
1008*8f5875f3SDavid du Colombier             dbits     = max_bits-min_bits;
1009*8f5875f3SDavid du Colombier             this_bits = min_bits+dbits/2;
1010*8f5875f3SDavid du Colombier         }
1011*8f5875f3SDavid du Colombier         else {
1012*8f5875f3SDavid du Colombier             /*  try with more bits
1013*8f5875f3SDavid du Colombier              */
1014*8f5875f3SDavid du Colombier             min_bits  = this_bits+32;
1015*8f5875f3SDavid du Colombier             dbits     = max_bits-min_bits;
1016*8f5875f3SDavid du Colombier             this_bits = min_bits+dbits/2;
1017*8f5875f3SDavid du Colombier 
1018*8f5875f3SDavid du Colombier             if (dbits>8) {
1019*8f5875f3SDavid du Colombier                 /*  start again with best quantization so far
1020*8f5875f3SDavid du Colombier                  */
1021*8f5875f3SDavid du Colombier                 *cod_info = bst_cod_info;
1022*8f5875f3SDavid du Colombier                 *scalefac = bst_scalefac;
1023*8f5875f3SDavid du Colombier                 memcpy(xrpow, bst_xrpow, sizeof(FLOAT8)*576);
1024*8f5875f3SDavid du Colombier             }
1025*8f5875f3SDavid du Colombier         }
1026*8f5875f3SDavid du Colombier     } while (dbits>8);
1027*8f5875f3SDavid du Colombier 
1028*8f5875f3SDavid du Colombier     if (real_bits <= Max_bits) {
1029*8f5875f3SDavid du Colombier         /*  restore best quantization found
1030*8f5875f3SDavid du Colombier          */
1031*8f5875f3SDavid du Colombier         *cod_info = bst_cod_info;
1032*8f5875f3SDavid du Colombier         *scalefac = bst_scalefac;
1033*8f5875f3SDavid du Colombier         memcpy(l3_enc, bst_l3_enc, sizeof(int)*576);
1034*8f5875f3SDavid du Colombier     }
1035*8f5875f3SDavid du Colombier     assert(cod_info->part2_3_length <= Max_bits);
1036*8f5875f3SDavid du Colombier }
1037*8f5875f3SDavid du Colombier 
1038*8f5875f3SDavid du Colombier 
1039*8f5875f3SDavid du Colombier 
1040*8f5875f3SDavid du Colombier /************************************************************************
1041*8f5875f3SDavid du Colombier  *
1042*8f5875f3SDavid du Colombier  *      get_framebits()
1043*8f5875f3SDavid du Colombier  *
1044*8f5875f3SDavid du Colombier  *  Robert Hegemann 2000-09-05
1045*8f5875f3SDavid du Colombier  *
1046*8f5875f3SDavid du Colombier  *  calculates
1047*8f5875f3SDavid du Colombier  *  * how many bits are available for analog silent granules
1048*8f5875f3SDavid du Colombier  *  * how many bits to use for the lowest allowed bitrate
1049*8f5875f3SDavid du Colombier  *  * how many bits each bitrate would provide
1050*8f5875f3SDavid du Colombier  *
1051*8f5875f3SDavid du Colombier  ************************************************************************/
1052*8f5875f3SDavid du Colombier 
1053*8f5875f3SDavid du Colombier static void
get_framebits(lame_global_flags * gfp,int * const analog_mean_bits,int * const min_mean_bits,int frameBits[15])1054*8f5875f3SDavid du Colombier get_framebits (
1055*8f5875f3SDavid du Colombier     lame_global_flags *gfp,
1056*8f5875f3SDavid du Colombier     int     * const analog_mean_bits,
1057*8f5875f3SDavid du Colombier     int     * const min_mean_bits,
1058*8f5875f3SDavid du Colombier     int             frameBits[15] )
1059*8f5875f3SDavid du Colombier {
1060*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
1061*8f5875f3SDavid du Colombier     int bitsPerFrame, mean_bits, i;
1062*8f5875f3SDavid du Colombier     III_side_info_t *l3_side = &gfc->l3_side;
1063*8f5875f3SDavid du Colombier 
1064*8f5875f3SDavid du Colombier     /*  always use at least this many bits per granule per channel
1065*8f5875f3SDavid du Colombier      *  unless we detect analog silence, see below
1066*8f5875f3SDavid du Colombier      */
1067*8f5875f3SDavid du Colombier     gfc->bitrate_index = gfc->VBR_min_bitrate;
1068*8f5875f3SDavid du Colombier     getframebits (gfp, &bitsPerFrame, &mean_bits);
1069*8f5875f3SDavid du Colombier     *min_mean_bits = mean_bits / gfc->channels_out;
1070*8f5875f3SDavid du Colombier 
1071*8f5875f3SDavid du Colombier     /*  bits for analog silence
1072*8f5875f3SDavid du Colombier      */
1073*8f5875f3SDavid du Colombier     gfc->bitrate_index = 1;
1074*8f5875f3SDavid du Colombier     getframebits (gfp, &bitsPerFrame, &mean_bits);
1075*8f5875f3SDavid du Colombier     *analog_mean_bits = mean_bits / gfc->channels_out;
1076*8f5875f3SDavid du Colombier 
1077*8f5875f3SDavid du Colombier     for (i = 1; i <= gfc->VBR_max_bitrate; i++) {
1078*8f5875f3SDavid du Colombier         gfc->bitrate_index = i;
1079*8f5875f3SDavid du Colombier         getframebits (gfp, &bitsPerFrame, &mean_bits);
1080*8f5875f3SDavid du Colombier         frameBits[i] = ResvFrameBegin (gfp, l3_side, mean_bits, bitsPerFrame);
1081*8f5875f3SDavid du Colombier     }
1082*8f5875f3SDavid du Colombier }
1083*8f5875f3SDavid du Colombier 
1084*8f5875f3SDavid du Colombier 
1085*8f5875f3SDavid du Colombier 
1086*8f5875f3SDavid du Colombier /************************************************************************
1087*8f5875f3SDavid du Colombier  *
1088*8f5875f3SDavid du Colombier  *      calc_min_bits()
1089*8f5875f3SDavid du Colombier  *
1090*8f5875f3SDavid du Colombier  *  Robert Hegemann 2000-09-04
1091*8f5875f3SDavid du Colombier  *
1092*8f5875f3SDavid du Colombier  *  determine minimal bit skeleton
1093*8f5875f3SDavid du Colombier  *
1094*8f5875f3SDavid du Colombier  ************************************************************************/
1095*8f5875f3SDavid du Colombier inline
1096*8f5875f3SDavid du Colombier static int
calc_min_bits(lame_global_flags * gfp,const gr_info * const cod_info,const int pe,const FLOAT8 ms_ener_ratio,const int bands,const int mch_bits,const int analog_mean_bits,const int min_mean_bits,const int analog_silence,const int ch)1097*8f5875f3SDavid du Colombier calc_min_bits (
1098*8f5875f3SDavid du Colombier     lame_global_flags *gfp,
1099*8f5875f3SDavid du Colombier     const gr_info * const cod_info,
1100*8f5875f3SDavid du Colombier     const int             pe,
1101*8f5875f3SDavid du Colombier     const FLOAT8          ms_ener_ratio,
1102*8f5875f3SDavid du Colombier     const int             bands,
1103*8f5875f3SDavid du Colombier     const int             mch_bits,
1104*8f5875f3SDavid du Colombier     const int             analog_mean_bits,
1105*8f5875f3SDavid du Colombier     const int             min_mean_bits,
1106*8f5875f3SDavid du Colombier     const int             analog_silence,
1107*8f5875f3SDavid du Colombier     const int             ch )
1108*8f5875f3SDavid du Colombier {
1109*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
1110*8f5875f3SDavid du Colombier     int min_bits, min_pe_bits;
1111*8f5875f3SDavid du Colombier 
1112*8f5875f3SDavid du Colombier     if (gfc->nsPsy.use) return 1;
1113*8f5875f3SDavid du Colombier 
1114*8f5875f3SDavid du Colombier     /*  base amount of minimum bits
1115*8f5875f3SDavid du Colombier      */
1116*8f5875f3SDavid du Colombier     min_bits = Max (125, min_mean_bits);
1117*8f5875f3SDavid du Colombier 
1118*8f5875f3SDavid du Colombier     if (gfc->mode_ext == MPG_MD_MS_LR && ch == 1)
1119*8f5875f3SDavid du Colombier         min_bits = Max (min_bits, mch_bits/5);
1120*8f5875f3SDavid du Colombier 
1121*8f5875f3SDavid du Colombier     /*  bit skeleton based on PE
1122*8f5875f3SDavid du Colombier      */
1123*8f5875f3SDavid du Colombier     if (cod_info->block_type == SHORT_TYPE)
1124*8f5875f3SDavid du Colombier         /*  if LAME switches to short blocks then pe is
1125*8f5875f3SDavid du Colombier          *  >= 1000 on medium surge
1126*8f5875f3SDavid du Colombier          *  >= 3000 on big surge
1127*8f5875f3SDavid du Colombier          */
1128*8f5875f3SDavid du Colombier         min_pe_bits = (pe-350) * bands/39;
1129*8f5875f3SDavid du Colombier     else
1130*8f5875f3SDavid du Colombier         min_pe_bits = (pe-350) * bands/22;
1131*8f5875f3SDavid du Colombier 
1132*8f5875f3SDavid du Colombier     if (gfc->mode_ext == MPG_MD_MS_LR && ch == 1) {
1133*8f5875f3SDavid du Colombier         /*  side channel will use a lower bit skeleton based on PE
1134*8f5875f3SDavid du Colombier          */
1135*8f5875f3SDavid du Colombier         FLOAT8 fac  = .33 * (.5 - ms_ener_ratio) / .5;
1136*8f5875f3SDavid du Colombier         min_pe_bits = (int)(min_pe_bits * ((1-fac)/(1+fac)));
1137*8f5875f3SDavid du Colombier     }
1138*8f5875f3SDavid du Colombier     min_pe_bits = Min (min_pe_bits, (1820 * gfp->out_samplerate / 44100));
1139*8f5875f3SDavid du Colombier 
1140*8f5875f3SDavid du Colombier     /*  determine final minimum bits
1141*8f5875f3SDavid du Colombier      */
1142*8f5875f3SDavid du Colombier     if (analog_silence && !gfp->VBR_hard_min)
1143*8f5875f3SDavid du Colombier         min_bits = analog_mean_bits;
1144*8f5875f3SDavid du Colombier     else
1145*8f5875f3SDavid du Colombier         min_bits = Max (min_bits, min_pe_bits);
1146*8f5875f3SDavid du Colombier 
1147*8f5875f3SDavid du Colombier     return min_bits;
1148*8f5875f3SDavid du Colombier }
1149*8f5875f3SDavid du Colombier 
1150*8f5875f3SDavid du Colombier 
1151*8f5875f3SDavid du Colombier 
1152*8f5875f3SDavid du Colombier /************************************************************************
1153*8f5875f3SDavid du Colombier  *
1154*8f5875f3SDavid du Colombier  *      calc_max_bits()
1155*8f5875f3SDavid du Colombier  *
1156*8f5875f3SDavid du Colombier  *  Robert Hegemann 2000-09-05
1157*8f5875f3SDavid du Colombier  *
1158*8f5875f3SDavid du Colombier  *  determine maximal bit skeleton
1159*8f5875f3SDavid du Colombier  *
1160*8f5875f3SDavid du Colombier  ************************************************************************/
1161*8f5875f3SDavid du Colombier inline
1162*8f5875f3SDavid du Colombier static int
calc_max_bits(const lame_internal_flags * const gfc,const int frameBits[15],const int min_bits)1163*8f5875f3SDavid du Colombier calc_max_bits (
1164*8f5875f3SDavid du Colombier     const lame_internal_flags * const gfc,
1165*8f5875f3SDavid du Colombier     const int             frameBits[15],
1166*8f5875f3SDavid du Colombier     const int             min_bits )
1167*8f5875f3SDavid du Colombier {
1168*8f5875f3SDavid du Colombier     int max_bits;
1169*8f5875f3SDavid du Colombier 
1170*8f5875f3SDavid du Colombier     max_bits  = frameBits[gfc->VBR_max_bitrate];
1171*8f5875f3SDavid du Colombier     max_bits /= gfc->channels_out * gfc->mode_gr;
1172*8f5875f3SDavid du Colombier     max_bits  = Min (1200 + max_bits, MAX_BITS - 195 * (gfc->channels_out - 1));
1173*8f5875f3SDavid du Colombier     max_bits  = Max (max_bits, min_bits);
1174*8f5875f3SDavid du Colombier 
1175*8f5875f3SDavid du Colombier     return max_bits;
1176*8f5875f3SDavid du Colombier }
1177*8f5875f3SDavid du Colombier 
1178*8f5875f3SDavid du Colombier 
1179*8f5875f3SDavid du Colombier 
1180*8f5875f3SDavid du Colombier /*********************************************************************
1181*8f5875f3SDavid du Colombier  *
1182*8f5875f3SDavid du Colombier  *      VBR_prepare()
1183*8f5875f3SDavid du Colombier  *
1184*8f5875f3SDavid du Colombier  *  2000-09-04 Robert Hegemann
1185*8f5875f3SDavid du Colombier  *
1186*8f5875f3SDavid du Colombier  *  * converts LR to MS coding when necessary
1187*8f5875f3SDavid du Colombier  *  * calculates allowed/adjusted quantization noise amounts
1188*8f5875f3SDavid du Colombier  *  * detects analog silent frames
1189*8f5875f3SDavid du Colombier  *
1190*8f5875f3SDavid du Colombier  *  some remarks:
1191*8f5875f3SDavid du Colombier  *  - lower masking depending on Quality setting
1192*8f5875f3SDavid du Colombier  *  - quality control together with adjusted ATH MDCT scaling
1193*8f5875f3SDavid du Colombier  *    on lower quality setting allocate more noise from
1194*8f5875f3SDavid du Colombier  *    ATH masking, and on higher quality setting allocate
1195*8f5875f3SDavid du Colombier  *    less noise from ATH masking.
1196*8f5875f3SDavid du Colombier  *  - experiments show that going more than 2dB over GPSYCHO's
1197*8f5875f3SDavid du Colombier  *    limits ends up in very annoying artefacts
1198*8f5875f3SDavid du Colombier  *
1199*8f5875f3SDavid du Colombier  *********************************************************************/
1200*8f5875f3SDavid du Colombier 
1201*8f5875f3SDavid du Colombier /* RH: this one needs to be overhauled sometime */
1202*8f5875f3SDavid du Colombier 
1203*8f5875f3SDavid du Colombier static int
VBR_prepare(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_psy_xmin l3_xmin[2][2],int frameBits[16],int * analog_mean_bits,int * min_mean_bits,int min_bits[2][2],int max_bits[2][2],int bands[2][2])1204*8f5875f3SDavid du Colombier VBR_prepare (
1205*8f5875f3SDavid du Colombier           lame_global_flags *gfp,
1206*8f5875f3SDavid du Colombier           FLOAT8          pe            [2][2],
1207*8f5875f3SDavid du Colombier           FLOAT8          ms_ener_ratio [2],
1208*8f5875f3SDavid du Colombier           FLOAT8          xr            [2][2][576],
1209*8f5875f3SDavid du Colombier           III_psy_ratio   ratio         [2][2],
1210*8f5875f3SDavid du Colombier           III_psy_xmin    l3_xmin       [2][2],
1211*8f5875f3SDavid du Colombier           int             frameBits     [16],
1212*8f5875f3SDavid du Colombier           int            *analog_mean_bits,
1213*8f5875f3SDavid du Colombier           int            *min_mean_bits,
1214*8f5875f3SDavid du Colombier           int             min_bits      [2][2],
1215*8f5875f3SDavid du Colombier           int             max_bits      [2][2],
1216*8f5875f3SDavid du Colombier           int             bands         [2][2] )
1217*8f5875f3SDavid du Colombier {
1218*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
1219*8f5875f3SDavid du Colombier     static const FLOAT8 dbQ[10]={-2.,-1.0,-.66,-.33,0.,0.33,.66,1.0,1.33,1.66};
1220*8f5875f3SDavid du Colombier     static const FLOAT8 dbQns[10]={- 4,- 3,-2,-1,0,0.7,1.4,2.1,2.8,3.5};
1221*8f5875f3SDavid du Colombier     /*static const FLOAT8 atQns[10]={-16,-12,-8,-4,0,  1,  2,  3,  4,  5};*/
1222*8f5875f3SDavid du Colombier 
1223*8f5875f3SDavid du Colombier     static const FLOAT8 dbQmtrh[10]=
1224*8f5875f3SDavid du Colombier         { -4., -3., -2., -1., 0., 0.5, 1., 1.5, 2., 2.5 };
1225*8f5875f3SDavid du Colombier 
1226*8f5875f3SDavid du Colombier     FLOAT8   masking_lower_db, adjust = 0.0;
1227*8f5875f3SDavid du Colombier     int      gr, ch;
1228*8f5875f3SDavid du Colombier     int      used_bits = 0, bits;
1229*8f5875f3SDavid du Colombier     int      analog_silence = 1;
1230*8f5875f3SDavid du Colombier 
1231*8f5875f3SDavid du Colombier     assert( gfp->VBR_q <= 9 );
1232*8f5875f3SDavid du Colombier     assert( gfp->VBR_q >= 0 );
1233*8f5875f3SDavid du Colombier 
1234*8f5875f3SDavid du Colombier     get_framebits (gfp, analog_mean_bits, min_mean_bits, frameBits);
1235*8f5875f3SDavid du Colombier 
1236*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1237*8f5875f3SDavid du Colombier         if (gfc->mode_ext == MPG_MD_MS_LR)
1238*8f5875f3SDavid du Colombier             ms_convert (xr[gr], xr[gr]);
1239*8f5875f3SDavid du Colombier 
1240*8f5875f3SDavid du Colombier         for (ch = 0; ch < gfc->channels_out; ch++) {
1241*8f5875f3SDavid du Colombier             gr_info *cod_info = &gfc->l3_side.gr[gr].ch[ch].tt;
1242*8f5875f3SDavid du Colombier 
1243*8f5875f3SDavid du Colombier             if (cod_info->block_type == SHORT_TYPE)
1244*8f5875f3SDavid du Colombier                 adjust = 5/(1+exp(3.5-pe[gr][ch]/300.))-0.14;
1245*8f5875f3SDavid du Colombier             else
1246*8f5875f3SDavid du Colombier                 adjust = 2/(1+exp(3.5-pe[gr][ch]/300.))-0.05;
1247*8f5875f3SDavid du Colombier 
1248*8f5875f3SDavid du Colombier 	    if (vbr_mtrh == gfp->VBR) {
1249*8f5875f3SDavid du Colombier 	        masking_lower_db   = dbQmtrh[gfp->VBR_q] - adjust;
1250*8f5875f3SDavid du Colombier             }
1251*8f5875f3SDavid du Colombier             else if (gfc->nsPsy.use && gfp->ATHtype == 0) {
1252*8f5875f3SDavid du Colombier 	        masking_lower_db   = dbQns[gfp->VBR_q] - adjust;
1253*8f5875f3SDavid du Colombier 	    }
1254*8f5875f3SDavid du Colombier             else {
1255*8f5875f3SDavid du Colombier 	        masking_lower_db   = dbQ[gfp->VBR_q] - adjust;
1256*8f5875f3SDavid du Colombier 	    }
1257*8f5875f3SDavid du Colombier             gfc->masking_lower = pow (10.0, masking_lower_db * 0.1);
1258*8f5875f3SDavid du Colombier 
1259*8f5875f3SDavid du Colombier             bands[gr][ch] = calc_xmin (gfp, xr[gr][ch], ratio[gr]+ch,
1260*8f5875f3SDavid du Colombier                                        cod_info, l3_xmin[gr]+ch);
1261*8f5875f3SDavid du Colombier             if (bands[gr][ch])
1262*8f5875f3SDavid du Colombier                 analog_silence = 0;
1263*8f5875f3SDavid du Colombier 
1264*8f5875f3SDavid du Colombier 
1265*8f5875f3SDavid du Colombier             min_bits[gr][ch] = calc_min_bits (gfp, cod_info, (int)pe[gr][ch],
1266*8f5875f3SDavid du Colombier                                       ms_ener_ratio[gr], bands[gr][ch],
1267*8f5875f3SDavid du Colombier                                       0, *analog_mean_bits,
1268*8f5875f3SDavid du Colombier                                       *min_mean_bits, analog_silence, ch);
1269*8f5875f3SDavid du Colombier 
1270*8f5875f3SDavid du Colombier             max_bits[gr][ch] = calc_max_bits (gfc, frameBits, min_bits[gr][ch]);
1271*8f5875f3SDavid du Colombier             used_bits += min_bits[gr][ch];
1272*8f5875f3SDavid du Colombier 
1273*8f5875f3SDavid du Colombier         } /* for ch */
1274*8f5875f3SDavid du Colombier     }  /* for gr */
1275*8f5875f3SDavid du Colombier 
1276*8f5875f3SDavid du Colombier     *min_mean_bits = Max(125, *min_mean_bits);
1277*8f5875f3SDavid du Colombier     bits = 0.8*frameBits[gfc->VBR_max_bitrate];
1278*8f5875f3SDavid du Colombier     if (used_bits >= bits)
1279*8f5875f3SDavid du Colombier         for (gr = 0; gr < gfc->mode_gr; gr++) {
1280*8f5875f3SDavid du Colombier             for (ch = 0; ch < gfc->channels_out; ch++) {
1281*8f5875f3SDavid du Colombier                 min_bits[gr][ch] *= bits;
1282*8f5875f3SDavid du Colombier                 min_bits[gr][ch] /= used_bits;
1283*8f5875f3SDavid du Colombier                 if (min_bits[gr][ch] < *min_mean_bits)
1284*8f5875f3SDavid du Colombier                     min_bits[gr][ch] = *min_mean_bits;
1285*8f5875f3SDavid du Colombier                 max_bits[gr][ch] *= bits;
1286*8f5875f3SDavid du Colombier                 max_bits[gr][ch] /= used_bits;
1287*8f5875f3SDavid du Colombier                 if (max_bits[gr][ch] < *min_mean_bits)
1288*8f5875f3SDavid du Colombier                     max_bits[gr][ch] = *min_mean_bits;
1289*8f5875f3SDavid du Colombier             }
1290*8f5875f3SDavid du Colombier         }
1291*8f5875f3SDavid du Colombier 
1292*8f5875f3SDavid du Colombier 
1293*8f5875f3SDavid du Colombier     return analog_silence;
1294*8f5875f3SDavid du Colombier }
1295*8f5875f3SDavid du Colombier 
1296*8f5875f3SDavid du Colombier 
1297*8f5875f3SDavid du Colombier 
1298*8f5875f3SDavid du Colombier /************************************************************************
1299*8f5875f3SDavid du Colombier  *
1300*8f5875f3SDavid du Colombier  *      VBR_iteration_loop()
1301*8f5875f3SDavid du Colombier  *
1302*8f5875f3SDavid du Colombier  *  tries to find out how many bits are needed for each granule and channel
1303*8f5875f3SDavid du Colombier  *  to get an acceptable quantization. An appropriate bitrate will then be
1304*8f5875f3SDavid du Colombier  *  choosed for quantization.  rh 8/99
1305*8f5875f3SDavid du Colombier  *
1306*8f5875f3SDavid du Colombier  *  Robert Hegemann 2000-09-06 rewrite
1307*8f5875f3SDavid du Colombier  *
1308*8f5875f3SDavid du Colombier  ************************************************************************/
1309*8f5875f3SDavid du Colombier 
1310*8f5875f3SDavid du Colombier 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],int l3_enc[2][2][576],III_scalefac_t scalefac[2][2])1311*8f5875f3SDavid du Colombier VBR_iteration_loop (
1312*8f5875f3SDavid du Colombier     lame_global_flags *gfp,
1313*8f5875f3SDavid du Colombier     FLOAT8             pe           [2][2],
1314*8f5875f3SDavid du Colombier     FLOAT8             ms_ener_ratio[2],
1315*8f5875f3SDavid du Colombier     FLOAT8             xr           [2][2][576],
1316*8f5875f3SDavid du Colombier     III_psy_ratio      ratio        [2][2],
1317*8f5875f3SDavid du Colombier     int                l3_enc       [2][2][576],
1318*8f5875f3SDavid du Colombier     III_scalefac_t     scalefac     [2][2] )
1319*8f5875f3SDavid du Colombier {
1320*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
1321*8f5875f3SDavid du Colombier     III_psy_xmin l3_xmin[2][2];
1322*8f5875f3SDavid du Colombier 
1323*8f5875f3SDavid du Colombier     FLOAT8    xrpow[576];
1324*8f5875f3SDavid du Colombier     int       bands[2][2];
1325*8f5875f3SDavid du Colombier     int       frameBits[15];
1326*8f5875f3SDavid du Colombier     int       bitsPerFrame;
1327*8f5875f3SDavid du Colombier     int       save_bits[2][2];
1328*8f5875f3SDavid du Colombier     int       used_bits, used_bits2;
1329*8f5875f3SDavid du Colombier     int       bits;
1330*8f5875f3SDavid du Colombier     int       min_bits[2][2], max_bits[2][2];
1331*8f5875f3SDavid du Colombier     int       analog_mean_bits, min_mean_bits;
1332*8f5875f3SDavid du Colombier     int       mean_bits;
1333*8f5875f3SDavid du Colombier     int       ch, num_chan, gr, analog_silence;
1334*8f5875f3SDavid du Colombier     int       reduce_s_ch, sfb21_extra;
1335*8f5875f3SDavid du Colombier     gr_info             *cod_info;
1336*8f5875f3SDavid du Colombier     III_side_info_t     *l3_side  = &gfc->l3_side;
1337*8f5875f3SDavid du Colombier 
1338*8f5875f3SDavid du Colombier     if (gfc->mode_ext == MPG_MD_MS_LR && gfp->quality >= 5) {
1339*8f5875f3SDavid du Colombier         /*  my experiences are, that side channel reduction
1340*8f5875f3SDavid du Colombier          *  does more harm than good when VBR encoding
1341*8f5875f3SDavid du Colombier          *  (Robert.Hegemann@gmx.de 2000-02-18)
1342*8f5875f3SDavid du Colombier          *  2000-09-06: code is enabled at quality level 5
1343*8f5875f3SDavid du Colombier          */
1344*8f5875f3SDavid du Colombier         reduce_s_ch = 1;
1345*8f5875f3SDavid du Colombier         num_chan    = 1;
1346*8f5875f3SDavid du Colombier     } else {
1347*8f5875f3SDavid du Colombier         reduce_s_ch = 0;
1348*8f5875f3SDavid du Colombier         num_chan    = gfc->channels_out;
1349*8f5875f3SDavid du Colombier     }
1350*8f5875f3SDavid du Colombier 
1351*8f5875f3SDavid du Colombier     analog_silence = VBR_prepare (gfp, pe, ms_ener_ratio, xr, ratio,
1352*8f5875f3SDavid du Colombier                                   l3_xmin, frameBits, &analog_mean_bits,
1353*8f5875f3SDavid du Colombier                                   &min_mean_bits, min_bits, max_bits, bands);
1354*8f5875f3SDavid du Colombier 
1355*8f5875f3SDavid du Colombier     /*---------------------------------*/
1356*8f5875f3SDavid du Colombier     do {
1357*8f5875f3SDavid du Colombier 
1358*8f5875f3SDavid du Colombier     /*  quantize granules with lowest possible number of bits
1359*8f5875f3SDavid du Colombier      */
1360*8f5875f3SDavid du Colombier 
1361*8f5875f3SDavid du Colombier     used_bits = 0;
1362*8f5875f3SDavid du Colombier     used_bits2 = 0;
1363*8f5875f3SDavid du Colombier 
1364*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1365*8f5875f3SDavid du Colombier         for (ch = 0; ch < num_chan; ch++) {
1366*8f5875f3SDavid du Colombier             int ret;
1367*8f5875f3SDavid du Colombier             cod_info = &l3_side->gr[gr].ch[ch].tt;
1368*8f5875f3SDavid du Colombier 
1369*8f5875f3SDavid du Colombier             /*  init_outer_loop sets up cod_info, scalefac and xrpow
1370*8f5875f3SDavid du Colombier              */
1371*8f5875f3SDavid du Colombier             ret = init_outer_loop(cod_info, &scalefac[gr][ch], gfc->is_mpeg1,
1372*8f5875f3SDavid du Colombier 				  xr[gr][ch], xrpow);
1373*8f5875f3SDavid du Colombier             if (ret == 0) {
1374*8f5875f3SDavid du Colombier                 /*  xr contains no energy
1375*8f5875f3SDavid du Colombier                  *  l3_enc, our encoding data, will be quantized to zero
1376*8f5875f3SDavid du Colombier                  */
1377*8f5875f3SDavid du Colombier                 memset(l3_enc[gr][ch], 0, sizeof(int)*576);
1378*8f5875f3SDavid du Colombier                 save_bits[gr][ch] = 0;
1379*8f5875f3SDavid du Colombier                 continue; /* with next channel */
1380*8f5875f3SDavid du Colombier             }
1381*8f5875f3SDavid du Colombier #if 0
1382*8f5875f3SDavid du Colombier             if (gfc->mode_ext == MPG_MD_MS_LR && ch == 1)
1383*8f5875f3SDavid du Colombier                 min_bits[gr][ch] = Max (min_bits[gr][ch], save_bits[gr][0]/5);
1384*8f5875f3SDavid du Colombier #endif
1385*8f5875f3SDavid du Colombier 
1386*8f5875f3SDavid du Colombier             if (gfp->VBR == vbr_mtrh) {
1387*8f5875f3SDavid du Colombier                 ret = VBR_noise_shaping2 (gfp, xr[gr][ch], xrpow,
1388*8f5875f3SDavid du Colombier                                         &ratio[gr][ch], l3_enc[gr][ch], 0,
1389*8f5875f3SDavid du Colombier                                         min_bits[gr][ch], max_bits[gr][ch],
1390*8f5875f3SDavid du Colombier                                         &scalefac[gr][ch],
1391*8f5875f3SDavid du Colombier                                         &l3_xmin[gr][ch], gr, ch );
1392*8f5875f3SDavid du Colombier                 if (ret < 0)
1393*8f5875f3SDavid du Colombier                     cod_info->part2_3_length = 100000;
1394*8f5875f3SDavid du Colombier             }
1395*8f5875f3SDavid du Colombier             else
1396*8f5875f3SDavid du Colombier                 VBR_encode_granule (gfp, cod_info, xr[gr][ch], &l3_xmin[gr][ch],
1397*8f5875f3SDavid du Colombier                                     &scalefac[gr][ch], xrpow, l3_enc[gr][ch],
1398*8f5875f3SDavid du Colombier                                     ch, min_bits[gr][ch], max_bits[gr][ch] );
1399*8f5875f3SDavid du Colombier 
1400*8f5875f3SDavid du Colombier             used_bits += cod_info->part2_3_length;
1401*8f5875f3SDavid du Colombier             save_bits[gr][ch] = Min(MAX_BITS, cod_info->part2_3_length);
1402*8f5875f3SDavid du Colombier             used_bits2 += Min(MAX_BITS, cod_info->part2_3_length);
1403*8f5875f3SDavid du Colombier         } /* for ch */
1404*8f5875f3SDavid du Colombier     }    /* for gr */
1405*8f5875f3SDavid du Colombier 
1406*8f5875f3SDavid du Colombier     /*  special on quality=5, we didn't quantize side channel above
1407*8f5875f3SDavid du Colombier      */
1408*8f5875f3SDavid du Colombier     if (reduce_s_ch) {
1409*8f5875f3SDavid du Colombier         /*  number of bits needed was found for MID channel above.  Use formula
1410*8f5875f3SDavid du Colombier          *  (fixed bitrate code) to set the side channel bits */
1411*8f5875f3SDavid du Colombier         for (gr = 0; gr < gfc->mode_gr; gr++) {
1412*8f5875f3SDavid du Colombier             FLOAT8 fac = .33*(.5-ms_ener_ratio[gr])/.5;
1413*8f5875f3SDavid du Colombier             save_bits[gr][1] = (int)(((1-fac)/(1+fac)) * save_bits[gr][0]);
1414*8f5875f3SDavid du Colombier             save_bits[gr][1] = Max (analog_mean_bits, save_bits[gr][1]);
1415*8f5875f3SDavid du Colombier             used_bits += save_bits[gr][1];
1416*8f5875f3SDavid du Colombier         }
1417*8f5875f3SDavid du Colombier     }
1418*8f5875f3SDavid du Colombier 
1419*8f5875f3SDavid du Colombier     /*  find lowest bitrate able to hold used bits
1420*8f5875f3SDavid du Colombier      */
1421*8f5875f3SDavid du Colombier     if (analog_silence && !gfp->VBR_hard_min)
1422*8f5875f3SDavid du Colombier         /*  we detected analog silence and the user did not specify
1423*8f5875f3SDavid du Colombier          *  any hard framesize limit, so start with smallest possible frame
1424*8f5875f3SDavid du Colombier          */
1425*8f5875f3SDavid du Colombier         gfc->bitrate_index = 1;
1426*8f5875f3SDavid du Colombier     else
1427*8f5875f3SDavid du Colombier         gfc->bitrate_index = gfc->VBR_min_bitrate;
1428*8f5875f3SDavid du Colombier 
1429*8f5875f3SDavid du Colombier     for( ; gfc->bitrate_index < gfc->VBR_max_bitrate; gfc->bitrate_index++) {
1430*8f5875f3SDavid du Colombier         if (used_bits <= frameBits[gfc->bitrate_index]) break;
1431*8f5875f3SDavid du Colombier     }
1432*8f5875f3SDavid du Colombier 
1433*8f5875f3SDavid du Colombier     getframebits (gfp, &bitsPerFrame, &mean_bits);
1434*8f5875f3SDavid du Colombier     bits = ResvFrameBegin (gfp, l3_side, mean_bits, bitsPerFrame);
1435*8f5875f3SDavid du Colombier 
1436*8f5875f3SDavid du Colombier     if (used_bits > bits){
1437*8f5875f3SDavid du Colombier         //printf("# %d used %d have %d\n",gfp->frameNum,used_bits,bits);
1438*8f5875f3SDavid du Colombier         if(gfp->VBR == vbr_mtrh) {
1439*8f5875f3SDavid du Colombier             for (gr = 0; gr < gfc->mode_gr; gr++) {
1440*8f5875f3SDavid du Colombier                 for (ch = 0; ch < gfc->channels_out; ch++) {
1441*8f5875f3SDavid du Colombier                     max_bits[gr][ch] = save_bits[gr][ch];
1442*8f5875f3SDavid du Colombier                     max_bits[gr][ch] *= frameBits[gfc->bitrate_index];
1443*8f5875f3SDavid du Colombier                     max_bits[gr][ch] /= used_bits2;
1444*8f5875f3SDavid du Colombier                     max_bits[gr][ch] = Max(min_bits[gr][ch],max_bits[gr][ch]);
1445*8f5875f3SDavid du Colombier                 }
1446*8f5875f3SDavid du Colombier             }
1447*8f5875f3SDavid du Colombier         }
1448*8f5875f3SDavid du Colombier         else {
1449*8f5875f3SDavid du Colombier             for (gr = 0; gr < gfc->mode_gr; gr++) {
1450*8f5875f3SDavid du Colombier                 for (ch = 0; ch < gfc->channels_out; ch++) {
1451*8f5875f3SDavid du Colombier                     int sfb;
1452*8f5875f3SDavid du Colombier                     cod_info = &l3_side->gr[gr].ch[ch].tt;
1453*8f5875f3SDavid du Colombier                     if (cod_info->block_type == SHORT_TYPE) {
1454*8f5875f3SDavid du Colombier                         for (sfb = 0; sfb < SBMAX_s; sfb++) {
1455*8f5875f3SDavid du Colombier                             l3_xmin[gr][ch].s[sfb][0] *= 1.+.029*sfb*sfb/SBMAX_s/SBMAX_s;
1456*8f5875f3SDavid du Colombier                             l3_xmin[gr][ch].s[sfb][1] *= 1.+.029*sfb*sfb/SBMAX_s/SBMAX_s;
1457*8f5875f3SDavid du Colombier                             l3_xmin[gr][ch].s[sfb][2] *= 1.+.029*sfb*sfb/SBMAX_s/SBMAX_s;
1458*8f5875f3SDavid du Colombier                         }
1459*8f5875f3SDavid du Colombier                     }
1460*8f5875f3SDavid du Colombier                     else {
1461*8f5875f3SDavid du Colombier                         for (sfb = 0; sfb < SBMAX_l; sfb++)
1462*8f5875f3SDavid du Colombier                             l3_xmin[gr][ch].l[sfb] *= 1.+.029*sfb*sfb/SBMAX_l/SBMAX_l;
1463*8f5875f3SDavid du Colombier                     }
1464*8f5875f3SDavid du Colombier //                  min_bits[gr][ch] = Max(min_mean_bits, 0.9*min_bits[gr][ch]);
1465*8f5875f3SDavid du Colombier                     max_bits[gr][ch] = Max(min_mean_bits, 0.9*max_bits[gr][ch]);
1466*8f5875f3SDavid du Colombier                 }
1467*8f5875f3SDavid du Colombier             }
1468*8f5875f3SDavid du Colombier         }
1469*8f5875f3SDavid du Colombier     }
1470*8f5875f3SDavid du Colombier 
1471*8f5875f3SDavid du Colombier     } while (used_bits > bits);
1472*8f5875f3SDavid du Colombier     /*--------------------------------------*/
1473*8f5875f3SDavid du Colombier 
1474*8f5875f3SDavid du Colombier     /*  ignore sfb21 by the following (maybe) noise shaping
1475*8f5875f3SDavid du Colombier      */
1476*8f5875f3SDavid du Colombier     sfb21_extra = gfc->sfb21_extra;
1477*8f5875f3SDavid du Colombier     gfc->sfb21_extra = 0;
1478*8f5875f3SDavid du Colombier 
1479*8f5875f3SDavid du Colombier     /*  quantize granules which violate bit constraints again
1480*8f5875f3SDavid du Colombier      *  and side channel when in quality=5 reduce_side is used
1481*8f5875f3SDavid du Colombier      */
1482*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1483*8f5875f3SDavid du Colombier         for (ch = 0; ch < gfc->channels_out; ch++) {
1484*8f5875f3SDavid du Colombier             int ret;
1485*8f5875f3SDavid du Colombier             cod_info = &l3_side->gr[gr].ch[ch].tt;
1486*8f5875f3SDavid du Colombier 
1487*8f5875f3SDavid du Colombier             if (used_bits <= bits && ! (reduce_s_ch && ch == 1))
1488*8f5875f3SDavid du Colombier                 /*  we have enough bits
1489*8f5875f3SDavid du Colombier                  *  and have already encoded the side channel
1490*8f5875f3SDavid du Colombier                  */
1491*8f5875f3SDavid du Colombier                 continue; /* with next ch */
1492*8f5875f3SDavid du Colombier 
1493*8f5875f3SDavid du Colombier             if (used_bits > bits) {
1494*8f5875f3SDavid du Colombier                 /*  repartion available bits in same proportion
1495*8f5875f3SDavid du Colombier                  */
1496*8f5875f3SDavid du Colombier                 save_bits[gr][ch] *= frameBits[gfc->bitrate_index];
1497*8f5875f3SDavid du Colombier                 save_bits[gr][ch] /= used_bits;
1498*8f5875f3SDavid du Colombier             }
1499*8f5875f3SDavid du Colombier             /*  init_outer_loop sets up cod_info, scalefac and xrpow
1500*8f5875f3SDavid du Colombier              */
1501*8f5875f3SDavid du Colombier             ret = init_outer_loop(cod_info, &scalefac[gr][ch], gfc->is_mpeg1,
1502*8f5875f3SDavid du Colombier 				  xr[gr][ch], xrpow);
1503*8f5875f3SDavid du Colombier             if (ret == 0)
1504*8f5875f3SDavid du Colombier             {
1505*8f5875f3SDavid du Colombier                 /*  xr contains no energy
1506*8f5875f3SDavid du Colombier                  *  l3_enc, our encoding data, will be quantized to zero
1507*8f5875f3SDavid du Colombier                  */
1508*8f5875f3SDavid du Colombier                 memset(l3_enc[gr][ch], 0, sizeof(int)*576);
1509*8f5875f3SDavid du Colombier             }
1510*8f5875f3SDavid du Colombier             else {
1511*8f5875f3SDavid du Colombier                 /*  xr contains energy we will have to encode
1512*8f5875f3SDavid du Colombier                  *  masking abilities were previously calculated
1513*8f5875f3SDavid du Colombier                  *  find some good quantization in outer_loop
1514*8f5875f3SDavid du Colombier                  */
1515*8f5875f3SDavid du Colombier                 outer_loop (gfp, cod_info, xr[gr][ch], &l3_xmin[gr][ch],
1516*8f5875f3SDavid du Colombier                             &scalefac[gr][ch], xrpow, l3_enc[gr][ch], ch,
1517*8f5875f3SDavid du Colombier                             save_bits[gr][ch]);
1518*8f5875f3SDavid du Colombier             }
1519*8f5875f3SDavid du Colombier         } /* ch */
1520*8f5875f3SDavid du Colombier     }  /* gr */
1521*8f5875f3SDavid du Colombier 
1522*8f5875f3SDavid du Colombier     gfc->sfb21_extra = sfb21_extra;
1523*8f5875f3SDavid du Colombier 
1524*8f5875f3SDavid du Colombier     iteration_finish (gfc, xr, l3_enc, ratio, scalefac, mean_bits);
1525*8f5875f3SDavid du Colombier }
1526*8f5875f3SDavid du Colombier 
1527*8f5875f3SDavid du Colombier 
1528*8f5875f3SDavid du Colombier 
1529*8f5875f3SDavid du Colombier 
1530*8f5875f3SDavid du Colombier 
1531*8f5875f3SDavid du Colombier 
1532*8f5875f3SDavid du Colombier /********************************************************************
1533*8f5875f3SDavid du Colombier  *
1534*8f5875f3SDavid du Colombier  *  calc_target_bits()
1535*8f5875f3SDavid du Colombier  *
1536*8f5875f3SDavid du Colombier  *  calculates target bits for ABR encoding
1537*8f5875f3SDavid du Colombier  *
1538*8f5875f3SDavid du Colombier  *  mt 2000/05/31
1539*8f5875f3SDavid du Colombier  *
1540*8f5875f3SDavid du Colombier  ********************************************************************/
1541*8f5875f3SDavid du Colombier 
1542*8f5875f3SDavid du Colombier static void
calc_target_bits(lame_global_flags * gfp,FLOAT8 pe[2][2],FLOAT8 ms_ener_ratio[2],int targ_bits[2][2],int * analog_silence_bits,int * max_frame_bits)1543*8f5875f3SDavid du Colombier calc_target_bits (
1544*8f5875f3SDavid du Colombier     lame_global_flags * gfp,
1545*8f5875f3SDavid du Colombier     FLOAT8               pe            [2][2],
1546*8f5875f3SDavid du Colombier     FLOAT8               ms_ener_ratio [2],
1547*8f5875f3SDavid du Colombier     int                  targ_bits     [2][2],
1548*8f5875f3SDavid du Colombier     int                 *analog_silence_bits,
1549*8f5875f3SDavid du Colombier     int                 *max_frame_bits )
1550*8f5875f3SDavid du Colombier {
1551*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
1552*8f5875f3SDavid du Colombier     III_side_info_t *l3_side = &gfc->l3_side;
1553*8f5875f3SDavid du Colombier     FLOAT8 res_factor;
1554*8f5875f3SDavid du Colombier     int gr, ch, totbits, mean_bits, bitsPerFrame;
1555*8f5875f3SDavid du Colombier 
1556*8f5875f3SDavid du Colombier     gfc->bitrate_index = gfc->VBR_max_bitrate;
1557*8f5875f3SDavid du Colombier     getframebits (gfp, &bitsPerFrame, &mean_bits);
1558*8f5875f3SDavid du Colombier     *max_frame_bits = ResvFrameBegin (gfp, l3_side, mean_bits, bitsPerFrame);
1559*8f5875f3SDavid du Colombier 
1560*8f5875f3SDavid du Colombier     gfc->bitrate_index = 1;
1561*8f5875f3SDavid du Colombier     getframebits (gfp, &bitsPerFrame, &mean_bits);
1562*8f5875f3SDavid du Colombier     *analog_silence_bits = mean_bits / gfc->channels_out;
1563*8f5875f3SDavid du Colombier 
1564*8f5875f3SDavid du Colombier     mean_bits  = gfp->VBR_mean_bitrate_kbps * gfp->framesize * 1000;
1565*8f5875f3SDavid du Colombier     mean_bits /= gfp->out_samplerate;
1566*8f5875f3SDavid du Colombier     mean_bits -= gfc->sideinfo_len*8;
1567*8f5875f3SDavid du Colombier     mean_bits /= gfc->mode_gr;
1568*8f5875f3SDavid du Colombier 
1569*8f5875f3SDavid du Colombier     res_factor = .90 + .10 * (11.0 - gfp->compression_ratio) / (11.0 - 5.5);
1570*8f5875f3SDavid du Colombier     if (res_factor <  .90)
1571*8f5875f3SDavid du Colombier         res_factor =  .90;
1572*8f5875f3SDavid du Colombier     if (res_factor > 1.00)
1573*8f5875f3SDavid du Colombier         res_factor = 1.00;
1574*8f5875f3SDavid du Colombier 
1575*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1576*8f5875f3SDavid du Colombier         for (ch = 0; ch < gfc->channels_out; ch++) {
1577*8f5875f3SDavid du Colombier             targ_bits[gr][ch] = res_factor * (mean_bits / gfc->channels_out);
1578*8f5875f3SDavid du Colombier 
1579*8f5875f3SDavid du Colombier             if (pe[gr][ch] > 700) {
1580*8f5875f3SDavid du Colombier                 int add_bits = (pe[gr][ch] - 700) / 1.4;
1581*8f5875f3SDavid du Colombier 
1582*8f5875f3SDavid du Colombier                 gr_info *cod_info = &l3_side->gr[gr].ch[ch].tt;
1583*8f5875f3SDavid du Colombier                 targ_bits[gr][ch] = res_factor * (mean_bits / gfc->channels_out);
1584*8f5875f3SDavid du Colombier 
1585*8f5875f3SDavid du Colombier                 /* short blocks use a little extra, no matter what the pe */
1586*8f5875f3SDavid du Colombier                 if (cod_info->block_type == SHORT_TYPE) {
1587*8f5875f3SDavid du Colombier                     if (add_bits < mean_bits/4)
1588*8f5875f3SDavid du Colombier                         add_bits = mean_bits/4;
1589*8f5875f3SDavid du Colombier                 }
1590*8f5875f3SDavid du Colombier                 /* at most increase bits by 1.5*average */
1591*8f5875f3SDavid du Colombier                 if (add_bits > mean_bits*3/4)
1592*8f5875f3SDavid du Colombier                     add_bits = mean_bits*3/4;
1593*8f5875f3SDavid du Colombier                 else
1594*8f5875f3SDavid du Colombier                 if (add_bits < 0)
1595*8f5875f3SDavid du Colombier                     add_bits = 0;
1596*8f5875f3SDavid du Colombier 
1597*8f5875f3SDavid du Colombier                 targ_bits[gr][ch] += add_bits;
1598*8f5875f3SDavid du Colombier             }
1599*8f5875f3SDavid du Colombier         }/* for ch */
1600*8f5875f3SDavid du Colombier     }   /* for gr */
1601*8f5875f3SDavid du Colombier 
1602*8f5875f3SDavid du Colombier     if (gfc->mode_ext == MPG_MD_MS_LR)
1603*8f5875f3SDavid du Colombier         for (gr = 0; gr < gfc->mode_gr; gr++) {
1604*8f5875f3SDavid du Colombier             reduce_side (targ_bits[gr], ms_ener_ratio[gr], mean_bits,
1605*8f5875f3SDavid du Colombier 			 MAX_BITS);
1606*8f5875f3SDavid du Colombier         }
1607*8f5875f3SDavid du Colombier 
1608*8f5875f3SDavid du Colombier     /*  sum target bits
1609*8f5875f3SDavid du Colombier      */
1610*8f5875f3SDavid du Colombier     totbits=0;
1611*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1612*8f5875f3SDavid du Colombier         for (ch = 0; ch < gfc->channels_out; ch++) {
1613*8f5875f3SDavid du Colombier             if (targ_bits[gr][ch] > MAX_BITS)
1614*8f5875f3SDavid du Colombier                 targ_bits[gr][ch] = MAX_BITS;
1615*8f5875f3SDavid du Colombier             totbits += targ_bits[gr][ch];
1616*8f5875f3SDavid du Colombier         }
1617*8f5875f3SDavid du Colombier     }
1618*8f5875f3SDavid du Colombier 
1619*8f5875f3SDavid du Colombier     /*  repartion target bits if needed
1620*8f5875f3SDavid du Colombier      */
1621*8f5875f3SDavid du Colombier     if (totbits > *max_frame_bits) {
1622*8f5875f3SDavid du Colombier         for(gr = 0; gr < gfc->mode_gr; gr++) {
1623*8f5875f3SDavid du Colombier             for(ch = 0; ch < gfc->channels_out; ch++) {
1624*8f5875f3SDavid du Colombier                 targ_bits[gr][ch] *= *max_frame_bits;
1625*8f5875f3SDavid du Colombier                 targ_bits[gr][ch] /= totbits;
1626*8f5875f3SDavid du Colombier             }
1627*8f5875f3SDavid du Colombier         }
1628*8f5875f3SDavid du Colombier     }
1629*8f5875f3SDavid du Colombier }
1630*8f5875f3SDavid du Colombier 
1631*8f5875f3SDavid du Colombier 
1632*8f5875f3SDavid du Colombier 
1633*8f5875f3SDavid du Colombier 
1634*8f5875f3SDavid du Colombier 
1635*8f5875f3SDavid du Colombier 
1636*8f5875f3SDavid du Colombier /********************************************************************
1637*8f5875f3SDavid du Colombier  *
1638*8f5875f3SDavid du Colombier  *  ABR_iteration_loop()
1639*8f5875f3SDavid du Colombier  *
1640*8f5875f3SDavid du Colombier  *  encode a frame with a disired average bitrate
1641*8f5875f3SDavid du Colombier  *
1642*8f5875f3SDavid du Colombier  *  mt 2000/05/31
1643*8f5875f3SDavid du Colombier  *
1644*8f5875f3SDavid du Colombier  ********************************************************************/
1645*8f5875f3SDavid du Colombier 
1646*8f5875f3SDavid du Colombier void
ABR_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],int l3_enc[2][2][576],III_scalefac_t scalefac[2][2])1647*8f5875f3SDavid du Colombier ABR_iteration_loop(
1648*8f5875f3SDavid du Colombier     lame_global_flags *gfp,
1649*8f5875f3SDavid du Colombier     FLOAT8             pe           [2][2],
1650*8f5875f3SDavid du Colombier     FLOAT8             ms_ener_ratio[2],
1651*8f5875f3SDavid du Colombier     FLOAT8             xr           [2][2][576],
1652*8f5875f3SDavid du Colombier     III_psy_ratio      ratio        [2][2],
1653*8f5875f3SDavid du Colombier     int                l3_enc       [2][2][576],
1654*8f5875f3SDavid du Colombier     III_scalefac_t     scalefac     [2][2] )
1655*8f5875f3SDavid du Colombier {
1656*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
1657*8f5875f3SDavid du Colombier     III_psy_xmin l3_xmin;
1658*8f5875f3SDavid du Colombier     FLOAT8    xrpow[576];
1659*8f5875f3SDavid du Colombier     int       targ_bits[2][2];
1660*8f5875f3SDavid du Colombier     int       bitsPerFrame, mean_bits, totbits, max_frame_bits;
1661*8f5875f3SDavid du Colombier     int       ch, gr, ath_over, ret;
1662*8f5875f3SDavid du Colombier     int       analog_silence_bits;
1663*8f5875f3SDavid du Colombier     gr_info             *cod_info = NULL;
1664*8f5875f3SDavid du Colombier     III_side_info_t     *l3_side  = &gfc->l3_side;
1665*8f5875f3SDavid du Colombier 
1666*8f5875f3SDavid du Colombier     calc_target_bits (gfp, pe, ms_ener_ratio, targ_bits,
1667*8f5875f3SDavid du Colombier                       &analog_silence_bits, &max_frame_bits);
1668*8f5875f3SDavid du Colombier 
1669*8f5875f3SDavid du Colombier     /*  encode granules
1670*8f5875f3SDavid du Colombier      */
1671*8f5875f3SDavid du Colombier     totbits=0;
1672*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1673*8f5875f3SDavid du Colombier 
1674*8f5875f3SDavid du Colombier         if (gfc->mode_ext == MPG_MD_MS_LR)
1675*8f5875f3SDavid du Colombier             ms_convert (xr[gr], xr[gr]);
1676*8f5875f3SDavid du Colombier 
1677*8f5875f3SDavid du Colombier         for (ch = 0; ch < gfc->channels_out; ch++) {
1678*8f5875f3SDavid du Colombier             cod_info = &l3_side->gr[gr].ch[ch].tt;
1679*8f5875f3SDavid du Colombier 
1680*8f5875f3SDavid du Colombier             /*  cod_info, scalefac and xrpow get initialized in init_outer_loop
1681*8f5875f3SDavid du Colombier              */
1682*8f5875f3SDavid du Colombier             ret = init_outer_loop(cod_info, &scalefac[gr][ch], gfc->is_mpeg1,
1683*8f5875f3SDavid du Colombier 				  xr[gr][ch], xrpow);
1684*8f5875f3SDavid du Colombier             if (ret == 0) {
1685*8f5875f3SDavid du Colombier                 /*  xr contains no energy
1686*8f5875f3SDavid du Colombier                  *  l3_enc, our encoding data, will be quantized to zero
1687*8f5875f3SDavid du Colombier                  */
1688*8f5875f3SDavid du Colombier                 memset(l3_enc[gr][ch], 0, sizeof(int)*576);
1689*8f5875f3SDavid du Colombier             }
1690*8f5875f3SDavid du Colombier             else {
1691*8f5875f3SDavid du Colombier                 /*  xr contains energy we will have to encode
1692*8f5875f3SDavid du Colombier                  *  calculate the masking abilities
1693*8f5875f3SDavid du Colombier                  *  find some good quantization in outer_loop
1694*8f5875f3SDavid du Colombier                  */
1695*8f5875f3SDavid du Colombier                 ath_over = calc_xmin (gfp, xr[gr][ch], &ratio[gr][ch],
1696*8f5875f3SDavid du Colombier                                       cod_info, &l3_xmin);
1697*8f5875f3SDavid du Colombier                 if (0 == ath_over) /* analog silence */
1698*8f5875f3SDavid du Colombier                     targ_bits[gr][ch] = analog_silence_bits;
1699*8f5875f3SDavid du Colombier 
1700*8f5875f3SDavid du Colombier                 outer_loop (gfp, cod_info, xr[gr][ch], &l3_xmin,
1701*8f5875f3SDavid du Colombier                             &scalefac[gr][ch], xrpow, l3_enc[gr][ch],
1702*8f5875f3SDavid du Colombier                             ch, targ_bits[gr][ch]);
1703*8f5875f3SDavid du Colombier             }
1704*8f5875f3SDavid du Colombier 
1705*8f5875f3SDavid du Colombier             totbits += cod_info->part2_3_length;
1706*8f5875f3SDavid du Colombier         } /* ch */
1707*8f5875f3SDavid du Colombier     }  /* gr */
1708*8f5875f3SDavid du Colombier 
1709*8f5875f3SDavid du Colombier     /*  find a bitrate which can handle totbits
1710*8f5875f3SDavid du Colombier      */
1711*8f5875f3SDavid du Colombier     for (gfc->bitrate_index =  gfc->VBR_min_bitrate ;
1712*8f5875f3SDavid du Colombier          gfc->bitrate_index <= gfc->VBR_max_bitrate;
1713*8f5875f3SDavid du Colombier          gfc->bitrate_index++    ) {
1714*8f5875f3SDavid du Colombier         getframebits (gfp, &bitsPerFrame, &mean_bits);
1715*8f5875f3SDavid du Colombier         max_frame_bits = ResvFrameBegin (gfp, l3_side, mean_bits, bitsPerFrame);
1716*8f5875f3SDavid du Colombier         if (totbits <= max_frame_bits) break;
1717*8f5875f3SDavid du Colombier     }
1718*8f5875f3SDavid du Colombier     assert (gfc->bitrate_index <= gfc->VBR_max_bitrate);
1719*8f5875f3SDavid du Colombier 
1720*8f5875f3SDavid du Colombier     iteration_finish (gfc, xr, l3_enc, ratio, scalefac, mean_bits);
1721*8f5875f3SDavid du Colombier }
1722*8f5875f3SDavid du Colombier 
1723*8f5875f3SDavid du Colombier 
1724*8f5875f3SDavid du Colombier 
1725*8f5875f3SDavid du Colombier 
1726*8f5875f3SDavid du Colombier 
1727*8f5875f3SDavid du Colombier 
1728*8f5875f3SDavid du Colombier /************************************************************************
1729*8f5875f3SDavid du Colombier  *
1730*8f5875f3SDavid du Colombier  *      iteration_loop()
1731*8f5875f3SDavid du Colombier  *
1732*8f5875f3SDavid du Colombier  *  author/date??
1733*8f5875f3SDavid du Colombier  *
1734*8f5875f3SDavid du Colombier  *  encodes one frame of MP3 data with constant bitrate
1735*8f5875f3SDavid du Colombier  *
1736*8f5875f3SDavid du Colombier  ************************************************************************/
1737*8f5875f3SDavid du Colombier 
1738*8f5875f3SDavid du Colombier 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],int l3_enc[2][2][576],III_scalefac_t scalefac[2][2])1739*8f5875f3SDavid du Colombier iteration_loop(
1740*8f5875f3SDavid du Colombier     lame_global_flags *gfp,
1741*8f5875f3SDavid du Colombier     FLOAT8             pe           [2][2],
1742*8f5875f3SDavid du Colombier     FLOAT8             ms_ener_ratio[2],
1743*8f5875f3SDavid du Colombier     FLOAT8             xr           [2][2][576],
1744*8f5875f3SDavid du Colombier     III_psy_ratio      ratio        [2][2],
1745*8f5875f3SDavid du Colombier     int                l3_enc       [2][2][576],
1746*8f5875f3SDavid du Colombier     III_scalefac_t     scalefac     [2][2] )
1747*8f5875f3SDavid du Colombier {
1748*8f5875f3SDavid du Colombier     lame_internal_flags *gfc=gfp->internal_flags;
1749*8f5875f3SDavid du Colombier     III_psy_xmin l3_xmin[2];
1750*8f5875f3SDavid du Colombier     FLOAT8 xrpow[576];
1751*8f5875f3SDavid du Colombier     int    targ_bits[2];
1752*8f5875f3SDavid du Colombier     int    bitsPerFrame;
1753*8f5875f3SDavid du Colombier     int    mean_bits, max_bits, bit_rate;
1754*8f5875f3SDavid du Colombier     int    gr, ch, i;
1755*8f5875f3SDavid du Colombier     III_side_info_t     *l3_side = &gfc->l3_side;
1756*8f5875f3SDavid du Colombier     gr_info             *cod_info;
1757*8f5875f3SDavid du Colombier 
1758*8f5875f3SDavid du Colombier     bit_rate = bitrate_table [gfp->version] [gfc->bitrate_index];
1759*8f5875f3SDavid du Colombier     getframebits (gfp, &bitsPerFrame, &mean_bits);
1760*8f5875f3SDavid du Colombier     ResvFrameBegin (gfp, l3_side, mean_bits, bitsPerFrame );
1761*8f5875f3SDavid du Colombier 
1762*8f5875f3SDavid du Colombier     /* quantize! */
1763*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1764*8f5875f3SDavid du Colombier 
1765*8f5875f3SDavid du Colombier         /*  calculate needed bits
1766*8f5875f3SDavid du Colombier          */
1767*8f5875f3SDavid du Colombier         max_bits = on_pe (gfp, pe, l3_side, targ_bits, mean_bits, gr);
1768*8f5875f3SDavid du Colombier 
1769*8f5875f3SDavid du Colombier         if (gfc->mode_ext == MPG_MD_MS_LR) {
1770*8f5875f3SDavid du Colombier             ms_convert (xr[gr], xr[gr]);
1771*8f5875f3SDavid du Colombier             reduce_side (targ_bits, ms_ener_ratio[gr], mean_bits, max_bits);
1772*8f5875f3SDavid du Colombier         }
1773*8f5875f3SDavid du Colombier 
1774*8f5875f3SDavid du Colombier         for (ch=0 ; ch < gfc->channels_out ; ch ++) {
1775*8f5875f3SDavid du Colombier             cod_info = &l3_side->gr[gr].ch[ch].tt;
1776*8f5875f3SDavid du Colombier 
1777*8f5875f3SDavid du Colombier             /*  init_outer_loop sets up cod_info, scalefac and xrpow
1778*8f5875f3SDavid du Colombier              */
1779*8f5875f3SDavid du Colombier             i = init_outer_loop(cod_info, &scalefac[gr][ch], gfc->is_mpeg1,
1780*8f5875f3SDavid du Colombier 				xr[gr][ch], xrpow);
1781*8f5875f3SDavid du Colombier             if (i == 0) {
1782*8f5875f3SDavid du Colombier                 /*  xr contains no energy, l3_enc will be quantized to zero
1783*8f5875f3SDavid du Colombier                  */
1784*8f5875f3SDavid du Colombier                 memset(l3_enc[gr][ch], 0, sizeof(int)*576);
1785*8f5875f3SDavid du Colombier             }
1786*8f5875f3SDavid du Colombier             else {
1787*8f5875f3SDavid du Colombier                 /*  xr contains energy we will have to encode
1788*8f5875f3SDavid du Colombier                  *  calculate the masking abilities
1789*8f5875f3SDavid du Colombier                  *  find some good quantization in outer_loop
1790*8f5875f3SDavid du Colombier                  */
1791*8f5875f3SDavid du Colombier                 calc_xmin (gfp, xr[gr][ch], &ratio[gr][ch], cod_info,
1792*8f5875f3SDavid du Colombier                            &l3_xmin[ch]);
1793*8f5875f3SDavid du Colombier                 outer_loop (gfp, cod_info, xr[gr][ch], &l3_xmin[ch],
1794*8f5875f3SDavid du Colombier                             &scalefac[gr][ch], xrpow, l3_enc[gr][ch],
1795*8f5875f3SDavid du Colombier                             ch, targ_bits[ch]);
1796*8f5875f3SDavid du Colombier             }
1797*8f5875f3SDavid du Colombier             assert (cod_info->part2_3_length <= MAX_BITS);
1798*8f5875f3SDavid du Colombier 
1799*8f5875f3SDavid du Colombier             /*  try some better scalefac storage
1800*8f5875f3SDavid du Colombier              */
1801*8f5875f3SDavid du Colombier             best_scalefac_store (gfc, gr, ch, l3_enc, l3_side, scalefac);
1802*8f5875f3SDavid du Colombier 
1803*8f5875f3SDavid du Colombier             /*  best huffman_divide may save some bits too
1804*8f5875f3SDavid du Colombier              */
1805*8f5875f3SDavid du Colombier             if (gfc->use_best_huffman == 1)
1806*8f5875f3SDavid du Colombier                 best_huffman_divide (gfc, gr, ch, cod_info, l3_enc[gr][ch]);
1807*8f5875f3SDavid du Colombier 
1808*8f5875f3SDavid du Colombier             /*  update reservoir status after FINAL quantization/bitrate
1809*8f5875f3SDavid du Colombier              */
1810*8f5875f3SDavid du Colombier #undef  NORES_TEST
1811*8f5875f3SDavid du Colombier #ifndef NORES_TEST
1812*8f5875f3SDavid du Colombier             ResvAdjust (gfc, cod_info, l3_side, mean_bits);
1813*8f5875f3SDavid du Colombier #endif
1814*8f5875f3SDavid du Colombier             /*  set the sign of l3_enc from the sign of xr
1815*8f5875f3SDavid du Colombier              */
1816*8f5875f3SDavid du Colombier             for (i = 0; i < 576; i++) {
1817*8f5875f3SDavid du Colombier                 if (xr[gr][ch][i] < 0) l3_enc[gr][ch][i] *= -1;
1818*8f5875f3SDavid du Colombier             }
1819*8f5875f3SDavid du Colombier         } /* for ch */
1820*8f5875f3SDavid du Colombier     }    /* for gr */
1821*8f5875f3SDavid du Colombier 
1822*8f5875f3SDavid du Colombier #ifdef NORES_TEST
1823*8f5875f3SDavid du Colombier     /* replace ResvAdjust above with this code if you do not want
1824*8f5875f3SDavid du Colombier        the second granule to use bits saved by the first granule.
1825*8f5875f3SDavid du Colombier        Requires using the --nores.  This is useful for testing only */
1826*8f5875f3SDavid du Colombier     for (gr = 0; gr < gfc->mode_gr; gr++) {
1827*8f5875f3SDavid du Colombier         for (ch =  0; ch < gfc->channels_out; ch++) {
1828*8f5875f3SDavid du Colombier             cod_info = &l3_side->gr[gr].ch[ch].tt;
1829*8f5875f3SDavid du Colombier             ResvAdjust (gfc, cod_info, l3_side, mean_bits);
1830*8f5875f3SDavid du Colombier         }
1831*8f5875f3SDavid du Colombier     }
1832*8f5875f3SDavid du Colombier #endif
1833*8f5875f3SDavid du Colombier 
1834*8f5875f3SDavid du Colombier     ResvFrameEnd (gfc, l3_side, mean_bits);
1835*8f5875f3SDavid du Colombier }
1836*8f5875f3SDavid du Colombier 
1837*8f5875f3SDavid du Colombier 
1838*8f5875f3SDavid du Colombier 
1839