Blame libmp3lame/quantize_pvt.c

Packit 47f805
/*
Packit 47f805
 *      quantize_pvt source file
Packit 47f805
 *
Packit 47f805
 *      Copyright (c) 1999-2002 Takehiro Tominaga
Packit 47f805
 *      Copyright (c) 2000-2012 Robert Hegemann
Packit 47f805
 *      Copyright (c) 2001 Naoki Shibata
Packit 47f805
 *      Copyright (c) 2002-2005 Gabriel Bouvigne
Packit 47f805
 *
Packit 47f805
 * This library is free software; you can redistribute it and/or
Packit 47f805
 * modify it under the terms of the GNU Library General Public
Packit 47f805
 * License as published by the Free Software Foundation; either
Packit 47f805
 * version 2 of the License, or (at your option) any later version.
Packit 47f805
 *
Packit 47f805
 * This library is distributed in the hope that it will be useful,
Packit 47f805
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 47f805
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 47f805
 * Library General Public License for more details.
Packit 47f805
 *
Packit 47f805
 * You should have received a copy of the GNU Library General Public
Packit 47f805
 * License along with this library; if not, write to the
Packit 47f805
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 47f805
 * Boston, MA 02111-1307, USA.
Packit 47f805
 */
Packit 47f805
Packit 47f805
/* $Id: quantize_pvt.c,v 1.175 2017/09/06 15:07:30 robert Exp $ */
Packit 47f805
#ifdef HAVE_CONFIG_H
Packit 47f805
# include <config.h>
Packit 47f805
#endif
Packit 47f805
Packit 47f805
Packit 47f805
#include "lame.h"
Packit 47f805
#include "machine.h"
Packit 47f805
#include "encoder.h"
Packit 47f805
#include "util.h"
Packit 47f805
#include "quantize_pvt.h"
Packit 47f805
#include "reservoir.h"
Packit 47f805
#include "lame-analysis.h"
Packit 47f805
#include <float.h>
Packit 47f805
Packit 47f805
Packit 47f805
#define NSATHSCALE 100  /* Assuming dynamic range=96dB, this value should be 92 */
Packit 47f805
Packit 47f805
/*
Packit 47f805
  The following table is used to implement the scalefactor
Packit 47f805
  partitioning for MPEG2 as described in section
Packit 47f805
  2.4.3.2 of the IS. The indexing corresponds to the
Packit 47f805
  way the tables are presented in the IS:
Packit 47f805
Packit 47f805
  [table_number][row_in_table][column of nr_of_sfb]
Packit 47f805
*/
Packit 47f805
const int nr_of_sfb_block[6][3][4] = {
Packit 47f805
    {
Packit 47f805
     {6, 5, 5, 5},
Packit 47f805
     {9, 9, 9, 9},
Packit 47f805
     {6, 9, 9, 9}
Packit 47f805
     },
Packit 47f805
    {
Packit 47f805
     {6, 5, 7, 3},
Packit 47f805
     {9, 9, 12, 6},
Packit 47f805
     {6, 9, 12, 6}
Packit 47f805
     },
Packit 47f805
    {
Packit 47f805
     {11, 10, 0, 0},
Packit 47f805
     {18, 18, 0, 0},
Packit 47f805
     {15, 18, 0, 0}
Packit 47f805
     },
Packit 47f805
    {
Packit 47f805
     {7, 7, 7, 0},
Packit 47f805
     {12, 12, 12, 0},
Packit 47f805
     {6, 15, 12, 0}
Packit 47f805
     },
Packit 47f805
    {
Packit 47f805
     {6, 6, 6, 3},
Packit 47f805
     {12, 9, 9, 6},
Packit 47f805
     {6, 12, 9, 6}
Packit 47f805
     },
Packit 47f805
    {
Packit 47f805
     {8, 8, 5, 0},
Packit 47f805
     {15, 12, 9, 0},
Packit 47f805
     {6, 18, 9, 0}
Packit 47f805
     }
Packit 47f805
};
Packit 47f805
Packit 47f805
Packit 47f805
/* Table B.6: layer3 preemphasis */
Packit 47f805
const int pretab[SBMAX_l] = {
Packit 47f805
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Packit 47f805
    1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
Packit 47f805
};
Packit 47f805
Packit 47f805
/*
Packit 47f805
  Here are MPEG1 Table B.8 and MPEG2 Table B.1
Packit 47f805
  -- Layer III scalefactor bands. 
Packit 47f805
  Index into this using a method such as:
Packit 47f805
    idx  = fr_ps->header->sampling_frequency
Packit 47f805
           + (fr_ps->header->version * 3)
Packit 47f805
*/
Packit 47f805
Packit 47f805
Packit 47f805
const scalefac_struct sfBandIndex[9] = {
Packit 47f805
    {                   /* Table B.2.b: 22.05 kHz */
Packit 47f805
     {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464,
Packit 47f805
      522, 576},
Packit 47f805
     {0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* Table B.2.c: 24 kHz */ /* docs: 332. mpg123(broken): 330 */
Packit 47f805
     {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464,
Packit 47f805
      540, 576},
Packit 47f805
     {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* Table B.2.a: 16 kHz */
Packit 47f805
     {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464,
Packit 47f805
      522, 576},
Packit 47f805
     {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* Table B.8.b: 44.1 kHz */
Packit 47f805
     {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418,
Packit 47f805
      576},
Packit 47f805
     {0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* Table B.8.c: 48 kHz */
Packit 47f805
     {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384,
Packit 47f805
      576},
Packit 47f805
     {0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* Table B.8.a: 32 kHz */
Packit 47f805
     {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550,
Packit 47f805
      576},
Packit 47f805
     {0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* MPEG-2.5 11.025 kHz */
Packit 47f805
     {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464,
Packit 47f805
      522, 576},
Packit 47f805
     {0 / 3, 12 / 3, 24 / 3, 36 / 3, 54 / 3, 78 / 3, 108 / 3, 144 / 3, 186 / 3, 240 / 3, 312 / 3,
Packit 47f805
      402 / 3, 522 / 3, 576 / 3}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* MPEG-2.5 12 kHz */
Packit 47f805
     {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464,
Packit 47f805
      522, 576},
Packit 47f805
     {0 / 3, 12 / 3, 24 / 3, 36 / 3, 54 / 3, 78 / 3, 108 / 3, 144 / 3, 186 / 3, 240 / 3, 312 / 3,
Packit 47f805
      402 / 3, 522 / 3, 576 / 3}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     },
Packit 47f805
    {                   /* MPEG-2.5 8 kHz */
Packit 47f805
     {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570,
Packit 47f805
      572, 574, 576},
Packit 47f805
     {0 / 3, 24 / 3, 48 / 3, 72 / 3, 108 / 3, 156 / 3, 216 / 3, 288 / 3, 372 / 3, 480 / 3, 486 / 3,
Packit 47f805
      492 / 3, 498 / 3, 576 / 3}
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb21 pseudo sub bands */
Packit 47f805
     , {0, 0, 0, 0, 0, 0, 0} /*  sfb12 pseudo sub bands */
Packit 47f805
     }
Packit 47f805
};
Packit 47f805
Packit 47f805
Packit 47f805
/* FIXME: move global variables in some struct */
Packit 47f805
Packit 47f805
FLOAT   pow20[Q_MAX + Q_MAX2 + 1];
Packit 47f805
FLOAT   ipow20[Q_MAX];
Packit 47f805
FLOAT   pow43[PRECALC_SIZE];
Packit 47f805
/* initialized in first call to iteration_init */
Packit 47f805
#ifdef TAKEHIRO_IEEE754_HACK
Packit 47f805
FLOAT   adj43asm[PRECALC_SIZE];
Packit 47f805
#else
Packit 47f805
FLOAT   adj43[PRECALC_SIZE];
Packit 47f805
#endif
Packit 47f805
Packit 47f805
/* 
Packit 47f805
compute the ATH for each scalefactor band 
Packit 47f805
cd range:  0..96db
Packit 47f805
Packit 47f805
Input:  3.3kHz signal  32767 amplitude  (3.3kHz is where ATH is smallest = -5db)
Packit 47f805
longblocks:  sfb=12   en0/bw=-11db    max_en0 = 1.3db
Packit 47f805
shortblocks: sfb=5           -9db              0db
Packit 47f805
Packit 47f805
Input:  1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated)
Packit 47f805
longblocks:  amp=1      sfb=12   en0/bw=-103 db      max_en0 = -92db
Packit 47f805
            amp=32767   sfb=12           -12 db                 -1.4db 
Packit 47f805
Packit 47f805
Input:  1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 (repeated)
Packit 47f805
shortblocks: amp=1      sfb=5   en0/bw= -99                    -86 
Packit 47f805
            amp=32767   sfb=5           -9  db                  4db 
Packit 47f805
Packit 47f805
Packit 47f805
MAX energy of largest wave at 3.3kHz = 1db
Packit 47f805
AVE energy of largest wave at 3.3kHz = -11db
Packit 47f805
Let's take AVE:  -11db = maximum signal in sfb=12.  
Packit 47f805
Dynamic range of CD: 96db.  Therefor energy of smallest audible wave 
Packit 47f805
in sfb=12  = -11  - 96 = -107db = ATH at 3.3kHz.  
Packit 47f805
Packit 47f805
ATH formula for this wave: -5db.  To adjust to LAME scaling, we need
Packit 47f805
ATH = ATH_formula  - 103  (db)
Packit 47f805
ATH = ATH * 2.5e-10      (ener)
Packit 47f805
Packit 47f805
*/
Packit 47f805
Packit 47f805
static  FLOAT
Packit 47f805
ATHmdct(SessionConfig_t const *cfg, FLOAT f)
Packit 47f805
{
Packit 47f805
    FLOAT   ath;
Packit 47f805
Packit 47f805
    ath = ATHformula(cfg, f);
Packit 47f805
Packit 47f805
    if (cfg->ATHfixpoint > 0) {
Packit 47f805
        ath -= cfg->ATHfixpoint;
Packit 47f805
    }
Packit 47f805
    else {
Packit 47f805
        ath -= NSATHSCALE;
Packit 47f805
    }
Packit 47f805
    ath += cfg->ATH_offset_db;
Packit 47f805
Packit 47f805
    /* modify the MDCT scaling for the ATH and convert to energy */
Packit 47f805
    ath = powf(10.0f, ath * 0.1f);
Packit 47f805
    return ath;
Packit 47f805
}
Packit 47f805
Packit 47f805
static void
Packit 47f805
compute_ath(lame_internal_flags const* gfc)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    FLOAT  *const ATH_l = gfc->ATH->l;
Packit 47f805
    FLOAT  *const ATH_psfb21 = gfc->ATH->psfb21;
Packit 47f805
    FLOAT  *const ATH_s = gfc->ATH->s;
Packit 47f805
    FLOAT  *const ATH_psfb12 = gfc->ATH->psfb12;
Packit 47f805
    int     sfb, i, start, end;
Packit 47f805
    FLOAT   ATH_f;
Packit 47f805
    FLOAT const samp_freq = cfg->samplerate_out;
Packit 47f805
Packit 47f805
    for (sfb = 0; sfb < SBMAX_l; sfb++) {
Packit 47f805
        start = gfc->scalefac_band.l[sfb];
Packit 47f805
        end = gfc->scalefac_band.l[sfb + 1];
Packit 47f805
        ATH_l[sfb] = FLOAT_MAX;
Packit 47f805
        for (i = start; i < end; i++) {
Packit 47f805
            FLOAT const freq = i * samp_freq / (2 * 576);
Packit 47f805
            ATH_f = ATHmdct(cfg, freq); /* freq in kHz */
Packit 47f805
            ATH_l[sfb] = Min(ATH_l[sfb], ATH_f);
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    for (sfb = 0; sfb < PSFB21; sfb++) {
Packit 47f805
        start = gfc->scalefac_band.psfb21[sfb];
Packit 47f805
        end = gfc->scalefac_band.psfb21[sfb + 1];
Packit 47f805
        ATH_psfb21[sfb] = FLOAT_MAX;
Packit 47f805
        for (i = start; i < end; i++) {
Packit 47f805
            FLOAT const freq = i * samp_freq / (2 * 576);
Packit 47f805
            ATH_f = ATHmdct(cfg, freq); /* freq in kHz */
Packit 47f805
            ATH_psfb21[sfb] = Min(ATH_psfb21[sfb], ATH_f);
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    for (sfb = 0; sfb < SBMAX_s; sfb++) {
Packit 47f805
        start = gfc->scalefac_band.s[sfb];
Packit 47f805
        end = gfc->scalefac_band.s[sfb + 1];
Packit 47f805
        ATH_s[sfb] = FLOAT_MAX;
Packit 47f805
        for (i = start; i < end; i++) {
Packit 47f805
            FLOAT const freq = i * samp_freq / (2 * 192);
Packit 47f805
            ATH_f = ATHmdct(cfg, freq); /* freq in kHz */
Packit 47f805
            ATH_s[sfb] = Min(ATH_s[sfb], ATH_f);
Packit 47f805
        }
Packit 47f805
        ATH_s[sfb] *= (gfc->scalefac_band.s[sfb + 1] - gfc->scalefac_band.s[sfb]);
Packit 47f805
    }
Packit 47f805
Packit 47f805
    for (sfb = 0; sfb < PSFB12; sfb++) {
Packit 47f805
        start = gfc->scalefac_band.psfb12[sfb];
Packit 47f805
        end = gfc->scalefac_band.psfb12[sfb + 1];
Packit 47f805
        ATH_psfb12[sfb] = FLOAT_MAX;
Packit 47f805
        for (i = start; i < end; i++) {
Packit 47f805
            FLOAT const freq = i * samp_freq / (2 * 192);
Packit 47f805
            ATH_f = ATHmdct(cfg, freq); /* freq in kHz */
Packit 47f805
            ATH_psfb12[sfb] = Min(ATH_psfb12[sfb], ATH_f);
Packit 47f805
        }
Packit 47f805
        /*not sure about the following */
Packit 47f805
        ATH_psfb12[sfb] *= (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]);
Packit 47f805
    }
Packit 47f805
Packit 47f805
Packit 47f805
    /*  no-ATH mode:
Packit 47f805
     *  reduce ATH to -200 dB
Packit 47f805
     */
Packit 47f805
Packit 47f805
    if (cfg->noATH) {
Packit 47f805
        for (sfb = 0; sfb < SBMAX_l; sfb++) {
Packit 47f805
            ATH_l[sfb] = 1E-20;
Packit 47f805
        }
Packit 47f805
        for (sfb = 0; sfb < PSFB21; sfb++) {
Packit 47f805
            ATH_psfb21[sfb] = 1E-20;
Packit 47f805
        }
Packit 47f805
        for (sfb = 0; sfb < SBMAX_s; sfb++) {
Packit 47f805
            ATH_s[sfb] = 1E-20;
Packit 47f805
        }
Packit 47f805
        for (sfb = 0; sfb < PSFB12; sfb++) {
Packit 47f805
            ATH_psfb12[sfb] = 1E-20;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    /*  work in progress, don't rely on it too much
Packit 47f805
     */
Packit 47f805
    gfc->ATH->floor = 10. * log10(ATHmdct(cfg, -1.));
Packit 47f805
Packit 47f805
    /*
Packit 47f805
       {   FLOAT g=10000, t=1e30, x;
Packit 47f805
       for ( f = 100; f < 10000; f++ ) {
Packit 47f805
       x = ATHmdct( cfg, f );
Packit 47f805
       if ( t > x ) t = x, g = f;
Packit 47f805
       }
Packit 47f805
       printf("min=%g\n", g);
Packit 47f805
       } */
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
static float const payload_long[2][4] = 
Packit 47f805
{ {-0.000f, -0.000f, -0.000f, +0.000f}
Packit 47f805
, {-0.500f, -0.250f, -0.025f, +0.500f}
Packit 47f805
};
Packit 47f805
static float const payload_short[2][4] = 
Packit 47f805
{ {-0.000f, -0.000f, -0.000f, +0.000f}
Packit 47f805
, {-2.000f, -1.000f, -0.050f, +0.500f}
Packit 47f805
};
Packit 47f805
Packit 47f805
/************************************************************************/
Packit 47f805
/*  initialization for iteration_loop */
Packit 47f805
/************************************************************************/
Packit 47f805
void
Packit 47f805
iteration_init(lame_internal_flags * gfc)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    III_side_info_t *const l3_side = &gfc->l3_side;
Packit 47f805
    FLOAT   adjust, db;
Packit 47f805
    int     i, sel;
Packit 47f805
Packit 47f805
    if (gfc->iteration_init_init == 0) {
Packit 47f805
        gfc->iteration_init_init = 1;
Packit 47f805
Packit 47f805
        l3_side->main_data_begin = 0;
Packit 47f805
        compute_ath(gfc);
Packit 47f805
Packit 47f805
        pow43[0] = 0.0;
Packit 47f805
        for (i = 1; i < PRECALC_SIZE; i++)
Packit 47f805
            pow43[i] = pow((FLOAT) i, 4.0 / 3.0);
Packit 47f805
Packit 47f805
#ifdef TAKEHIRO_IEEE754_HACK
Packit 47f805
        adj43asm[0] = 0.0;
Packit 47f805
        for (i = 1; i < PRECALC_SIZE; i++)
Packit 47f805
            adj43asm[i] = i - 0.5 - pow(0.5 * (pow43[i - 1] + pow43[i]), 0.75);
Packit 47f805
#else
Packit 47f805
        for (i = 0; i < PRECALC_SIZE - 1; i++)
Packit 47f805
            adj43[i] = (i + 1) - pow(0.5 * (pow43[i] + pow43[i + 1]), 0.75);
Packit 47f805
        adj43[i] = 0.5;
Packit 47f805
#endif
Packit 47f805
        for (i = 0; i < Q_MAX; i++)
Packit 47f805
            ipow20[i] = pow(2.0, (double) (i - 210) * -0.1875);
Packit 47f805
        for (i = 0; i <= Q_MAX + Q_MAX2; i++)
Packit 47f805
            pow20[i] = pow(2.0, (double) (i - 210 - Q_MAX2) * 0.25);
Packit 47f805
Packit 47f805
        huffman_init(gfc);
Packit 47f805
        init_xrpow_core_init(gfc);
Packit 47f805
Packit 47f805
        sel = 1;/* RH: all modes like vbr-new (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) ? 1 : 0;*/
Packit 47f805
Packit 47f805
        /* long */
Packit 47f805
        db = cfg->adjust_bass_db + payload_long[sel][0];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (i = 0; i <= 6; ++i) {
Packit 47f805
            gfc->sv_qnt.longfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
        db = cfg->adjust_alto_db + payload_long[sel][1];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (; i <= 13; ++i) {
Packit 47f805
            gfc->sv_qnt.longfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
        db = cfg->adjust_treble_db + payload_long[sel][2];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (; i <= 20; ++i) {
Packit 47f805
            gfc->sv_qnt.longfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
        db = cfg->adjust_sfb21_db + payload_long[sel][3];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (; i < SBMAX_l; ++i) {
Packit 47f805
            gfc->sv_qnt.longfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
Packit 47f805
        /* short */
Packit 47f805
        db = cfg->adjust_bass_db + payload_short[sel][0];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (i = 0; i <= 2; ++i) {
Packit 47f805
            gfc->sv_qnt.shortfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
        db = cfg->adjust_alto_db + payload_short[sel][1];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (; i <= 6; ++i) {
Packit 47f805
            gfc->sv_qnt.shortfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
        db = cfg->adjust_treble_db + payload_short[sel][2];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (; i <= 11; ++i) {
Packit 47f805
            gfc->sv_qnt.shortfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
        db = cfg->adjust_sfb21_db + payload_short[sel][3];
Packit 47f805
        adjust = powf(10.f, db * 0.1f);
Packit 47f805
        for (; i < SBMAX_s; ++i) {
Packit 47f805
            gfc->sv_qnt.shortfact[i] = adjust;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
/************************************************************************
Packit 47f805
 * allocate bits among 2 channels based on PE
Packit 47f805
 * mt 6/99
Packit 47f805
 * bugfixes rh 8/01: often allocated more than the allowed 4095 bits
Packit 47f805
 ************************************************************************/
Packit 47f805
int
Packit 47f805
on_pe(lame_internal_flags * gfc, const FLOAT pe[][2], int targ_bits[2], int mean_bits, int gr, int cbr)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    int     extra_bits = 0, tbits, bits;
Packit 47f805
    int     add_bits[2] = {0, 0};
Packit 47f805
    int     max_bits;        /* maximum allowed bits for this granule */
Packit 47f805
    int     ch;
Packit 47f805
Packit 47f805
    /* allocate targ_bits for granule */
Packit 47f805
    ResvMaxBits(gfc, mean_bits, &tbits, &extra_bits, cbr);
Packit 47f805
    max_bits = tbits + extra_bits;
Packit 47f805
    if (max_bits > MAX_BITS_PER_GRANULE) /* hard limit per granule */
Packit 47f805
        max_bits = MAX_BITS_PER_GRANULE;
Packit 47f805
Packit 47f805
    for (bits = 0, ch = 0; ch < cfg->channels_out; ++ch) {
Packit 47f805
        /******************************************************************
Packit 47f805
         * allocate bits for each channel 
Packit 47f805
         ******************************************************************/
Packit 47f805
        targ_bits[ch] = Min(MAX_BITS_PER_CHANNEL, tbits / cfg->channels_out);
Packit 47f805
Packit 47f805
        add_bits[ch] = targ_bits[ch] * pe[gr][ch] / 700.0 - targ_bits[ch];
Packit 47f805
Packit 47f805
        /* at most increase bits by 1.5*average */
Packit 47f805
        if (add_bits[ch] > mean_bits * 3 / 4)
Packit 47f805
            add_bits[ch] = mean_bits * 3 / 4;
Packit 47f805
        if (add_bits[ch] < 0)
Packit 47f805
            add_bits[ch] = 0;
Packit 47f805
Packit 47f805
        if (add_bits[ch] + targ_bits[ch] > MAX_BITS_PER_CHANNEL)
Packit 47f805
            add_bits[ch] = Max(0, MAX_BITS_PER_CHANNEL - targ_bits[ch]);
Packit 47f805
Packit 47f805
        bits += add_bits[ch];
Packit 47f805
    }
Packit 47f805
    if (bits > extra_bits && bits > 0) {
Packit 47f805
        for (ch = 0; ch < cfg->channels_out; ++ch) {
Packit 47f805
            add_bits[ch] = extra_bits * add_bits[ch] / bits;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    for (ch = 0; ch < cfg->channels_out; ++ch) {
Packit 47f805
        targ_bits[ch] += add_bits[ch];
Packit 47f805
        extra_bits -= add_bits[ch];
Packit 47f805
    }
Packit 47f805
Packit 47f805
    for (bits = 0, ch = 0; ch < cfg->channels_out; ++ch) {
Packit 47f805
        bits += targ_bits[ch];
Packit 47f805
    }
Packit 47f805
    if (bits > MAX_BITS_PER_GRANULE) {
Packit 47f805
        int     sum = 0;
Packit 47f805
        for (ch = 0; ch < cfg->channels_out; ++ch) {
Packit 47f805
            targ_bits[ch] *= MAX_BITS_PER_GRANULE;
Packit 47f805
            targ_bits[ch] /= bits;
Packit 47f805
            sum += targ_bits[ch];
Packit 47f805
        }
Packit 47f805
        assert(sum <= MAX_BITS_PER_GRANULE);
Packit 47f805
    }
Packit 47f805
Packit 47f805
    return max_bits;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
void
Packit 47f805
reduce_side(int targ_bits[2], FLOAT ms_ener_ratio, int mean_bits, int max_bits)
Packit 47f805
{
Packit 47f805
    int     move_bits;
Packit 47f805
    FLOAT   fac;
Packit 47f805
Packit 47f805
    assert(max_bits <= MAX_BITS_PER_GRANULE);
Packit 47f805
    assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE);
Packit 47f805
Packit 47f805
    /*  ms_ener_ratio = 0:  allocate 66/33  mid/side  fac=.33  
Packit 47f805
     *  ms_ener_ratio =.5:  allocate 50/50 mid/side   fac= 0 */
Packit 47f805
    /* 75/25 split is fac=.5 */
Packit 47f805
    /* float fac = .50*(.5-ms_ener_ratio[gr])/.5; */
Packit 47f805
    fac = .33 * (.5 - ms_ener_ratio) / .5;
Packit 47f805
    if (fac < 0)
Packit 47f805
        fac = 0;
Packit 47f805
    if (fac > .5)
Packit 47f805
        fac = .5;
Packit 47f805
Packit 47f805
    /* number of bits to move from side channel to mid channel */
Packit 47f805
    /*    move_bits = fac*targ_bits[1];  */
Packit 47f805
    move_bits = fac * .5 * (targ_bits[0] + targ_bits[1]);
Packit 47f805
Packit 47f805
    if (move_bits > MAX_BITS_PER_CHANNEL - targ_bits[0]) {
Packit 47f805
        move_bits = MAX_BITS_PER_CHANNEL - targ_bits[0];
Packit 47f805
    }
Packit 47f805
    if (move_bits < 0)
Packit 47f805
        move_bits = 0;
Packit 47f805
Packit 47f805
    if (targ_bits[1] >= 125) {
Packit 47f805
        /* dont reduce side channel below 125 bits */
Packit 47f805
        if (targ_bits[1] - move_bits > 125) {
Packit 47f805
Packit 47f805
            /* if mid channel already has 2x more than average, dont bother */
Packit 47f805
            /* mean_bits = bits per granule (for both channels) */
Packit 47f805
            if (targ_bits[0] < mean_bits)
Packit 47f805
                targ_bits[0] += move_bits;
Packit 47f805
            targ_bits[1] -= move_bits;
Packit 47f805
        }
Packit 47f805
        else {
Packit 47f805
            targ_bits[0] += targ_bits[1] - 125;
Packit 47f805
            targ_bits[1] = 125;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    move_bits = targ_bits[0] + targ_bits[1];
Packit 47f805
    if (move_bits > max_bits) {
Packit 47f805
        targ_bits[0] = (max_bits * targ_bits[0]) / move_bits;
Packit 47f805
        targ_bits[1] = (max_bits * targ_bits[1]) / move_bits;
Packit 47f805
    }
Packit 47f805
    assert(targ_bits[0] <= MAX_BITS_PER_CHANNEL);
Packit 47f805
    assert(targ_bits[1] <= MAX_BITS_PER_CHANNEL);
Packit 47f805
    assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE);
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
/**
Packit 47f805
 *  Robert Hegemann 2001-04-27:
Packit 47f805
 *  this adjusts the ATH, keeping the original noise floor
Packit 47f805
 *  affects the higher frequencies more than the lower ones
Packit 47f805
 */
Packit 47f805
Packit 47f805
FLOAT
Packit 47f805
athAdjust(FLOAT a, FLOAT x, FLOAT athFloor, float ATHfixpoint)
Packit 47f805
{
Packit 47f805
    /*  work in progress
Packit 47f805
     */
Packit 47f805
    FLOAT const o = 90.30873362f;
Packit 47f805
    FLOAT const p = (ATHfixpoint < 1.f) ? 94.82444863f : ATHfixpoint;
Packit 47f805
    FLOAT   u = FAST_LOG10_X(x, 10.0f);
Packit 47f805
    FLOAT const v = a * a;
Packit 47f805
    FLOAT   w = 0.0f;
Packit 47f805
    u -= athFloor;      /* undo scaling */
Packit 47f805
    if (v > 1E-20f)
Packit 47f805
        w = 1.f + FAST_LOG10_X(v, 10.0f / o);
Packit 47f805
    if (w < 0)
Packit 47f805
        w = 0.f;
Packit 47f805
    u *= w;
Packit 47f805
    u += athFloor + o - p; /* redo scaling */
Packit 47f805
Packit 47f805
    return powf(10.f, 0.1f * u);
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
/*************************************************************************/
Packit 47f805
/*            calc_xmin                                                  */
Packit 47f805
/*************************************************************************/
Packit 47f805
Packit 47f805
/*
Packit 47f805
  Calculate the allowed distortion for each scalefactor band,
Packit 47f805
  as determined by the psychoacoustic model.
Packit 47f805
  xmin(sb) = ratio(sb) * en(sb) / bw(sb)
Packit 47f805
Packit 47f805
  returns number of sfb's with energy > ATH
Packit 47f805
*/
Packit 47f805
Packit 47f805
int
Packit 47f805
calc_xmin(lame_internal_flags const *gfc,
Packit 47f805
          III_psy_ratio const *const ratio, gr_info * const cod_info, FLOAT * pxmin)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    int     sfb, gsfb, j = 0, ath_over = 0, k;
Packit 47f805
    ATH_t const *const ATH = gfc->ATH;
Packit 47f805
    const FLOAT *const xr = cod_info->xr;
Packit 47f805
    int     max_nonzero;
Packit 47f805
Packit 47f805
    for (gsfb = 0; gsfb < cod_info->psy_lmax; gsfb++) {
Packit 47f805
        FLOAT   en0, xmin;
Packit 47f805
        FLOAT   rh1, rh2, rh3;
Packit 47f805
        int     width, l;
Packit 47f805
Packit 47f805
        xmin = athAdjust(ATH->adjust_factor, ATH->l[gsfb], ATH->floor, cfg->ATHfixpoint);
Packit 47f805
        xmin *= gfc->sv_qnt.longfact[gsfb];
Packit 47f805
Packit 47f805
        width = cod_info->width[gsfb];
Packit 47f805
        rh1 = xmin / width;
Packit 47f805
#ifdef DBL_EPSILON
Packit 47f805
        rh2 = DBL_EPSILON;
Packit 47f805
#else
Packit 47f805
        rh2 = 2.2204460492503131e-016;
Packit 47f805
#endif
Packit 47f805
        en0 = 0.0;
Packit 47f805
        for (l = 0; l < width; ++l) {
Packit 47f805
            FLOAT const xa = xr[j++];
Packit 47f805
            FLOAT const x2 = xa * xa;
Packit 47f805
            en0 += x2;
Packit 47f805
            rh2 += (x2 < rh1) ? x2 : rh1;
Packit 47f805
        }
Packit 47f805
        if (en0 > xmin)
Packit 47f805
            ath_over++;
Packit 47f805
Packit 47f805
        if (en0 < xmin) {
Packit 47f805
            rh3 = en0;
Packit 47f805
        }
Packit 47f805
        else if (rh2 < xmin) {
Packit 47f805
            rh3 = xmin;
Packit 47f805
        }
Packit 47f805
        else {
Packit 47f805
            rh3 = rh2;
Packit 47f805
        }
Packit 47f805
        xmin = rh3;
Packit 47f805
        {
Packit 47f805
            FLOAT const e = ratio->en.l[gsfb];
Packit 47f805
            if (e > 1e-12f) {
Packit 47f805
                FLOAT   x;
Packit 47f805
                x = en0 * ratio->thm.l[gsfb] / e;
Packit 47f805
                x *= gfc->sv_qnt.longfact[gsfb];
Packit 47f805
                if (xmin < x)
Packit 47f805
                    xmin = x;
Packit 47f805
            }
Packit 47f805
        }
Packit 47f805
        xmin = Max(xmin, DBL_EPSILON);
Packit 47f805
        cod_info->energy_above_cutoff[gsfb] = (en0 > xmin+1e-14f) ? 1 : 0;
Packit 47f805
        *pxmin++ = xmin;
Packit 47f805
    }                   /* end of long block loop */
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
    /*use this function to determine the highest non-zero coeff */
Packit 47f805
    max_nonzero = 0;
Packit 47f805
    for (k = 575; k > 0; --k) {
Packit 47f805
        if (fabs(xr[k]) > 1e-12f) {
Packit 47f805
            max_nonzero = k;
Packit 47f805
            break;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
    if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT */
Packit 47f805
        max_nonzero |= 1; /* only odd numbers */
Packit 47f805
    }
Packit 47f805
    else {
Packit 47f805
        max_nonzero /= 6; /* 3 short blocks */
Packit 47f805
        max_nonzero *= 6;
Packit 47f805
        max_nonzero += 5;
Packit 47f805
    }
Packit 47f805
Packit 47f805
    if (gfc->sv_qnt.sfb21_extra == 0 && cfg->samplerate_out < 44000) {
Packit 47f805
      int const sfb_l = (cfg->samplerate_out <= 8000) ? 17 : 21;
Packit 47f805
      int const sfb_s = (cfg->samplerate_out <= 8000) ?  9 : 12;
Packit 47f805
      int   limit = 575;
Packit 47f805
      if (cod_info->block_type != SHORT_TYPE) { /* NORM, START or STOP type, but not SHORT */
Packit 47f805
          limit = gfc->scalefac_band.l[sfb_l]-1;
Packit 47f805
      }
Packit 47f805
      else {
Packit 47f805
          limit = 3*gfc->scalefac_band.s[sfb_s]-1;
Packit 47f805
      }
Packit 47f805
      if (max_nonzero > limit) {
Packit 47f805
          max_nonzero = limit;
Packit 47f805
      }
Packit 47f805
    }
Packit 47f805
    cod_info->max_nonzero_coeff = max_nonzero;
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
    for (sfb = cod_info->sfb_smin; gsfb < cod_info->psymax; sfb++, gsfb += 3) {
Packit 47f805
        int     width, b, l;
Packit 47f805
        FLOAT   tmpATH;
Packit 47f805
Packit 47f805
        tmpATH = athAdjust(ATH->adjust_factor, ATH->s[sfb], ATH->floor, cfg->ATHfixpoint);
Packit 47f805
        tmpATH *= gfc->sv_qnt.shortfact[sfb];
Packit 47f805
        
Packit 47f805
        width = cod_info->width[gsfb];
Packit 47f805
        for (b = 0; b < 3; b++) {
Packit 47f805
            FLOAT   en0 = 0.0, xmin = tmpATH;
Packit 47f805
            FLOAT   rh1, rh2, rh3;
Packit 47f805
Packit 47f805
            rh1 = tmpATH / width;
Packit 47f805
#ifdef DBL_EPSILON
Packit 47f805
            rh2 = DBL_EPSILON;
Packit 47f805
#else
Packit 47f805
            rh2 = 2.2204460492503131e-016;
Packit 47f805
#endif
Packit 47f805
            for (l = 0; l < width; ++l) {
Packit 47f805
                FLOAT const xa = xr[j++];
Packit 47f805
                FLOAT const x2 = xa * xa;
Packit 47f805
                en0 += x2;
Packit 47f805
                rh2 += (x2 < rh1) ? x2 : rh1;
Packit 47f805
            }
Packit 47f805
            if (en0 > tmpATH)
Packit 47f805
                ath_over++;
Packit 47f805
            
Packit 47f805
            if (en0 < tmpATH) {
Packit 47f805
                rh3 = en0;
Packit 47f805
            }
Packit 47f805
            else if (rh2 < tmpATH) {
Packit 47f805
                rh3 = tmpATH;
Packit 47f805
            }
Packit 47f805
            else {
Packit 47f805
                rh3 = rh2;
Packit 47f805
            }
Packit 47f805
            xmin = rh3;
Packit 47f805
            {
Packit 47f805
                FLOAT const e = ratio->en.s[sfb][b];
Packit 47f805
                if (e > 1e-12f) {
Packit 47f805
                    FLOAT   x;
Packit 47f805
                    x = en0 * ratio->thm.s[sfb][b] / e;
Packit 47f805
                    x *= gfc->sv_qnt.shortfact[sfb];
Packit 47f805
                    if (xmin < x)
Packit 47f805
                        xmin = x;
Packit 47f805
                }
Packit 47f805
            }
Packit 47f805
            xmin = Max(xmin, DBL_EPSILON);
Packit 47f805
            cod_info->energy_above_cutoff[gsfb+b] = (en0 > xmin+1e-14f) ? 1 : 0;
Packit 47f805
            *pxmin++ = xmin;
Packit 47f805
        }               /* b */
Packit 47f805
        if (cfg->use_temporal_masking_effect) {
Packit 47f805
            if (pxmin[-3] > pxmin[-3 + 1])
Packit 47f805
                pxmin[-3 + 1] += (pxmin[-3] - pxmin[-3 + 1]) * gfc->cd_psy->decay;
Packit 47f805
            if (pxmin[-3 + 1] > pxmin[-3 + 2])
Packit 47f805
                pxmin[-3 + 2] += (pxmin[-3 + 1] - pxmin[-3 + 2]) * gfc->cd_psy->decay;
Packit 47f805
        }
Packit 47f805
    }                   /* end of short block sfb loop */
Packit 47f805
Packit 47f805
    return ath_over;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
static  FLOAT
Packit 47f805
calc_noise_core_c(const gr_info * const cod_info, int *startline, int l, FLOAT step)
Packit 47f805
{
Packit 47f805
    FLOAT   noise = 0;
Packit 47f805
    int     j = *startline;
Packit 47f805
    const int *const ix = cod_info->l3_enc;
Packit 47f805
Packit 47f805
    if (j > cod_info->count1) {
Packit 47f805
        while (l--) {
Packit 47f805
            FLOAT   temp;
Packit 47f805
            temp = cod_info->xr[j];
Packit 47f805
            j++;
Packit 47f805
            noise += temp * temp;
Packit 47f805
            temp = cod_info->xr[j];
Packit 47f805
            j++;
Packit 47f805
            noise += temp * temp;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
    else if (j > cod_info->big_values) {
Packit 47f805
        FLOAT   ix01[2];
Packit 47f805
        ix01[0] = 0;
Packit 47f805
        ix01[1] = step;
Packit 47f805
        while (l--) {
Packit 47f805
            FLOAT   temp;
Packit 47f805
            temp = fabs(cod_info->xr[j]) - ix01[ix[j]];
Packit 47f805
            j++;
Packit 47f805
            noise += temp * temp;
Packit 47f805
            temp = fabs(cod_info->xr[j]) - ix01[ix[j]];
Packit 47f805
            j++;
Packit 47f805
            noise += temp * temp;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
    else {
Packit 47f805
        while (l--) {
Packit 47f805
            FLOAT   temp;
Packit 47f805
            temp = fabs(cod_info->xr[j]) - pow43[ix[j]] * step;
Packit 47f805
            j++;
Packit 47f805
            noise += temp * temp;
Packit 47f805
            temp = fabs(cod_info->xr[j]) - pow43[ix[j]] * step;
Packit 47f805
            j++;
Packit 47f805
            noise += temp * temp;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    *startline = j;
Packit 47f805
    return noise;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
/*************************************************************************/
Packit 47f805
/*            calc_noise                                                 */
Packit 47f805
/*************************************************************************/
Packit 47f805
Packit 47f805
/* -oo dB  =>  -1.00 */
Packit 47f805
/* - 6 dB  =>  -0.97 */
Packit 47f805
/* - 3 dB  =>  -0.80 */
Packit 47f805
/* - 2 dB  =>  -0.64 */
Packit 47f805
/* - 1 dB  =>  -0.38 */
Packit 47f805
/*   0 dB  =>   0.00 */
Packit 47f805
/* + 1 dB  =>  +0.49 */
Packit 47f805
/* + 2 dB  =>  +1.06 */
Packit 47f805
/* + 3 dB  =>  +1.68 */
Packit 47f805
/* + 6 dB  =>  +3.69 */
Packit 47f805
/* +10 dB  =>  +6.45 */
Packit 47f805
Packit 47f805
int
Packit 47f805
calc_noise(gr_info const *const cod_info,
Packit 47f805
           FLOAT const *l3_xmin,
Packit 47f805
           FLOAT * distort, calc_noise_result * const res, calc_noise_data * prev_noise)
Packit 47f805
{
Packit 47f805
    int     sfb, l, over = 0;
Packit 47f805
    FLOAT   over_noise_db = 0;
Packit 47f805
    FLOAT   tot_noise_db = 0; /*    0 dB relative to masking */
Packit 47f805
    FLOAT   max_noise = -20.0; /* -200 dB relative to masking */
Packit 47f805
    int     j = 0;
Packit 47f805
    const int *scalefac = cod_info->scalefac;
Packit 47f805
Packit 47f805
    res->over_SSD = 0;
Packit 47f805
Packit 47f805
Packit 47f805
    for (sfb = 0; sfb < cod_info->psymax; sfb++) {
Packit 47f805
        int const s =
Packit 47f805
            cod_info->global_gain - (((*scalefac++) + (cod_info->preflag ? pretab[sfb] : 0))
Packit 47f805
                                     << (cod_info->scalefac_scale + 1))
Packit 47f805
            - cod_info->subblock_gain[cod_info->window[sfb]] * 8;
Packit 47f805
        FLOAT const r_l3_xmin = 1.f / *l3_xmin++;
Packit 47f805
        FLOAT   distort_ = 0.0f;
Packit 47f805
        FLOAT   noise = 0.0f;
Packit 47f805
Packit 47f805
        if (prev_noise && (prev_noise->step[sfb] == s)) {
Packit 47f805
Packit 47f805
            /* use previously computed values */
Packit 47f805
            j += cod_info->width[sfb];
Packit 47f805
            distort_ = r_l3_xmin * prev_noise->noise[sfb];
Packit 47f805
Packit 47f805
            noise = prev_noise->noise_log[sfb];
Packit 47f805
Packit 47f805
        }
Packit 47f805
        else {
Packit 47f805
            FLOAT const step = POW20(s);
Packit 47f805
            l = cod_info->width[sfb] >> 1;
Packit 47f805
Packit 47f805
            if ((j + cod_info->width[sfb]) > cod_info->max_nonzero_coeff) {
Packit 47f805
                int     usefullsize;
Packit 47f805
                usefullsize = cod_info->max_nonzero_coeff - j + 1;
Packit 47f805
Packit 47f805
                if (usefullsize > 0)
Packit 47f805
                    l = usefullsize >> 1;
Packit 47f805
                else
Packit 47f805
                    l = 0;
Packit 47f805
            }
Packit 47f805
Packit 47f805
            noise = calc_noise_core_c(cod_info, &j, l, step);
Packit 47f805
Packit 47f805
Packit 47f805
            if (prev_noise) {
Packit 47f805
                /* save noise values */
Packit 47f805
                prev_noise->step[sfb] = s;
Packit 47f805
                prev_noise->noise[sfb] = noise;
Packit 47f805
            }
Packit 47f805
Packit 47f805
            distort_ = r_l3_xmin * noise;
Packit 47f805
Packit 47f805
            /* multiplying here is adding in dB, but can overflow */
Packit 47f805
            noise = FAST_LOG10(Max(distort_, 1E-20f));
Packit 47f805
Packit 47f805
            if (prev_noise) {
Packit 47f805
                /* save noise values */
Packit 47f805
                prev_noise->noise_log[sfb] = noise;
Packit 47f805
            }
Packit 47f805
        }
Packit 47f805
        *distort++ = distort_;
Packit 47f805
Packit 47f805
        if (prev_noise) {
Packit 47f805
            /* save noise values */
Packit 47f805
            prev_noise->global_gain = cod_info->global_gain;;
Packit 47f805
        }
Packit 47f805
Packit 47f805
Packit 47f805
        /*tot_noise *= Max(noise, 1E-20); */
Packit 47f805
        tot_noise_db += noise;
Packit 47f805
Packit 47f805
        if (noise > 0.0) {
Packit 47f805
            int     tmp;
Packit 47f805
Packit 47f805
            tmp = Max((int) (noise * 10 + .5), 1);
Packit 47f805
            res->over_SSD += tmp * tmp;
Packit 47f805
Packit 47f805
            over++;
Packit 47f805
            /* multiplying here is adding in dB -but can overflow */
Packit 47f805
            /*over_noise *= noise; */
Packit 47f805
            over_noise_db += noise;
Packit 47f805
        }
Packit 47f805
        max_noise = Max(max_noise, noise);
Packit 47f805
Packit 47f805
    }
Packit 47f805
Packit 47f805
    res->over_count = over;
Packit 47f805
    res->tot_noise = tot_noise_db;
Packit 47f805
    res->over_noise = over_noise_db;
Packit 47f805
    res->max_noise = max_noise;
Packit 47f805
Packit 47f805
    return over;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
/************************************************************************
Packit 47f805
 *
Packit 47f805
 *  set_pinfo()
Packit 47f805
 *
Packit 47f805
 *  updates plotting data    
Packit 47f805
 *
Packit 47f805
 *  Mark Taylor 2000-??-??                
Packit 47f805
 *
Packit 47f805
 *  Robert Hegemann: moved noise/distortion calc into it
Packit 47f805
 *
Packit 47f805
 ************************************************************************/
Packit 47f805
Packit 47f805
static void
Packit 47f805
set_pinfo(lame_internal_flags const *gfc,
Packit 47f805
          gr_info * const cod_info, const III_psy_ratio * const ratio, const int gr, const int ch)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    int     sfb, sfb2;
Packit 47f805
    int     j, i, l, start, end, bw;
Packit 47f805
    FLOAT   en0, en1;
Packit 47f805
    FLOAT const ifqstep = (cod_info->scalefac_scale == 0) ? .5 : 1.0;
Packit 47f805
    int const *const scalefac = cod_info->scalefac;
Packit 47f805
Packit 47f805
    FLOAT   l3_xmin[SFBMAX], xfsf[SFBMAX];
Packit 47f805
    calc_noise_result noise;
Packit 47f805
Packit 47f805
    (void) calc_xmin(gfc, ratio, cod_info, l3_xmin);
Packit 47f805
    (void) calc_noise(cod_info, l3_xmin, xfsf, &noise, 0);
Packit 47f805
Packit 47f805
    j = 0;
Packit 47f805
    sfb2 = cod_info->sfb_lmax;
Packit 47f805
    if (cod_info->block_type != SHORT_TYPE && !cod_info->mixed_block_flag)
Packit 47f805
        sfb2 = 22;
Packit 47f805
    for (sfb = 0; sfb < sfb2; sfb++) {
Packit 47f805
        start = gfc->scalefac_band.l[sfb];
Packit 47f805
        end = gfc->scalefac_band.l[sfb + 1];
Packit 47f805
        bw = end - start;
Packit 47f805
        for (en0 = 0.0; j < end; j++)
Packit 47f805
            en0 += cod_info->xr[j] * cod_info->xr[j];
Packit 47f805
        en0 /= bw;
Packit 47f805
        /* convert to MDCT units */
Packit 47f805
        en1 = 1e15;     /* scaling so it shows up on FFT plot */
Packit 47f805
        gfc->pinfo->en[gr][ch][sfb] = en1 * en0;
Packit 47f805
        gfc->pinfo->xfsf[gr][ch][sfb] = en1 * l3_xmin[sfb] * xfsf[sfb] / bw;
Packit 47f805
Packit 47f805
        if (ratio->en.l[sfb] > 0 && !cfg->ATHonly)
Packit 47f805
            en0 = en0 / ratio->en.l[sfb];
Packit 47f805
        else
Packit 47f805
            en0 = 0.0;
Packit 47f805
Packit 47f805
        gfc->pinfo->thr[gr][ch][sfb] = en1 * Max(en0 * ratio->thm.l[sfb], gfc->ATH->l[sfb]);
Packit 47f805
Packit 47f805
        /* there is no scalefactor bands >= SBPSY_l */
Packit 47f805
        gfc->pinfo->LAMEsfb[gr][ch][sfb] = 0;
Packit 47f805
        if (cod_info->preflag && sfb >= 11)
Packit 47f805
            gfc->pinfo->LAMEsfb[gr][ch][sfb] = -ifqstep * pretab[sfb];
Packit 47f805
Packit 47f805
        if (sfb < SBPSY_l) {
Packit 47f805
            assert(scalefac[sfb] >= 0); /* scfsi should be decoded by caller side */
Packit 47f805
            gfc->pinfo->LAMEsfb[gr][ch][sfb] -= ifqstep * scalefac[sfb];
Packit 47f805
        }
Packit 47f805
    }                   /* for sfb */
Packit 47f805
Packit 47f805
    if (cod_info->block_type == SHORT_TYPE) {
Packit 47f805
        sfb2 = sfb;
Packit 47f805
        for (sfb = cod_info->sfb_smin; sfb < SBMAX_s; sfb++) {
Packit 47f805
            start = gfc->scalefac_band.s[sfb];
Packit 47f805
            end = gfc->scalefac_band.s[sfb + 1];
Packit 47f805
            bw = end - start;
Packit 47f805
            for (i = 0; i < 3; i++) {
Packit 47f805
                for (en0 = 0.0, l = start; l < end; l++) {
Packit 47f805
                    en0 += cod_info->xr[j] * cod_info->xr[j];
Packit 47f805
                    j++;
Packit 47f805
                }
Packit 47f805
                en0 = Max(en0 / bw, 1e-20);
Packit 47f805
                /* convert to MDCT units */
Packit 47f805
                en1 = 1e15; /* scaling so it shows up on FFT plot */
Packit 47f805
Packit 47f805
                gfc->pinfo->en_s[gr][ch][3 * sfb + i] = en1 * en0;
Packit 47f805
                gfc->pinfo->xfsf_s[gr][ch][3 * sfb + i] = en1 * l3_xmin[sfb2] * xfsf[sfb2] / bw;
Packit 47f805
                if (ratio->en.s[sfb][i] > 0)
Packit 47f805
                    en0 = en0 / ratio->en.s[sfb][i];
Packit 47f805
                else
Packit 47f805
                    en0 = 0.0;
Packit 47f805
                if (cfg->ATHonly || cfg->ATHshort)
Packit 47f805
                    en0 = 0;
Packit 47f805
Packit 47f805
                gfc->pinfo->thr_s[gr][ch][3 * sfb + i] =
Packit 47f805
                    en1 * Max(en0 * ratio->thm.s[sfb][i], gfc->ATH->s[sfb]);
Packit 47f805
Packit 47f805
                /* there is no scalefactor bands >= SBPSY_s */
Packit 47f805
                gfc->pinfo->LAMEsfb_s[gr][ch][3 * sfb + i]
Packit 47f805
                    = -2.0 * cod_info->subblock_gain[i];
Packit 47f805
                if (sfb < SBPSY_s) {
Packit 47f805
                    gfc->pinfo->LAMEsfb_s[gr][ch][3 * sfb + i] -= ifqstep * scalefac[sfb2];
Packit 47f805
                }
Packit 47f805
                sfb2++;
Packit 47f805
            }
Packit 47f805
        }
Packit 47f805
    }                   /* block type short */
Packit 47f805
    gfc->pinfo->LAMEqss[gr][ch] = cod_info->global_gain;
Packit 47f805
    gfc->pinfo->LAMEmainbits[gr][ch] = cod_info->part2_3_length + cod_info->part2_length;
Packit 47f805
    gfc->pinfo->LAMEsfbits[gr][ch] = cod_info->part2_length;
Packit 47f805
Packit 47f805
    gfc->pinfo->over[gr][ch] = noise.over_count;
Packit 47f805
    gfc->pinfo->max_noise[gr][ch] = noise.max_noise * 10.0;
Packit 47f805
    gfc->pinfo->over_noise[gr][ch] = noise.over_noise * 10.0;
Packit 47f805
    gfc->pinfo->tot_noise[gr][ch] = noise.tot_noise * 10.0;
Packit 47f805
    gfc->pinfo->over_SSD[gr][ch] = noise.over_SSD;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
/************************************************************************
Packit 47f805
 *
Packit 47f805
 *  set_frame_pinfo()
Packit 47f805
 *
Packit 47f805
 *  updates plotting data for a whole frame  
Packit 47f805
 *
Packit 47f805
 *  Robert Hegemann 2000-10-21                          
Packit 47f805
 *
Packit 47f805
 ************************************************************************/
Packit 47f805
Packit 47f805
void
Packit 47f805
set_frame_pinfo(lame_internal_flags * gfc, const III_psy_ratio ratio[2][2])
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    int     ch;
Packit 47f805
    int     gr;
Packit 47f805
Packit 47f805
    /* for every granule and channel patch l3_enc and set info
Packit 47f805
     */
Packit 47f805
    for (gr = 0; gr < cfg->mode_gr; gr++) {
Packit 47f805
        for (ch = 0; ch < cfg->channels_out; ch++) {
Packit 47f805
            gr_info *const cod_info = &gfc->l3_side.tt[gr][ch];
Packit 47f805
            int     scalefac_sav[SFBMAX];
Packit 47f805
            memcpy(scalefac_sav, cod_info->scalefac, sizeof(scalefac_sav));
Packit 47f805
Packit 47f805
            /* reconstruct the scalefactors in case SCFSI was used 
Packit 47f805
             */
Packit 47f805
            if (gr == 1) {
Packit 47f805
                int     sfb;
Packit 47f805
                for (sfb = 0; sfb < cod_info->sfb_lmax; sfb++) {
Packit 47f805
                    if (cod_info->scalefac[sfb] < 0) /* scfsi */
Packit 47f805
                        cod_info->scalefac[sfb] = gfc->l3_side.tt[0][ch].scalefac[sfb];
Packit 47f805
                }
Packit 47f805
            }
Packit 47f805
Packit 47f805
            set_pinfo(gfc, cod_info, &ratio[gr][ch], gr, ch);
Packit 47f805
            memcpy(cod_info->scalefac, scalefac_sav, sizeof(scalefac_sav));
Packit 47f805
        }               /* for ch */
Packit 47f805
    }                   /* for gr */
Packit 47f805
}