mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-11-04 08:04:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1301 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1301 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 *	TwoLAME: an optimized MPEG Audio Layer Two encoder
 | 
						|
 *
 | 
						|
 *	Copyright (C) 2001-2004 Michael Cheng
 | 
						|
 *	Copyright (C) 2004-2006 The TwoLAME Project
 | 
						|
 *
 | 
						|
 *	This library is free software; you can redistribute it and/or
 | 
						|
 *	modify it under the terms of the GNU Lesser General Public
 | 
						|
 *	License as published by the Free Software Foundation; either
 | 
						|
 *	version 2.1 of the License, or (at your option) any later version.
 | 
						|
 *
 | 
						|
 *	This library is distributed in the hope that it will be useful,
 | 
						|
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
 *	Lesser General Public License for more details.
 | 
						|
 *
 | 
						|
 *	You should have received a copy of the GNU Lesser General Public
 | 
						|
 *	License along with this library; if not, write to the Free Software
 | 
						|
 *	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
 *
 | 
						|
 *  $Id$
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <math.h>
 | 
						|
 | 
						|
#include "twolame.h"
 | 
						|
#include "common.h"
 | 
						|
#include "bitbuffer.h"
 | 
						|
#include "availbits.h"
 | 
						|
#include "encode.h"
 | 
						|
 | 
						|
#include "bitbuffer_inline.h"
 | 
						|
 | 
						|
 | 
						|
static const FLOAT multiple[64] = {
 | 
						|
    2.00000000000000, 1.58740105196820, 1.25992104989487,
 | 
						|
    1.00000000000000, 0.79370052598410, 0.62996052494744, 0.50000000000000,
 | 
						|
    0.39685026299205, 0.31498026247372, 0.25000000000000, 0.19842513149602,
 | 
						|
    0.15749013123686, 0.12500000000000, 0.09921256574801, 0.07874506561843,
 | 
						|
    0.06250000000000, 0.04960628287401, 0.03937253280921, 0.03125000000000,
 | 
						|
    0.02480314143700, 0.01968626640461, 0.01562500000000, 0.01240157071850,
 | 
						|
    0.00984313320230, 0.00781250000000, 0.00620078535925, 0.00492156660115,
 | 
						|
    0.00390625000000, 0.00310039267963, 0.00246078330058, 0.00195312500000,
 | 
						|
    0.00155019633981, 0.00123039165029, 0.00097656250000, 0.00077509816991,
 | 
						|
    0.00061519582514, 0.00048828125000, 0.00038754908495, 0.00030759791257,
 | 
						|
    0.00024414062500, 0.00019377454248, 0.00015379895629, 0.00012207031250,
 | 
						|
    0.00009688727124, 0.00007689947814, 0.00006103515625, 0.00004844363562,
 | 
						|
    0.00003844973907, 0.00003051757813, 0.00002422181781, 0.00001922486954,
 | 
						|
    0.00001525878906, 0.00001211090890, 0.00000961243477, 0.00000762939453,
 | 
						|
    0.00000605545445, 0.00000480621738, 0.00000381469727, 0.00000302772723,
 | 
						|
    0.00000240310869, 0.00000190734863, 0.00000151386361, 0.00000120155435,
 | 
						|
    1E-20
 | 
						|
};
 | 
						|
 | 
						|
/* MFC May03 
 | 
						|
   Gosh. I should really document this mess.
 | 
						|
   This is a compact data format for all the info that is 
 | 
						|
   in the bit allocation tables in the mpeg standards.
 | 
						|
 | 
						|
   All the allocation tables are here. There is just multiple
 | 
						|
   redirections to find the number that you want.
 | 
						|
   
 | 
						|
   I might have to reduce the number of index tables to make the code
 | 
						|
   more readable.
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
#define NUMTABLES 5
 | 
						|
 | 
						|
/* There are really only 9 distinct lines in the allocation tables 
 | 
						|
   each member of this table is an index into */
 | 
						|
/* step_index[linenumber][index] */
 | 
						|
static const int step_index[9][16] = {
 | 
						|
    /* 0 */ {0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17},
 | 
						|
    /* 1 */ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17},
 | 
						|
    /* 2 */ {0, 1, 2, 3, 4, 5, 6, 17, 0, 0, 0, 0, 0, 0, 0, 0},
 | 
						|
    /* 3 */ {0, 1, 2, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
 | 
						|
    /* 4 */ {0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
 | 
						|
    /* 5 */ {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
 | 
						|
    /* From ISO13818 Table B.1 */
 | 
						|
    /* 6 */ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
 | 
						|
    /* 7 */ {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
 | 
						|
    /* 8 */ {0, 1, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
 | 
						|
};
 | 
						|
 | 
						|
static const int nbal[9] = { 4, 4, 3, 2, 4, 3, 4, 3, 2 };
 | 
						|
 | 
						|
 | 
						|
/* 0, 1, 2, 3, 4,  5,  6,  7,  8,	9,	 10,   11,	 12,   13,	 14,   15,	  16,	 17 */
 | 
						|
/* The number of steps allowed */
 | 
						|
static const int steps[18] =
 | 
						|
    { 0, 3, 5, 7, 9, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535 };
 | 
						|
/* The power of 2 just under the steps value */
 | 
						|
static const int steps2n[18] =
 | 
						|
    { 0, 2, 4, 4, 8, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 };
 | 
						|
/* The bits per codeword from TableB.4 */
 | 
						|
static const int bits[18] = { 0, 5, 7, 3, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
 | 
						|
 | 
						|
/* Samples per codeword Table B.4 Page 53 */
 | 
						|
//static int group[18] = {0, 3, 3, 1, 3,  1,  1,  1,  1,   1,   1,    1,    1,    1,    1,    1,     1,     1};
 | 
						|
static const int group[18] = { 0, 1, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 };
 | 
						|
 | 
						|
/* nbal */
 | 
						|
 | 
						|
/* The sblimits of the 5 allocation tables
 | 
						|
   4 tables for MPEG-1
 | 
						|
   1 table for MPEG-2 LSF */
 | 
						|
static const int table_sblimit[5] = { 27, 30, 8, 12, 30 };
 | 
						|
 | 
						|
/* Each table contains a list of allowable quantization steps.
 | 
						|
   There are only 9 distinct lists of steps.
 | 
						|
   This table gives the index of which of the 9 lists is being used 
 | 
						|
   A "-1" entry means that it is above the sblimit for this table */
 | 
						|
static const int line[5][SBLIMIT] = {
 | 
						|
    /* 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 
 | 
						|
       31 */
 | 
						|
    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, -1, -1, -1,
 | 
						|
     -1, -1},
 | 
						|
    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, -1,
 | 
						|
     -1},
 | 
						|
    {4, 4, 5, 5, 5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 | 
						|
     -1, -1, -1, -1, -1, -1},
 | 
						|
    {4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 | 
						|
     -1, -1, -1, -1, -1},
 | 
						|
    /* LSF Table */
 | 
						|
    {6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}
 | 
						|
};
 | 
						|
 | 
						|
/* This is ISO11172 Table B.1 */
 | 
						|
static const FLOAT scalefactor[64] = {  /* Equation for nth element = 2 / (cuberoot(2) ^ n) */
 | 
						|
    2.00000000000000, 1.58740105196820, 1.25992104989487,
 | 
						|
    1.00000000000000, 0.79370052598410, 0.62996052494744, 0.50000000000000,
 | 
						|
    0.39685026299205, 0.31498026247372, 0.25000000000000, 0.19842513149602,
 | 
						|
    0.15749013123686, 0.12500000000000, 0.09921256574801, 0.07874506561843,
 | 
						|
    0.06250000000000, 0.04960628287401, 0.03937253280921, 0.03125000000000,
 | 
						|
    0.02480314143700, 0.01968626640461, 0.01562500000000, 0.01240157071850,
 | 
						|
    0.00984313320230, 0.00781250000000, 0.00620078535925, 0.00492156660115,
 | 
						|
    0.00390625000000, 0.00310039267963, 0.00246078330058, 0.00195312500000,
 | 
						|
    0.00155019633981, 0.00123039165029, 0.00097656250000, 0.00077509816991,
 | 
						|
    0.00061519582514, 0.00048828125000, 0.00038754908495, 0.00030759791257,
 | 
						|
    0.00024414062500, 0.00019377454248, 0.00015379895629, 0.00012207031250,
 | 
						|
    0.00009688727124, 0.00007689947814, 0.00006103515625, 0.00004844363562,
 | 
						|
    0.00003844973907, 0.00003051757813, 0.00002422181781, 0.00001922486954,
 | 
						|
    0.00001525878906, 0.00001211090890, 0.00000961243477, 0.00000762939453,
 | 
						|
    0.00000605545445, 0.00000480621738, 0.00000381469727, 0.00000302772723,
 | 
						|
    0.00000240310869, 0.00000190734863, 0.00000151386361, 0.00000120155435,
 | 
						|
    1E-20
 | 
						|
};
 | 
						|
 | 
						|
/* ISO11172 Table C.5 Layer II Signal to Noise Raios 
 | 
						|
   MFC FIX find a reference for these in terms of bits->SNR value
 | 
						|
   Index into table is the steps index 
 | 
						|
   index   steps	SNR
 | 
						|
	   0	   0	0.00
 | 
						|
	   1	   3	7.00
 | 
						|
	   2	   5   11.00
 | 
						|
	   3	   7   16.00
 | 
						|
	   4	   9   20.84
 | 
						|
  etc
 | 
						|
*/
 | 
						|
static const FLOAT SNR[18] = {
 | 
						|
    0.00, 7.00, 11.00, 16.00, 20.84, 25.28, 31.59, 37.75, 43.84,
 | 
						|
    49.89, 55.93, 61.96, 67.98, 74.01, 80.03, 86.05, 92.01, 98.01
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
static int get_js_bound(int m_ext)
 | 
						|
{
 | 
						|
    static const int jsb_table[4] = { 4, 8, 12, 16 };
 | 
						|
 | 
						|
    if (m_ext < 0 || m_ext > 3) {
 | 
						|
        fprintf(stderr, "get_js_bound() bad modext (%d)\n", m_ext);
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
    return (jsb_table[m_ext]);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int encode_init(twolame_options * glopts)
 | 
						|
{
 | 
						|
    frame_header *header = &glopts->header;
 | 
						|
    int bsp, br_per_ch, sfrq;
 | 
						|
 | 
						|
    bsp = header->bitrate_index;
 | 
						|
    br_per_ch = glopts->bitrate / glopts->num_channels_out;
 | 
						|
    sfrq = (int) (glopts->samplerate_out / 1000.0);
 | 
						|
 | 
						|
    /* decision rules refer to per-channel bitrates (kbits/sec/chan) */
 | 
						|
    if (header->version == TWOLAME_MPEG1) { /* MPEG-1 */
 | 
						|
        if ((sfrq == 48 && br_per_ch >= 56)
 | 
						|
            || (br_per_ch >= 56 && br_per_ch <= 80))
 | 
						|
            glopts->tablenum = 0;
 | 
						|
        else if (sfrq != 48 && br_per_ch >= 96)
 | 
						|
            glopts->tablenum = 1;
 | 
						|
        else if (sfrq != 32 && br_per_ch <= 48)
 | 
						|
            glopts->tablenum = 2;
 | 
						|
        else
 | 
						|
            glopts->tablenum = 3;
 | 
						|
    } else {                    /* MPEG-2 LSF */
 | 
						|
        glopts->tablenum = 4;
 | 
						|
    }
 | 
						|
 | 
						|
    // glopts->sblimit = pick_table ( glopts );
 | 
						|
    /* MFC FIX this up */
 | 
						|
    glopts->sblimit = table_sblimit[glopts->tablenum];
 | 
						|
    // fprintf(stderr,"encode_init: using tablenum %i with sblimit %i\n",glopts->tablenum,
 | 
						|
    // glopts->sblimit);
 | 
						|
 | 
						|
    if (glopts->mode == TWOLAME_JOINT_STEREO)
 | 
						|
        glopts->jsbound = get_js_bound(header->mode_ext);
 | 
						|
    else
 | 
						|
        glopts->jsbound = glopts->sblimit;
 | 
						|
    /* alloc, tab_num set in pick_table */
 | 
						|
 | 
						|
 | 
						|
#define DUMPTABLESx
 | 
						|
#ifdef DUMPTABLES
 | 
						|
    {
 | 
						|
        int tablenumber, j, sblimit, sb;
 | 
						|
        fprintf(stderr, "Tables B.21,b,c,d from ISO11172 and the LSF table from ISO13818\n");
 | 
						|
        for (tablenumber = 0; tablenumber < NUMTABLES; tablenumber++) {
 | 
						|
            /* Print Table Header */
 | 
						|
            fprintf(stderr, "Tablenum %i\n", tablenumber);
 | 
						|
            fprintf(stderr, "sb nbal ");
 | 
						|
            for (j = 0; j < 16; j++)
 | 
						|
                fprintf(stderr, "%6i ", j);
 | 
						|
            fprintf(stderr, "\n");
 | 
						|
            fprintf(stderr,
 | 
						|
                    "-----------------------------------------------------------------------------------------------------------------------\n");
 | 
						|
 | 
						|
            sblimit = table_sblimit[tablenumber];
 | 
						|
            for (sb = 0; sb < SBLIMIT; sb++) {
 | 
						|
                int thisline = line[tablenumber][sb];
 | 
						|
                fprintf(stderr, "%2i %4i ", sb, nbal[thisline]);
 | 
						|
                if (nbal[thisline] != 0) {
 | 
						|
                    for (j = 0; j < (1 << nbal[thisline]); j++)
 | 
						|
                        fprintf(stderr, "%6i ", steps[step_index[thisline][j]]);
 | 
						|
                }
 | 
						|
                fprintf(stderr, "\n");
 | 
						|
            }
 | 
						|
            fprintf(stderr, "\n");
 | 
						|
        }
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
    // Success
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/* 
 | 
						|
   scale_factor_calc
 | 
						|
   pick_scale
 | 
						|
   if JOINTSTEREO 
 | 
						|
		 combine_LR
 | 
						|
		 scale_factor_calc
 | 
						|
   use psy model to determine SMR
 | 
						|
   transmission pattern
 | 
						|
   main_bit_allocation
 | 
						|
   if (error protection)
 | 
						|
		 calc CRC
 | 
						|
   encode_info
 | 
						|
   if (error_protection)
 | 
						|
		 encode_CRC
 | 
						|
   encode_bit_alloc
 | 
						|
   encode_scale
 | 
						|
   subband_quantization
 | 
						|
   sample_encoding
 | 
						|
*/
 | 
						|
 | 
						|
void scalefactor_calc(FLOAT sb_sample[][3][SCALE_BLOCK][SBLIMIT],
 | 
						|
                      unsigned int sf_index[][3][SBLIMIT], int nch, int sblimit)
 | 
						|
{
 | 
						|
    /* Optimized to use binary search instead of linear scan through the scalefactor table;
 | 
						|
       guarantees to find scalefactor in only 5 jumps/comparisons and not in {0 (lin. best) to 63
 | 
						|
       (lin. worst)}. Scalefactors for subbands > sblimit are no longer computed. Uses a single
 | 
						|
       sblimit-loop. Patrick De Smet Oct 1999. */
 | 
						|
    int ch, gr;
 | 
						|
    /* Using '--' loops to avoid possible "cmp value + bne/beq" compiler */
 | 
						|
    /* inefficiencies. Below loops should compile to "bne/beq" only code */
 | 
						|
    for (ch = nch; ch--;)
 | 
						|
        for (gr = 3; gr--;) {
 | 
						|
            int sb;
 | 
						|
            for (sb = sblimit; sb--;) {
 | 
						|
                int j;
 | 
						|
                unsigned int l;
 | 
						|
                register FLOAT temp;
 | 
						|
                unsigned int scale_fac;
 | 
						|
                /* Determination of max. over each set of 12 subband samples: */
 | 
						|
                /* PDS TODO: maybe this could/should ??!! be integrated into */
 | 
						|
                /* the subband filtering routines? */
 | 
						|
                register FLOAT cur_max = fabs(sb_sample[ch][gr][SCALE_BLOCK - 1][sb]);
 | 
						|
                for (j = SCALE_BLOCK - 1; j--;) {
 | 
						|
                    if ((temp = fabs(sb_sample[ch][gr][j][sb])) > cur_max)
 | 
						|
                        cur_max = temp;
 | 
						|
                }
 | 
						|
                /* PDS: binary search in the scalefactor table: */
 | 
						|
                /* This is the real speed up: */
 | 
						|
                for (l = 16, scale_fac = 32; l; l >>= 1) {
 | 
						|
                    if (cur_max <= scalefactor[scale_fac])
 | 
						|
                        scale_fac += l;
 | 
						|
                    else
 | 
						|
                        scale_fac -= l;
 | 
						|
                }
 | 
						|
                if (cur_max > scalefactor[scale_fac])
 | 
						|
                    scale_fac--;
 | 
						|
                sf_index[ch][gr][sb] = scale_fac;
 | 
						|
                /* There is a direct way of working out the index, if the maximum value is known
 | 
						|
                   but since it involves a log it isn't really speedy. Items in the scalefactor[]
 | 
						|
                   table are calculated by: the n'th entry = 2 / (cuberoot(2) ^ n) And so using a
 | 
						|
                   bit of maths you get: index = (int)(log(2.0/cur_max) / LNCUBEROOTTWO);
 | 
						|
                   fprintf(stderr,"cur_max %.14lf scalefactorindex %i multiple %.14lf\n",cur_max,
 | 
						|
                   scale_fac, scalefactor[scale_fac]); */
 | 
						|
            }
 | 
						|
        }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* Combine L&R channels into a mono joint stereo channel */
 | 
						|
void combine_lr(FLOAT sb_sample[2][3][SCALE_BLOCK][SBLIMIT],
 | 
						|
                FLOAT joint_sample[3][SCALE_BLOCK][SBLIMIT], int sblimit)
 | 
						|
{
 | 
						|
    int sb, sample, gr;
 | 
						|
 | 
						|
    for (sb = 0; sb < sblimit; ++sb)
 | 
						|
        for (sample = 0; sample < SCALE_BLOCK; ++sample)
 | 
						|
            for (gr = 0; gr < 3; ++gr)
 | 
						|
                joint_sample[gr][sample][sb] =
 | 
						|
                    .5 * (sb_sample[0][gr][sample][sb] + sb_sample[1][gr][sample][sb]);
 | 
						|
}
 | 
						|
 | 
						|
/* PURPOSE:For each subband, puts the smallest scalefactor of the 3
 | 
						|
   associated with a frame into #max_sc#.  This is used
 | 
						|
   used by Psychoacoustic Model I.
 | 
						|
   Someone in dist10 source code's history, somebody wrote the following:
 | 
						|
   "(I would recommend changin max_sc to min_sc)"
 | 
						|
   
 | 
						|
   In psy model 1, the *maximum* out of the scale picked here and
 | 
						|
   the maximum SPL within each subband is selected. So I'd think that 
 | 
						|
   a maximum here makes heaps of sense.
 | 
						|
 | 
						|
   MFC FIX: Feb 2003 - is this only needed for psy model 1?
 | 
						|
*/
 | 
						|
void find_sf_max(twolame_options * glopts,
 | 
						|
                 unsigned int sf_index[2][3][SBLIMIT], FLOAT sf_max[2][SBLIMIT])
 | 
						|
{
 | 
						|
    unsigned int sb, gr, ch;
 | 
						|
    unsigned int lowest_sf_index;
 | 
						|
    unsigned int nch = glopts->num_channels_out;
 | 
						|
    unsigned int sblimit = glopts->sblimit;
 | 
						|
 | 
						|
    for (ch = 0; ch < nch; ch++)
 | 
						|
        for (sb = 0; sb < sblimit; sb++) {
 | 
						|
            for (gr = 1, lowest_sf_index = sf_index[ch][0][sb]; gr < 3; gr++)
 | 
						|
                if (lowest_sf_index > sf_index[ch][gr][sb])
 | 
						|
                    lowest_sf_index = sf_index[ch][gr][sb];
 | 
						|
            sf_max[ch][sb] = multiple[lowest_sf_index];
 | 
						|
        }
 | 
						|
    for (sb = sblimit; sb < SBLIMIT; sb++)
 | 
						|
        sf_max[0][sb] = sf_max[1][sb] = 1E-20;
 | 
						|
}
 | 
						|
 | 
						|
/*	sf_transmission_pattern	 
 | 
						|
	PURPOSE:For a given subband, determines whether to send 1, 2, or
 | 
						|
	all 3 of the scalefactors, and fills in the scalefactor
 | 
						|
	select information accordingly
 | 
						|
 | 
						|
	This is From ISO11172 Sect C.1.5.2.5 "coding of scalefactors"
 | 
						|
	and
 | 
						|
	Table C.4 "LayerII Scalefactors Transmission Pattern"
 | 
						|
*/
 | 
						|
void sf_transmission_pattern(twolame_options * glopts,
 | 
						|
                             unsigned int sf_index[2][3][SBLIMIT],
 | 
						|
                             unsigned int sf_selectinfo[2][SBLIMIT])
 | 
						|
{
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int sblimit = glopts->sblimit;
 | 
						|
    int dscf[2];
 | 
						|
    int class[2], i, j, k;
 | 
						|
    static const int pattern[5][5] = {
 | 
						|
        {0x123, 0x122, 0x122, 0x133, 0x123},
 | 
						|
        {0x113, 0x111, 0x111, 0x444, 0x113},
 | 
						|
        {0x111, 0x111, 0x111, 0x333, 0x113},
 | 
						|
        {0x222, 0x222, 0x222, 0x333, 0x123},
 | 
						|
        {0x123, 0x122, 0x122, 0x133, 0x123}
 | 
						|
    };
 | 
						|
 | 
						|
    for (k = 0; k < nch; k++)
 | 
						|
        for (i = 0; i < sblimit; i++) {
 | 
						|
            dscf[0] = (sf_index[k][0][i] - sf_index[k][1][i]);
 | 
						|
            dscf[1] = (sf_index[k][1][i] - sf_index[k][2][i]);
 | 
						|
            for (j = 0; j < 2; j++) {
 | 
						|
                if (dscf[j] <= -3)
 | 
						|
                    class[j] = 0;
 | 
						|
                else if (dscf[j] > -3 && dscf[j] < 0)
 | 
						|
                    class[j] = 1;
 | 
						|
                else if (dscf[j] == 0)
 | 
						|
                    class[j] = 2;
 | 
						|
                else if (dscf[j] > 0 && dscf[j] < 3)
 | 
						|
                    class[j] = 3;
 | 
						|
                else
 | 
						|
                    class[j] = 4;
 | 
						|
            }
 | 
						|
            switch (pattern[class[0]][class[1]]) {
 | 
						|
            case 0x123:
 | 
						|
                sf_selectinfo[k][i] = 0;
 | 
						|
                break;
 | 
						|
            case 0x122:
 | 
						|
                sf_selectinfo[k][i] = 3;
 | 
						|
                sf_index[k][2][i] = sf_index[k][1][i];
 | 
						|
                break;
 | 
						|
            case 0x133:
 | 
						|
                sf_selectinfo[k][i] = 3;
 | 
						|
                sf_index[k][1][i] = sf_index[k][2][i];
 | 
						|
                break;
 | 
						|
            case 0x113:
 | 
						|
                sf_selectinfo[k][i] = 1;
 | 
						|
                sf_index[k][1][i] = sf_index[k][0][i];
 | 
						|
                break;
 | 
						|
            case 0x111:
 | 
						|
                sf_selectinfo[k][i] = 2;
 | 
						|
                sf_index[k][1][i] = sf_index[k][2][i] = sf_index[k][0][i];
 | 
						|
                break;
 | 
						|
            case 0x222:
 | 
						|
                sf_selectinfo[k][i] = 2;
 | 
						|
                sf_index[k][0][i] = sf_index[k][2][i] = sf_index[k][1][i];
 | 
						|
                break;
 | 
						|
            case 0x333:
 | 
						|
                sf_selectinfo[k][i] = 2;
 | 
						|
                sf_index[k][0][i] = sf_index[k][1][i] = sf_index[k][2][i];
 | 
						|
                break;
 | 
						|
            case 0x444:
 | 
						|
                sf_selectinfo[k][i] = 2;
 | 
						|
                if (sf_index[k][0][i] > sf_index[k][2][i])
 | 
						|
                    sf_index[k][0][i] = sf_index[k][2][i];
 | 
						|
                sf_index[k][1][i] = sf_index[k][2][i] = sf_index[k][0][i];
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
}
 | 
						|
 | 
						|
void write_header(twolame_options * glopts, bit_stream * bs)
 | 
						|
{
 | 
						|
    frame_header *header = &glopts->header;
 | 
						|
 | 
						|
    buffer_putbits(bs, 0xfff, 12);  /* syncword 12 bits */
 | 
						|
    buffer_put1bit(bs, header->version);    /* ID 1 bit */
 | 
						|
    buffer_putbits(bs, 4 - header->lay, 2); /* layer 2 bits */
 | 
						|
    buffer_put1bit(bs, !header->error_protection);  /* bit set => no err prot */
 | 
						|
    buffer_putbits(bs, header->bitrate_index, 4);
 | 
						|
    buffer_putbits(bs, header->samplerate_idx, 2);
 | 
						|
    buffer_put1bit(bs, header->padding);
 | 
						|
    buffer_put1bit(bs, header->private_bit);    /* private_bit */
 | 
						|
    buffer_putbits(bs, header->mode, 2);
 | 
						|
    buffer_putbits(bs, header->mode_ext, 2);
 | 
						|
    buffer_put1bit(bs, header->copyright);
 | 
						|
    buffer_put1bit(bs, header->original);
 | 
						|
    buffer_putbits(bs, header->emphasis, 2);
 | 
						|
}
 | 
						|
 | 
						|
/*************************************************************************
 | 
						|
 encode_bit_alloc (Layer II)
 | 
						|
 | 
						|
 PURPOSE: Writes bit allocation information onto bitstream
 | 
						|
 | 
						|
 4,3,2, or 0 bits depending on the quantization table used.
 | 
						|
 | 
						|
************************************************************************/
 | 
						|
void write_bit_alloc(twolame_options * glopts, unsigned int bit_alloc[2][SBLIMIT], bit_stream * bs)
 | 
						|
{
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int sblimit = glopts->sblimit;
 | 
						|
    int jsbound = glopts->jsbound;
 | 
						|
    int sb, ch;
 | 
						|
 | 
						|
    for (sb = 0; sb < sblimit; sb++) {
 | 
						|
        if (sb < jsbound) {
 | 
						|
            for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ch++) {
 | 
						|
                buffer_putbits(bs, bit_alloc[ch][sb], nbal[line[glopts->tablenum][sb]]);
 | 
						|
                glopts->num_crc_bits += nbal[line[glopts->tablenum][sb]];
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            buffer_putbits(bs, bit_alloc[0][sb], nbal[line[glopts->tablenum][sb]]);
 | 
						|
            glopts->num_crc_bits += nbal[line[glopts->tablenum][sb]];
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
 write_scalefactors
 | 
						|
 | 
						|
 PURPOSE:The encoded scalar factor information is arranged and
 | 
						|
 queued into the output fifo to be transmitted.
 | 
						|
 | 
						|
 The three scale factors associated with
 | 
						|
 a given subband and channel are transmitted in accordance
 | 
						|
 with the scfsi, which is transmitted first.
 | 
						|
 | 
						|
************************************************************************/
 | 
						|
 | 
						|
void write_scalefactors(twolame_options * glopts,
 | 
						|
                        unsigned int bit_alloc[2][SBLIMIT],
 | 
						|
                        unsigned int sf_selectinfo[2][SBLIMIT],
 | 
						|
                        unsigned int sf_index[2][3][SBLIMIT], bit_stream * bs)
 | 
						|
{
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int sblimit = glopts->sblimit;
 | 
						|
    int sb, gr, ch;
 | 
						|
 | 
						|
    /* Write out the scalefactor selection information */
 | 
						|
    for (sb = 0; sb < sblimit; sb++)
 | 
						|
        for (ch = 0; ch < nch; ch++)
 | 
						|
            if (bit_alloc[ch][sb]) {
 | 
						|
                buffer_putbits(bs, sf_selectinfo[ch][sb], 2);
 | 
						|
                glopts->num_crc_bits += 2;
 | 
						|
            }
 | 
						|
 | 
						|
    /* Write out the scalefactors */
 | 
						|
    for (sb = 0; sb < sblimit; sb++)
 | 
						|
        for (ch = 0; ch < nch; ch++)
 | 
						|
            if (bit_alloc[ch][sb])  // above jsbound, bit_alloc[0][i] == ba[1][i] 
 | 
						|
            {
 | 
						|
                switch (sf_selectinfo[ch][sb]) {
 | 
						|
                case 0:
 | 
						|
                    for (gr = 0; gr < 3; gr++)
 | 
						|
                        buffer_putbits(bs, sf_index[ch][gr][sb], 6);
 | 
						|
                    break;
 | 
						|
                case 1:
 | 
						|
                case 3:
 | 
						|
                    buffer_putbits(bs, sf_index[ch][0][sb], 6);
 | 
						|
                    buffer_putbits(bs, sf_index[ch][2][sb], 6);
 | 
						|
                    break;
 | 
						|
                case 2:
 | 
						|
                    buffer_putbits(bs, sf_index[ch][0][sb], 6);
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* ISO11172 Table C.6 Layer II quantization co-efficients */
 | 
						|
static const FLOAT a[18] = {
 | 
						|
    0,
 | 
						|
    0.750000000, 0.625000000, 0.875000000, 0.562500000, 0.937500000,
 | 
						|
    0.968750000, 0.984375000, 0.992187500, 0.996093750, 0.998046875,
 | 
						|
    0.999023438, 0.999511719, 0.999755859, 0.999877930, 0.999938965,
 | 
						|
    0.999969482, 0.999984741
 | 
						|
};
 | 
						|
 | 
						|
static const FLOAT b[18] = {
 | 
						|
    0,
 | 
						|
    -0.250000000, -0.375000000, -0.125000000, -0.437500000, -0.062500000,
 | 
						|
    -0.031250000, -0.015625000, -0.007812500, -0.003906250, -0.001953125,
 | 
						|
    -0.000976563, -0.000488281, -0.000244141, -0.000122070, -0.000061035,
 | 
						|
    -0.000030518, -0.000015259
 | 
						|
};
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
   subband_quantization (Layer II)
 | 
						|
 | 
						|
 PURPOSE:Quantizes subband samples to appropriate number of bits
 | 
						|
 | 
						|
 SEMANTICS:	 Subband samples are divided by their scalefactors, which
 | 
						|
 makes the quantization more efficient. The scaled samples are
 | 
						|
 quantized by the function a*x+b, where a and b are functions of
 | 
						|
 the number of quantization levels. The result is then truncated
 | 
						|
 to the appropriate number of bits and the MSB is inverted.
 | 
						|
 | 
						|
 Note that for fractional 2's complement, inverting the MSB for a
 | 
						|
 negative number x is equivalent to adding 1 to it.
 | 
						|
 | 
						|
************************************************************************/
 | 
						|
void
 | 
						|
subband_quantization(twolame_options * glopts,
 | 
						|
                     unsigned int sf_index[2][3][SBLIMIT],
 | 
						|
                     FLOAT sb_samples[2][3][SCALE_BLOCK][SBLIMIT],
 | 
						|
                     unsigned int j_scale[3][SBLIMIT],
 | 
						|
                     FLOAT j_samps[3][SCALE_BLOCK][SBLIMIT],
 | 
						|
                     unsigned int bit_alloc[2][SBLIMIT],
 | 
						|
                     unsigned int sbband[2][3][SCALE_BLOCK][SBLIMIT])
 | 
						|
{
 | 
						|
    int sb, j, ch, gr, qnt_coeff_index, sig;
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int sblimit = glopts->sblimit;
 | 
						|
    int jsbound = glopts->jsbound;
 | 
						|
    FLOAT d;
 | 
						|
 | 
						|
    for (gr = 0; gr < 3; gr++)
 | 
						|
        for (j = 0; j < SCALE_BLOCK; j++)
 | 
						|
            for (sb = 0; sb < sblimit; sb++)
 | 
						|
                for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ch++)
 | 
						|
 | 
						|
                    if (bit_alloc[ch][sb]) {
 | 
						|
                        /* scale and quantize FLOATing point sample */
 | 
						|
                        if (nch == 2 && sb >= jsbound)  /* use j-stereo samples */
 | 
						|
                            d = j_samps[gr][j][sb] / scalefactor[j_scale[gr][sb]];
 | 
						|
                        else
 | 
						|
                            d = sb_samples[ch][gr][j][sb] / scalefactor[sf_index[ch][gr][sb]];
 | 
						|
 | 
						|
                        /* Check that the wrong scale factor hasn't been chosen - which would
 | 
						|
                           result in a scaled sample being > 1.0 This error shouldn't ever happen
 | 
						|
                           *unless* something went wrong in scalefactor calc
 | 
						|
 | 
						|
                           if (mod (d) > 1.0) fprintf (stderr, "Not scaled properly %d %d %d %d\n", 
 | 
						|
                           ch, gr, j, sb); */
 | 
						|
 | 
						|
                        {
 | 
						|
                            /* 'index' indicates which "step line" we are using */
 | 
						|
                            int index = line[glopts->tablenum][sb];
 | 
						|
 | 
						|
                            /* Find the "step index" within that line */
 | 
						|
                            qnt_coeff_index = step_index[index][bit_alloc[ch][sb]];
 | 
						|
                        }
 | 
						|
                        d = d * a[qnt_coeff_index] + b[qnt_coeff_index];
 | 
						|
 | 
						|
                        /* extract MSB N-1 bits from the FLOATing point sample */
 | 
						|
                        if (d >= 0)
 | 
						|
                            sig = 1;
 | 
						|
                        else {
 | 
						|
                            sig = 0;
 | 
						|
                            d += 1.0;
 | 
						|
                        }
 | 
						|
 | 
						|
                        sbband[ch][gr][j][sb] =
 | 
						|
                            (unsigned int) (d * (FLOAT) steps2n[qnt_coeff_index]);
 | 
						|
                        /* tag the inverted sign bit to sbband at position N */
 | 
						|
                        /* The bit inversion is a must for grouping with 3,5,9 steps so it is done
 | 
						|
                           for all subbands */
 | 
						|
                        if (sig)
 | 
						|
                            sbband[ch][gr][j][sb] |= steps2n[qnt_coeff_index];
 | 
						|
                    }
 | 
						|
 | 
						|
    /* Set everything above the sblimit to 0 */
 | 
						|
    for (ch = 0; ch < nch; ch++)
 | 
						|
        for (gr = 0; gr < 3; gr++)
 | 
						|
            for (sb = 0; sb < SCALE_BLOCK; sb++)
 | 
						|
                for (j = sblimit; j < SBLIMIT; j++)
 | 
						|
                    sbband[ch][gr][sb][j] = 0;
 | 
						|
}
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
	sample_encoding	 
 | 
						|
 | 
						|
 PURPOSE:Put one frame of subband samples on to the bitstream
 | 
						|
 | 
						|
 SEMANTICS:	 The number of bits allocated per sample is read from
 | 
						|
 the bit allocation information #bit_alloc#.  Layer 2
 | 
						|
 supports writing grouped samples for quantization steps
 | 
						|
 that are not a power of 2.
 | 
						|
 | 
						|
***********************************************************************/
 | 
						|
void write_samples(twolame_options * glopts,
 | 
						|
                   unsigned int sbband[2][3][SCALE_BLOCK][SBLIMIT],
 | 
						|
                   unsigned int bit_alloc[2][SBLIMIT], bit_stream * bs)
 | 
						|
{
 | 
						|
    unsigned int nch = glopts->num_channels_out;
 | 
						|
    unsigned int sblimit = glopts->sblimit;
 | 
						|
    unsigned int jsbound = glopts->jsbound;
 | 
						|
    unsigned int sb, j, ch, gr, x, y;
 | 
						|
    unsigned int temp;
 | 
						|
 | 
						|
    for (gr = 0; gr < 3; gr++)
 | 
						|
        for (j = 0; j < SCALE_BLOCK; j += 3)
 | 
						|
            for (sb = 0; sb < sblimit; sb++)
 | 
						|
                for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ch++) {
 | 
						|
                    if (bit_alloc[ch][sb]) {
 | 
						|
                        int thisline = line[glopts->tablenum][sb];
 | 
						|
                        int thisstep_index = step_index[thisline][bit_alloc[ch][sb]];
 | 
						|
 | 
						|
                        /* Check how many samples per codeword */
 | 
						|
                        if (group[thisstep_index] == 3) {
 | 
						|
                            /* Going to send 1 sample per codeword -> 3 samples */
 | 
						|
                            for (x = 0; x < 3; x++) {
 | 
						|
                                buffer_putbits(bs, sbband[ch][gr][j + x][sb], bits[thisstep_index]);
 | 
						|
                            }
 | 
						|
 | 
						|
                        } else {
 | 
						|
                            /* ISO11172 Sec C.1.5.2.8 If steps=3, 5 or 9, then three consecutive
 | 
						|
                               samples are coded as one codeword i.e. only one value (V) is
 | 
						|
                               transmitted for this triplet. If the 3 subband samples are x,y,z
 | 
						|
                               then V = (steps*steps)*z + steps*y +x */
 | 
						|
                            y = steps[thisstep_index];
 | 
						|
                            temp =
 | 
						|
                                sbband[ch][gr][j][sb] + sbband[ch][gr][j + 1][sb] * y +
 | 
						|
                                sbband[ch][gr][j + 2][sb] * y * y;
 | 
						|
                            buffer_putbits(bs, temp, bits[thisstep_index]);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
*
 | 
						|
* bits_for_nonoise (Layer II)
 | 
						|
*
 | 
						|
* PURPOSE:Returns the number of bits required to produce a
 | 
						|
* mask-to-noise ratio better or equal to the noise/no_noise threshold.
 | 
						|
*
 | 
						|
* SEMANTICS:
 | 
						|
* bbal = # bits needed for encoding bit allocation
 | 
						|
* bsel = # bits needed for encoding scalefactor select information
 | 
						|
* banc = # bits needed for ancillary data (header info included)
 | 
						|
*
 | 
						|
* For each subband and channel, will add bits until one of the
 | 
						|
* following occurs:
 | 
						|
* - Hit maximum number of bits we can allocate for that subband
 | 
						|
* - MNR is better than or equal to the minimum masking level
 | 
						|
*	(NOISY_MIN_MNR)
 | 
						|
* Then the bits required for scalefactors, scfsi, bit allocation,
 | 
						|
* and the subband samples are tallied (#req_bits#) and returned.
 | 
						|
*
 | 
						|
* (NOISY_MIN_MNR) is the smallest MNR a subband can have before it is
 | 
						|
* counted as 'noisy' by the logic which chooses the number of JS
 | 
						|
* subbands.
 | 
						|
*
 | 
						|
* Joint stereo is supported.
 | 
						|
*
 | 
						|
************************************************************************/
 | 
						|
 | 
						|
int bits_for_nonoise(twolame_options * glopts,
 | 
						|
                     FLOAT SMR[2][SBLIMIT],
 | 
						|
                     unsigned int scfsi[2][SBLIMIT], FLOAT min_mnr,
 | 
						|
                     unsigned int bit_alloc[2][SBLIMIT])
 | 
						|
{
 | 
						|
    frame_header *header = &glopts->header;
 | 
						|
    int sb, ch, ba;
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int sblimit = glopts->sblimit;
 | 
						|
    int jsbound = glopts->jsbound;
 | 
						|
    int req_bits = 0, bbal = 0, berr = 0, banc = 32;
 | 
						|
    int maxAlloc, sel_bits, sc_bits, smp_bits;
 | 
						|
    static const int sfsPerScfsi[] = { 3, 2, 1, 2 };    /* lookup # sfs per scfsi */
 | 
						|
 | 
						|
    /* MFC Feb 2003 This works out the basic number of bits just to get a valid (but empty) frame.
 | 
						|
       This needs to be done for every frame, since a joint_stereo frame will change the number of
 | 
						|
       basic bits (depending on the sblimit in the particular js mode that's been selected */
 | 
						|
 | 
						|
    /* Make sure there's room for the error protection bits */
 | 
						|
    if (header->error_protection)
 | 
						|
        berr = 16;
 | 
						|
    else
 | 
						|
        berr = 0;
 | 
						|
 | 
						|
    /* Count the number of bits required to encode the quantization index for both channels in each 
 | 
						|
       subband. If we're above the jsbound, then pretend we only have one channel */
 | 
						|
    for (sb = 0; sb < jsbound; ++sb)
 | 
						|
        bbal += nch * nbal[line[glopts->tablenum][sb]]; // (*alloc)[sb][0].bits;
 | 
						|
 | 
						|
    for (sb = jsbound; sb < sblimit; ++sb)
 | 
						|
        bbal += nbal[line[glopts->tablenum][sb]];   // (*alloc)[sb][0].bits;
 | 
						|
    req_bits = banc + bbal + berr;
 | 
						|
 | 
						|
    for (sb = 0; sb < sblimit; ++sb)
 | 
						|
        for (ch = 0; ch < ((sb < jsbound) ? nch : 1); ++ch) {
 | 
						|
            int thisline = line[glopts->tablenum][sb];
 | 
						|
 | 
						|
            /* How many possible steps are there to choose from ? */
 | 
						|
            maxAlloc = (1 << nbal[line[glopts->tablenum][sb]]) - 1; // (*alloc)[sb][0].bits) - 1;
 | 
						|
            sel_bits = sc_bits = smp_bits = 0;
 | 
						|
            /* Keep choosing the next number of steps (and hence our SNR value) until we have the
 | 
						|
               required MNR value */
 | 
						|
            for (ba = 0; ba < maxAlloc - 1; ++ba) {
 | 
						|
                int thisstep_index = step_index[thisline][ba];
 | 
						|
                if ((SNR[thisstep_index] - SMR[ch][sb]) >= min_mnr)
 | 
						|
                    break;      /* we found enough bits */
 | 
						|
            }
 | 
						|
            if (nch == 2 && sb >= jsbound)  /* check other JS channel */
 | 
						|
                for (; ba < maxAlloc - 1; ++ba) {
 | 
						|
                    int thisstep_index = step_index[thisline][ba];
 | 
						|
                    if ((SNR[thisstep_index] - SMR[1 - ch][sb]) >= min_mnr)
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            if (ba > 0) {
 | 
						|
                // smp_bits = SCALE_BLOCK * ((*alloc)[sb][ba].group * (*alloc)[sb][ba].bits);
 | 
						|
                int thisstep_index = step_index[thisline][ba];
 | 
						|
                smp_bits = SCALE_BLOCK * group[thisstep_index] * bits[thisstep_index];
 | 
						|
                /* scale factor bits required for subband */
 | 
						|
                sel_bits = 2;
 | 
						|
                sc_bits = 6 * sfsPerScfsi[scfsi[ch][sb]];
 | 
						|
                if (nch == 2 && sb >= jsbound) {
 | 
						|
                    /* each new js sb has L+R scfsis */
 | 
						|
                    sel_bits += 2;
 | 
						|
                    sc_bits += 6 * sfsPerScfsi[scfsi[1 - ch][sb]];
 | 
						|
                }
 | 
						|
                req_bits += smp_bits + sel_bits + sc_bits;
 | 
						|
            }
 | 
						|
            bit_alloc[ch][sb] = ba;
 | 
						|
        }
 | 
						|
    return req_bits;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* must be called before calling main_bit_allocation */
 | 
						|
int init_bit_allocation(twolame_options * glopts)
 | 
						|
{
 | 
						|
    frame_header *header = &glopts->header;
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int brindex;
 | 
						|
 | 
						|
 | 
						|
    /* these are the tables which specify the limits within which the VBR can vary You can't vary
 | 
						|
       outside these ranges, otherwise a new alloc table would have to be loaded in the middle of
 | 
						|
       encoding. This VBR hack is dodgy - the standard says that LayerII decoders don't have to
 | 
						|
       support a variable bitrate, but Layer3 decoders must do so. Hence, it is unlikely that a
 | 
						|
       compliant layer2 decoder would be written to dynmically change allocation tables. *BUT* a
 | 
						|
       layer3 encoder might handle it by default, meaning we could switch tables mid-encode and
 | 
						|
       enjoy a wider range of bitrates for the VBR encoding. None of this needs to be done for LSF, 
 | 
						|
       since there is only *one* possible alloc table in LSF MFC Feb 2003 */
 | 
						|
 | 
						|
    static const int vbrlimits[2][3][2] = {
 | 
						|
        /* MONO */
 | 
						|
        { /* 44 */ {6, 10},
 | 
						|
         /* 48 */ {3, 10},
 | 
						|
         /* 32 */ {6, 10}},
 | 
						|
        /* STEREO */
 | 
						|
        { /* 44 */ {10, 14},
 | 
						|
         /* 48 */ {7, 14},
 | 
						|
         /* 32 */ {10, 14}}
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
    for (brindex = 0; brindex < 15; brindex++)
 | 
						|
        glopts->bitrateindextobits[brindex] = 0;
 | 
						|
 | 
						|
    if (header->version == 0) {
 | 
						|
        /* LSF: so can use any bitrate index from 1->15 */
 | 
						|
        glopts->lower_index = 1;
 | 
						|
        glopts->upper_index = 14;
 | 
						|
    } else {
 | 
						|
        int sfreq = header->samplerate_idx;
 | 
						|
        glopts->lower_index = vbrlimits[nch - 1][sfreq][0];
 | 
						|
        glopts->upper_index = vbrlimits[nch - 1][sfreq][1];
 | 
						|
    }
 | 
						|
 | 
						|
    if (glopts->vbr_upper_index > 0) {
 | 
						|
        /* User is requesting a specific upperbitrate */
 | 
						|
        if ((glopts->vbr_upper_index < glopts->lower_index) ||
 | 
						|
            (glopts->vbr_upper_index > glopts->upper_index)) {
 | 
						|
            fprintf(stderr, "Can't satisfy upper bitrate index constraint. out of bounds. %i\n",
 | 
						|
                    glopts->vbr_upper_index);
 | 
						|
            return -2;
 | 
						|
        } else
 | 
						|
            glopts->upper_index = glopts->vbr_upper_index;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /* set up a conversion table for bitrateindex->bits for this version/sampl freq This will be
 | 
						|
       used to find the best bitrate to cope with the number of bits that are needed (as determined 
 | 
						|
       by vbr_bits_for_nonoise) */
 | 
						|
    for (brindex = glopts->lower_index; brindex <= glopts->upper_index; brindex++) {
 | 
						|
        glopts->bitrateindextobits[brindex] =
 | 
						|
            (int) (1152.0 / (glopts->samplerate_out / 1000.0) * (FLOAT) glopts->bitrate);
 | 
						|
    }
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
*
 | 
						|
* main_bit_allocation  (Layer II)
 | 
						|
*
 | 
						|
* PURPOSE:For joint stereo mode, determines which of the 4 joint
 | 
						|
* stereo modes is needed.  Then calls *_a_bit_allocation(), which
 | 
						|
* allocates bits for each of the subbands until there are no more bits
 | 
						|
* left, or the MNR is at the noise/no_noise threshold.
 | 
						|
*
 | 
						|
* SEMANTICS:
 | 
						|
*
 | 
						|
* For joint stereo mode, joint stereo is changed to stereo if
 | 
						|
* there are enough bits to encode stereo at or better than the
 | 
						|
* no-noise threshold (NOISY_MIN_MNR).  Otherwise, the system
 | 
						|
* iteratively allocates less bits by using joint stereo until one
 | 
						|
* of the following occurs:
 | 
						|
* - there are no more noisy subbands (MNR >= NOISY_MIN_MNR)
 | 
						|
* - mode_ext has been reduced to 0, which means that all but the
 | 
						|
*	lowest 4 subbands have been converted from stereo to joint
 | 
						|
*	stereo, and no more subbands may be converted
 | 
						|
*
 | 
						|
*	  This function calls *_bits_for_nonoise() and *_a_bit_allocation().
 | 
						|
*
 | 
						|
************************************************************************/
 | 
						|
void main_bit_allocation(twolame_options * glopts,
 | 
						|
                         FLOAT SMR[2][SBLIMIT],
 | 
						|
                         unsigned int scfsi[2][SBLIMIT],
 | 
						|
                         unsigned int bit_alloc[2][SBLIMIT], int *adb)
 | 
						|
{
 | 
						|
    frame_header *header = &glopts->header;
 | 
						|
    int noisy_sbs;
 | 
						|
    int mode = glopts->mode;
 | 
						|
    int mode_ext, lay;
 | 
						|
    int rq_db;                  /* av_db = *adb; Not Used MFC Nov 99 */
 | 
						|
    int guessindex = 0;
 | 
						|
 | 
						|
 | 
						|
    if (mode == TWOLAME_JOINT_STEREO) {
 | 
						|
        header->mode = TWOLAME_STEREO;
 | 
						|
        header->mode_ext = 0;
 | 
						|
        glopts->jsbound = glopts->sblimit;
 | 
						|
        if ((rq_db = bits_for_nonoise(glopts, SMR, scfsi, 0, bit_alloc)) > *adb) {
 | 
						|
            header->mode = TWOLAME_JOINT_STEREO;
 | 
						|
            mode_ext = 4;       /* 3 is least severe reduction */
 | 
						|
            lay = header->lay;
 | 
						|
            do {
 | 
						|
                --mode_ext;
 | 
						|
                glopts->jsbound = get_js_bound(mode_ext);
 | 
						|
                rq_db = bits_for_nonoise(glopts, SMR, scfsi, 0, bit_alloc);
 | 
						|
            }
 | 
						|
            while ((rq_db > *adb) && (mode_ext > 0));
 | 
						|
            header->mode_ext = mode_ext;
 | 
						|
        }                       /* well we either eliminated noisy sbs or mode_ext == 0 */
 | 
						|
    }
 | 
						|
 | 
						|
    /* decide on which bit allocation method to use */
 | 
						|
    if (glopts->vbr == FALSE) {
 | 
						|
        /* Just do the old bit allocation method */
 | 
						|
        noisy_sbs = a_bit_allocation(glopts, SMR, scfsi, bit_alloc, adb);
 | 
						|
    } else {
 | 
						|
        /* do the VBR bit allocation method */
 | 
						|
        header->bitrate_index = glopts->lower_index;
 | 
						|
        *adb = available_bits(glopts);
 | 
						|
        {
 | 
						|
            int brindex;
 | 
						|
            int found = FALSE;
 | 
						|
 | 
						|
            /* Work out how many bits are needed for there to be no noise (ie all MNR > VBRLEVEL) */
 | 
						|
            int req = bits_for_nonoise(glopts, SMR, scfsi, glopts->vbrlevel, bit_alloc);
 | 
						|
 | 
						|
            /* Look up this value in the bitrateindextobits table to find what bitrate we should
 | 
						|
               use for this frame */
 | 
						|
            for (brindex = glopts->lower_index; brindex <= glopts->upper_index; brindex++) {
 | 
						|
                if (glopts->bitrateindextobits[brindex] > req) {
 | 
						|
                    /* this method always *overestimates* the bits that are needed i.e. it will
 | 
						|
                       usually guess right but when it's wrong it'll guess a higher bitrate than
 | 
						|
                       actually required. e.g. on "messages from earth" track 6, the guess was
 | 
						|
                       wrong on 75/36341 frames. each time it guessed higher. MFC Feb 2003 */
 | 
						|
                    guessindex = brindex;
 | 
						|
                    found = TRUE;
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            /* Just for sanity */
 | 
						|
            if (found == FALSE)
 | 
						|
                guessindex = glopts->upper_index;
 | 
						|
        }
 | 
						|
 | 
						|
        header->bitrate_index = guessindex;
 | 
						|
        *adb = available_bits(glopts);
 | 
						|
 | 
						|
        /* update the statistics */
 | 
						|
        glopts->vbrstats[header->bitrate_index]++;
 | 
						|
 | 
						|
        if (glopts->verbosity > 3) {
 | 
						|
            /* print out the VBR stats every 1000th frame */
 | 
						|
            int i;
 | 
						|
            if ((glopts->vbr_frame_count++ % 1000) == 0) {
 | 
						|
                for (i = 1; i < 15; i++)
 | 
						|
                    fprintf(stderr, "%4i ", glopts->vbrstats[i]);
 | 
						|
                fprintf(stderr, "\n");
 | 
						|
            }
 | 
						|
 | 
						|
            /* Print out *every* frames bitrateindex, bits required, and bits available at this
 | 
						|
               bitrate */
 | 
						|
            if (glopts->verbosity > 5)
 | 
						|
                fprintf(stderr,
 | 
						|
                        "> bitrate index %2i has %i bits available to encode the %i bits\n",
 | 
						|
                        header->bitrate_index, *adb,
 | 
						|
                        bits_for_nonoise(glopts, SMR, scfsi, glopts->vbrlevel, bit_alloc));
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        noisy_sbs = vbr_bit_allocation(glopts, SMR, scfsi, bit_alloc, adb);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void vbr_maxmnr(FLOAT mnr[2][SBLIMIT], char used[2][SBLIMIT], int sblimit,
 | 
						|
                       int nch, int *min_sb, int *min_ch, FLOAT vbrlevel)
 | 
						|
{
 | 
						|
    int sb, ch;
 | 
						|
    FLOAT small;
 | 
						|
 | 
						|
    small = 999999.0;
 | 
						|
    *min_sb = -1;
 | 
						|
    *min_ch = -1;
 | 
						|
 | 
						|
#define NEWBITx
 | 
						|
#ifdef NEWBIT
 | 
						|
    /* Keep going until all subbands have reached the MNR level that we specified */
 | 
						|
    for (ch = 0; ch < nch; ch++)
 | 
						|
        for (sb = 0; sb < sblimit; sb++)
 | 
						|
            if (mnr[ch][sb] < vbrlevel) {
 | 
						|
                *min_sb = sb;
 | 
						|
                *min_ch = ch;
 | 
						|
                // fprintf(stderr,".");
 | 
						|
                // fflush(stderr);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
#endif
 | 
						|
 | 
						|
    /* Then start adding bits to whichever is the min MNR */
 | 
						|
    for (ch = 0; ch < nch; ++ch)
 | 
						|
        for (sb = 0; sb < sblimit; sb++)
 | 
						|
            if (used[ch][sb] != 2 && small > mnr[ch][sb]) {
 | 
						|
                small = mnr[ch][sb];
 | 
						|
                *min_sb = sb;
 | 
						|
                *min_ch = ch;
 | 
						|
            }
 | 
						|
    // fprintf(stderr,"Min sb: %i\n",*min_sb);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/********************
 | 
						|
MFC Feb 2003
 | 
						|
vbr_bit_allocation is different to the normal a_bit_allocation in that
 | 
						|
it is known beforehand that there are definitely enough bits to do what we 
 | 
						|
have to - i.e. a bitrate was specificially chosen in main_bit_allocation so
 | 
						|
that we have enough bits to encode what we have to.
 | 
						|
This function should take that into account and just greedily assign
 | 
						|
the bits, rather than fussing over the minimum MNR subband - we know
 | 
						|
each subband gets its required bits, why quibble?
 | 
						|
This function doesn't chew much CPU, so I haven't made any attempt
 | 
						|
to do this yet.
 | 
						|
*********************/
 | 
						|
int vbr_bit_allocation(twolame_options * glopts,
 | 
						|
                       FLOAT SMR[2][SBLIMIT],
 | 
						|
                       unsigned int scfsi[2][SBLIMIT], unsigned int bit_alloc[2][SBLIMIT], int *adb)
 | 
						|
{
 | 
						|
    int sb, min_ch, min_sb, oth_ch, ch, increment, scale, seli, ba;
 | 
						|
    int bspl, bscf, bsel, ad, bbal = 0;
 | 
						|
    frame_header *header = &glopts->header;
 | 
						|
    FLOAT mnr[2][SBLIMIT];
 | 
						|
    char used[2][SBLIMIT];
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int sblimit = glopts->sblimit;
 | 
						|
    int jsbound = glopts->jsbound;
 | 
						|
    int banc, berr;
 | 
						|
    static const int sfsPerScfsi[] = { 3, 2, 1, 2 };    /* lookup # sfs per scfsi */
 | 
						|
    int thisstep_index;
 | 
						|
 | 
						|
    if (header->error_protection) {
 | 
						|
        berr = 16;              /* added 92-08-11 shn */
 | 
						|
        banc = 32;
 | 
						|
    } else {
 | 
						|
        berr = 0;
 | 
						|
        banc = 32;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /* No need to worry about jsbound here as JS is disabled for VBR mode */
 | 
						|
    for (sb = 0; sb < sblimit; sb++)
 | 
						|
        bbal += nch * nbal[line[glopts->tablenum][sb]];
 | 
						|
    *adb -= bbal + berr + banc;
 | 
						|
    ad = *adb;
 | 
						|
 | 
						|
    for (sb = 0; sb < sblimit; sb++)
 | 
						|
        for (ch = 0; ch < nch; ch++) {
 | 
						|
            mnr[ch][sb] = SNR[0] - SMR[ch][sb];
 | 
						|
            bit_alloc[ch][sb] = 0;
 | 
						|
            used[ch][sb] = 0;
 | 
						|
        }
 | 
						|
    bspl = bscf = bsel = 0;
 | 
						|
 | 
						|
    do {
 | 
						|
        /* locate the subband with minimum SMR */
 | 
						|
        vbr_maxmnr(mnr, used, sblimit, nch, &min_sb, &min_ch, glopts->vbrlevel);
 | 
						|
 | 
						|
        if (min_sb > -1) {      /* there was something to find */
 | 
						|
            int thisline = line[glopts->tablenum][min_sb]; {
 | 
						|
                /* find increase in bit allocation in subband [min] */
 | 
						|
                int nextstep_index = step_index[thisline][bit_alloc[min_ch][min_sb] + 1];
 | 
						|
                increment = SCALE_BLOCK * group[nextstep_index] * bits[nextstep_index];
 | 
						|
            }
 | 
						|
            if (used[min_ch][min_sb]) {
 | 
						|
                /* If we've already increased the limit on this ch/sb, then subtract the last thing 
 | 
						|
                   that we added */
 | 
						|
                thisstep_index = step_index[thisline][bit_alloc[min_ch][min_sb]];
 | 
						|
                increment -= SCALE_BLOCK * group[thisstep_index] * bits[thisstep_index];
 | 
						|
            }
 | 
						|
 | 
						|
            /* scale factor bits required for subband [min] */
 | 
						|
            oth_ch = 1 - min_ch;    /* above js bound, need both chans */
 | 
						|
            if (used[min_ch][min_sb]) {
 | 
						|
                scale = seli = 0;
 | 
						|
            } else {            /* this channel had no bits or scfs before */
 | 
						|
                seli = 2;
 | 
						|
                scale = 6 * sfsPerScfsi[scfsi[min_ch][min_sb]];
 | 
						|
                if (nch == 2 && min_sb >= jsbound) {
 | 
						|
                    /* each new js sb has L+R scfsis */
 | 
						|
                    seli += 2;
 | 
						|
                    scale += 6 * sfsPerScfsi[scfsi[oth_ch][min_sb]];
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            /* check to see enough bits were available for */
 | 
						|
            /* increasing resolution in the minimum band */
 | 
						|
            if (ad >= bspl + bscf + bsel + seli + scale + increment) {
 | 
						|
                /* Then there are enough bits to have another go at allocating */
 | 
						|
                ba = ++bit_alloc[min_ch][min_sb];   /* next up alloc */
 | 
						|
                bspl += increment;  /* bits for subband sample */
 | 
						|
                bscf += scale;  /* bits for scale factor */
 | 
						|
                bsel += seli;   /* bits for scfsi code */
 | 
						|
                used[min_ch][min_sb] = 1;   /* subband has bits */
 | 
						|
                thisstep_index = step_index[thisline][ba];
 | 
						|
                mnr[min_ch][min_sb] = SNR[thisstep_index] - SMR[min_ch][min_sb];
 | 
						|
                /* Check if this min_sb subband has been fully allocated max bits */
 | 
						|
                if (ba >= (1 << nbal[line[glopts->tablenum][min_sb]]) - 1)  // (*alloc)[min_sb][0].bits) 
 | 
						|
                                                                            // 
 | 
						|
                    // - 1)
 | 
						|
                    used[min_ch][min_sb] = 2;   /* don't let this sb get any more bits */
 | 
						|
            } else {
 | 
						|
                used[min_ch][min_sb] = 2;   /* can't increase this alloc */
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
    while (min_sb > -1);        /* until could find no channel */
 | 
						|
 | 
						|
    /* Calculate the number of bits left */
 | 
						|
    ad -= bspl + bscf + bsel;
 | 
						|
    *adb = ad;
 | 
						|
    for (ch = 0; ch < nch; ch++)
 | 
						|
        for (sb = sblimit; sb < SBLIMIT; sb++)
 | 
						|
            bit_alloc[ch][sb] = 0;
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
static void maxmnr(FLOAT mnr[2][SBLIMIT], char used[2][SBLIMIT], int sblimit,
 | 
						|
                   int nch, int *min_sb, int *min_ch)
 | 
						|
{
 | 
						|
    int sb, ch;
 | 
						|
    FLOAT small;
 | 
						|
 | 
						|
    small = 999999.0;
 | 
						|
    *min_sb = -1;
 | 
						|
    *min_ch = -1;
 | 
						|
    for (ch = 0; ch < nch; ++ch)
 | 
						|
        for (sb = 0; sb < sblimit; sb++)
 | 
						|
            if (used[ch][sb] != 2 && small > mnr[ch][sb]) {
 | 
						|
                small = mnr[ch][sb];
 | 
						|
                *min_sb = sb;
 | 
						|
                *min_ch = ch;
 | 
						|
            }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/************************************************************************
 | 
						|
*
 | 
						|
* a_bit_allocation (Layer II)
 | 
						|
*
 | 
						|
* PURPOSE:Adds bits to the subbands with the lowest mask-to-noise
 | 
						|
* ratios, until the maximum number of bits for the subband has
 | 
						|
* been allocated.
 | 
						|
*
 | 
						|
* SEMANTICS:
 | 
						|
* 1. Find the subband and channel with the smallest MNR (#min_sb#,
 | 
						|
*	 and #min_ch#)
 | 
						|
* 2. Calculate the increase in bits needed if we increase the bit
 | 
						|
*	 allocation to the next higher level
 | 
						|
* 3. If there are enough bits available for increasing the resolution
 | 
						|
*	 in #min_sb#, #min_ch#, and the subband has not yet reached its
 | 
						|
*	 maximum allocation, update the bit allocation, MNR, and bits
 | 
						|
*	 available accordingly
 | 
						|
* 4. Repeat until there are no more bits left, or no more available
 | 
						|
*	 subbands. (A subband is still available until the maximum
 | 
						|
*	 number of bits for the subband has been allocated, or there
 | 
						|
*	 aren't enough bits to go to the next higher resolution in the
 | 
						|
*	 subband.)
 | 
						|
*
 | 
						|
************************************************************************/
 | 
						|
 | 
						|
int a_bit_allocation(twolame_options * glopts, FLOAT SMR[2][SBLIMIT],
 | 
						|
                     unsigned int scfsi[2][SBLIMIT], unsigned int bit_alloc[2][SBLIMIT], int *adb)
 | 
						|
{
 | 
						|
    int sb, min_ch, min_sb, oth_ch, ch, increment, scale, seli, ba;
 | 
						|
    int bspl, bscf, bsel, ad, bbal = 0;
 | 
						|
    FLOAT mnr[2][SBLIMIT];
 | 
						|
    char used[2][SBLIMIT];
 | 
						|
    frame_header *header = &glopts->header;
 | 
						|
    int nch = glopts->num_channels_out;
 | 
						|
    int sblimit = glopts->sblimit;
 | 
						|
    int jsbound = glopts->jsbound;
 | 
						|
    int banc, berr;
 | 
						|
    static const int sfsPerScfsi[] = { 3, 2, 1, 2 };    /* lookup # sfs per scfsi */
 | 
						|
 | 
						|
    int thisstep_index;
 | 
						|
 | 
						|
    if (header->error_protection) {
 | 
						|
        berr = 16;              /* added 92-08-11 shn */
 | 
						|
        banc = 32;
 | 
						|
    } else {
 | 
						|
        berr = 0;
 | 
						|
        banc = 32;
 | 
						|
    }
 | 
						|
 | 
						|
    for (sb = 0; sb < jsbound; sb++)
 | 
						|
        bbal += nch * nbal[line[glopts->tablenum][sb]]; // (*alloc)[sb][0].bits;
 | 
						|
    for (sb = jsbound; sb < sblimit; sb++)
 | 
						|
        bbal += nbal[line[glopts->tablenum][sb]];   // (*alloc)[sb][0].bits;
 | 
						|
    *adb -= bbal + berr + banc;
 | 
						|
    ad = *adb;
 | 
						|
 | 
						|
 | 
						|
    for (sb = 0; sb < sblimit; sb++) {
 | 
						|
        for (ch = 0; ch < nch; ch++) {
 | 
						|
            mnr[ch][sb] = SNR[0] - SMR[ch][sb];
 | 
						|
            bit_alloc[ch][sb] = 0;
 | 
						|
            used[ch][sb] = 0;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    bspl = bscf = bsel = 0;
 | 
						|
 | 
						|
    do {
 | 
						|
        /* locate the subband with minimum SMR */
 | 
						|
        maxmnr(mnr, used, sblimit, nch, &min_sb, &min_ch);
 | 
						|
 | 
						|
        if (min_sb > -1) {      /* there was something to find */
 | 
						|
            int thisline = line[glopts->tablenum][min_sb]; {
 | 
						|
                /* find increase in bit allocation in subband [min] */
 | 
						|
                int nextstep_index = step_index[thisline][bit_alloc[min_ch][min_sb] + 1];
 | 
						|
                increment = SCALE_BLOCK * group[nextstep_index] * bits[nextstep_index];
 | 
						|
            }
 | 
						|
            if (used[min_ch][min_sb]) {
 | 
						|
                /* If we've already increased the limit on this ch/sb, then subtract the last thing 
 | 
						|
                   that we added */
 | 
						|
                thisstep_index = step_index[thisline][bit_alloc[min_ch][min_sb]];
 | 
						|
                increment -= SCALE_BLOCK * group[thisstep_index] * bits[thisstep_index];
 | 
						|
            }
 | 
						|
 | 
						|
            /* scale factor bits required for subband [min] */
 | 
						|
            oth_ch = 1 - min_ch;    /* above js bound, need both chans */
 | 
						|
            if (used[min_ch][min_sb]) {
 | 
						|
                scale = seli = 0;
 | 
						|
            } else {            /* this channel had no bits or scfs before */
 | 
						|
                seli = 2;
 | 
						|
                scale = 6 * sfsPerScfsi[scfsi[min_ch][min_sb]];
 | 
						|
                if (nch == 2 && min_sb >= jsbound) {
 | 
						|
                    /* each new js sb has L+R scfsis */
 | 
						|
                    seli += 2;
 | 
						|
                    scale += 6 * sfsPerScfsi[scfsi[oth_ch][min_sb]];
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            /* check to see enough bits were available for */
 | 
						|
            /* increasing resolution in the minimum band */
 | 
						|
            if (ad >= bspl + bscf + bsel + seli + scale + increment) {
 | 
						|
                /* Then there are enough bits to have another go at allocating */
 | 
						|
                ba = ++bit_alloc[min_ch][min_sb];   /* next up alloc */
 | 
						|
                bspl += increment;  /* bits for subband sample */
 | 
						|
                bscf += scale;  /* bits for scale factor */
 | 
						|
                bsel += seli;   /* bits for scfsi code */
 | 
						|
                used[min_ch][min_sb] = 1;   /* subband has bits */
 | 
						|
                thisstep_index = step_index[thisline][ba];
 | 
						|
                mnr[min_ch][min_sb] = SNR[thisstep_index] - SMR[min_ch][min_sb];
 | 
						|
                /* Check if this min_sb subband has been fully allocated max bits */
 | 
						|
                if (ba >= (1 << nbal[line[glopts->tablenum][min_sb]]) - 1)  // (*alloc)[min_sb][0].bits) 
 | 
						|
                                                                            // 
 | 
						|
                    // - 1)
 | 
						|
                    used[min_ch][min_sb] = 2;   /* don't let this sb get any more bits */
 | 
						|
            } else {
 | 
						|
                used[min_ch][min_sb] = 2;   /* can't increase this alloc */
 | 
						|
            }
 | 
						|
            if (min_sb >= jsbound && nch == 2) {
 | 
						|
                /* above jsbound, alloc applies L+R */
 | 
						|
                ba = bit_alloc[oth_ch][min_sb] = bit_alloc[min_ch][min_sb];
 | 
						|
                used[oth_ch][min_sb] = used[min_ch][min_sb];
 | 
						|
                thisstep_index = step_index[thisline][ba];
 | 
						|
                mnr[oth_ch][min_sb] = SNR[thisstep_index] - SMR[oth_ch][min_sb];
 | 
						|
                // mnr[oth_ch][min_sb] = SNR[(*alloc)[min_sb][ba].quant + 1] - SMR[oth_ch][min_sb];
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
    }
 | 
						|
    while (min_sb > -1);        /* until could find no channel */
 | 
						|
 | 
						|
    /* Calculate the number of bits left */
 | 
						|
    ad -= bspl + bscf + bsel;
 | 
						|
    *adb = ad;
 | 
						|
    for (ch = 0; ch < nch; ch++)
 | 
						|
        for (sb = sblimit; sb < SBLIMIT; sb++)
 | 
						|
            bit_alloc[ch][sb] = 0;
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// vim:ts=4:sw=4:nowrap: 
 |