📄 encode.c
字号:
int jsbound = fr_ps->jsbound;
int i,j,k;
for (i=0;i<sblimit;i++) for (k=0;k<stereo;k++)
if (bit_alloc[k][i]) putbits(bs,scfsi[k][i],2);
for (i=0;i<sblimit;i++) for (k=0;k<stereo;k++)
if (bit_alloc[k][i]) /* above jsbound, bit_alloc[0][i] == ba[1][i] */
switch (scfsi[k][i]) {
case 0: for (j=0;j<3;j++)
putbits(bs,scalar[k][j][i],6);
break;
case 1:
case 3: putbits(bs,scalar[k][0][i],6);
putbits(bs,scalar[k][2][i],6);
break;
case 2: putbits(bs,scalar[k][0][i],6);
}
}
/*=======================================================================\
| |
| The following routines are done after the masking threshold |
| has been calculated by the fft analysis routines in the Psychoacoustic |
| model. Using the MNR calculated, the actual number of bits allocated |
| to each subband is found iteratively. |
| |
\=======================================================================*/
/************************************************************************
*
* I_bits_for_nonoise (Layer I)
* II_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.
*
************************************************************************/
static double 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};
int I_bits_for_nonoise(perm_smr, fr_ps)
double FAR perm_smr[2][SBLIMIT];
frame_params *fr_ps;
{
int i,j,k;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
int req_bits = 0;
/* initial b_anc (header) allocation bits */
req_bits = 32 + 4 * ( (jsbound * stereo) + (SBLIMIT-jsbound) );
for(i=0; i<SBLIMIT; ++i)
for(j=0; j<((i<jsbound)?stereo:1); ++j) {
for(k=0;k<14; ++k)
if( (-perm_smr[j][i] + snr[k]) >= NOISY_MIN_MNR)
break; /* we found enough bits */
if(stereo == 2 && i >= jsbound) /* check other JS channel */
for(;k<14; ++k)
if( (-perm_smr[1-j][i] + snr[k]) >= NOISY_MIN_MNR) break;
if(k>0) req_bits += (k+1)*SCALE_BLOCK + 6*((i>=jsbound)?stereo:1);
}
return req_bits;
}
/***************************** Layer II ********************************/
int II_bits_for_nonoise(perm_smr, scfsi, fr_ps)
double FAR perm_smr[2][SBLIMIT];
unsigned int scfsi[2][SBLIMIT];
frame_params *fr_ps;
{
int sb,ch,ba;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
al_table *alloc = fr_ps->alloc;
int req_bits = 0, bbal = 0, berr = 0, banc = 32;
int maxAlloc, sel_bits, sc_bits, smp_bits;
static int sfsPerScfsi[] = { 3,2,1,2 }; /* lookup # sfs per scfsi */
/* added 92-08-11 shn */
if (fr_ps->header->error_protection) berr=16; else berr=0;
for (sb=0; sb<jsbound; ++sb)
bbal += stereo * (*alloc)[sb][0].bits;
for (sb=jsbound; sb<sblimit; ++sb)
bbal += (*alloc)[sb][0].bits;
req_bits = banc + bbal + berr;
for(sb=0; sb<sblimit; ++sb)
for(ch=0; ch<((sb<jsbound)?stereo:1); ++ch) {
maxAlloc = (1<<(*alloc)[sb][0].bits)-1;
sel_bits = sc_bits = smp_bits = 0;
for(ba=0;ba<maxAlloc-1; ++ba)
if( (-perm_smr[ch][sb] + snr[(*alloc)[sb][ba].quant+((ba>0)?1:0)])
>= NOISY_MIN_MNR)
break; /* we found enough bits */
if(stereo == 2 && sb >= jsbound) /* check other JS channel */
for(;ba<maxAlloc-1; ++ba)
if( (-perm_smr[1-ch][sb]+ snr[(*alloc)[sb][ba].quant+((ba>0)?1:0)])
>= NOISY_MIN_MNR)
break;
if(ba>0) {
smp_bits = SCALE_BLOCK * ((*alloc)[sb][ba].group * (*alloc)[sb][ba].bits);
/* scale factor bits required for subband */
sel_bits = 2;
sc_bits = 6 * sfsPerScfsi[scfsi[ch][sb]];
if(stereo == 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;
}
}
return req_bits;
}
/************************************************************************
*
* I_main_bit_allocation (Layer I)
* II_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 I_main_bit_allocation(perm_smr, bit_alloc, adb, fr_ps)
double FAR perm_smr[2][SBLIMIT];
unsigned int bit_alloc[2][SBLIMIT];
int *adb;
frame_params *fr_ps;
{
int noisy_sbs;
int mode, mode_ext, lay, i;
int rq_db, av_db = *adb;
static int init = 0;
if(init == 0) {
/* rearrange snr for layer I */
snr[2] = snr[3];
for (i=3;i<16;i++) snr[i] = snr[i+2];
init = 1;
}
if((mode = fr_ps->actual_mode) == MPG_MD_JOINT_STEREO) {
fr_ps->header->mode = MPG_MD_STEREO;
fr_ps->header->mode_ext = 0;
fr_ps->jsbound = fr_ps->sblimit;
if(rq_db = I_bits_for_nonoise(perm_smr, fr_ps) > *adb) {
fr_ps->header->mode = MPG_MD_JOINT_STEREO;
mode_ext = 4; /* 3 is least severe reduction */
lay = fr_ps->header->lay;
do {
--mode_ext;
fr_ps->jsbound = js_bound(lay, mode_ext);
rq_db = I_bits_for_nonoise(perm_smr, fr_ps);
} while( (rq_db > *adb) && (mode_ext > 0));
fr_ps->header->mode_ext = mode_ext;
} /* well we either eliminated noisy sbs or mode_ext == 0 */
}
noisy_sbs = I_a_bit_allocation(perm_smr, bit_alloc, adb, fr_ps);
}
/***************************** Layer II ********************************/
void II_main_bit_allocation(perm_smr, scfsi, bit_alloc, adb, fr_ps)
double FAR perm_smr[2][SBLIMIT];
unsigned int scfsi[2][SBLIMIT];
unsigned int bit_alloc[2][SBLIMIT];
int *adb;
frame_params *fr_ps;
{
int noisy_sbs, nn;
int mode, mode_ext, lay;
int rq_db, av_db = *adb;
if((mode = fr_ps->actual_mode) == MPG_MD_JOINT_STEREO) {
fr_ps->header->mode = MPG_MD_STEREO;
fr_ps->header->mode_ext = 0;
fr_ps->jsbound = fr_ps->sblimit;
if((rq_db=II_bits_for_nonoise(perm_smr, scfsi, fr_ps)) > *adb) {
fr_ps->header->mode = MPG_MD_JOINT_STEREO;
mode_ext = 4; /* 3 is least severe reduction */
lay = fr_ps->header->lay;
do {
--mode_ext;
fr_ps->jsbound = js_bound(lay, mode_ext);
rq_db = II_bits_for_nonoise(perm_smr, scfsi, fr_ps);
} while( (rq_db > *adb) && (mode_ext > 0));
fr_ps->header->mode_ext = mode_ext;
} /* well we either eliminated noisy sbs or mode_ext == 0 */
}
noisy_sbs = II_a_bit_allocation(perm_smr, scfsi, bit_alloc, adb, fr_ps);
}
/************************************************************************
*
* I_a_bit_allocation (Layer I)
* II_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 I_a_bit_allocation(perm_smr, bit_alloc, adb, fr_ps) /* return noisy sbs */
double FAR perm_smr[2][SBLIMIT];
unsigned int bit_alloc[2][SBLIMIT];
int *adb;
frame_params *fr_ps;
{
int i, k, smpl_bits, scale_bits, min_sb, min_ch, oth_ch;
int bspl, bscf, ad, noisy_sbs, done = 0, bbal ;
double mnr[2][SBLIMIT], small;
char used[2][SBLIMIT];
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
al_table *alloc = fr_ps->alloc;
static char init= 0;
static int banc=32, berr=0;
if (!init) {
init = 1;
if (fr_ps->header->error_protection) berr = 16; /* added 92-08-11 shn */
}
bbal = 4 * ( (jsbound * stereo) + (SBLIMIT-jsbound) );
*adb -= bbal + berr + banc;
ad= *adb;
for (i=0;i<SBLIMIT;i++) for (k=0;k<stereo;k++) {
mnr[k][i]=snr[0]-perm_smr[k][i];
bit_alloc[k][i] = 0;
used[k][i] = 0;
}
bspl = bscf = 0;
do {
/* locate the subband with minimum SMR */
small = mnr[0][0]+1; min_sb = -1; min_ch = -1;
for (i=0;i<SBLIMIT;i++) for (k=0;k<stereo;k++)
/* go on only if there are bits left */
if (used[k][i] != 2 && small > mnr[k][i]) {
small = mnr[k][i];
min_sb = i; min_ch = k;
}
if(min_sb > -1) { /* there was something to find */
/* first step of bit allocation is biggest */
if (used[min_ch][min_sb]) { smpl_bits = SCALE_BLOCK; scale_bits = 0; }
else { smpl_bits = 24; scale_bits = 6; }
if(min_sb >= jsbound) scale_bits *= stereo;
/* check to see enough bits were available for */
/* increasing resolution in the minimum band */
if (ad >= bspl + bscf + scale_bits + smpl_bits) {
bspl += smpl_bits; /* bit for subband sample */
bscf += scale_bits; /* bit for scale factor */
bit_alloc[min_ch][min_sb]++;
used[min_ch][min_sb] = 1; /* subband has bits */
mnr[min_ch][min_sb] = -perm_smr[min_ch][min_sb]
+ snr[bit_alloc[min_ch][min_sb]];
/* Check if subband has been fully allocated max bits */
if (bit_alloc[min_ch][min_sb] == 14 ) used[min_ch][min_sb] = 2;
}
else /* no room to improve this band */
used[min_ch][min_sb] = 2; /* for allocation anymore */
if(stereo == 2 && min_sb >= jsbound) {
oth_ch = 1-min_ch; /* joint-st : fix other ch */
bit_alloc[oth_ch][min_sb] = bit_alloc[min_ch][min_sb];
used[oth_ch][min_sb] = used[min_ch][min_sb];
mnr[oth_ch][min_sb] = -perm_smr[oth_ch][min_sb]
+ snr[bit_alloc[oth_ch][min_sb]];
}
}
} while(min_sb>-1); /* i.e. still some sub-bands to find */
/* Calculate the number of bits left, add on to pointed var */
ad -= bspl+bscf;
*adb = ad;
/* see how many channels are noisy */
noisy_sbs = 0; small = mnr[0][0];
for(k=0; k<stereo; ++k) {
for(i = 0; i< SBLIMIT; ++i) {
if(mnr[k][i] < NOISY_MIN_MNR) ++noisy_sbs;
if(small > mnr[k][i]) small = mnr[k][i];
}
}
return noisy_sbs;
}
/***************************** Layer II ********************************/
int II_a_bit_allocation(perm_smr, scfsi, bit_alloc, adb, fr_ps)
double FAR perm_smr[2][SBLIMIT];
unsigned int scfsi[2][SBLIMIT];
unsigned int bit_alloc[2][SBLIMIT];
int *adb;
frame_params *fr_ps;
{
int i, min_ch, min_sb, oth_ch, k, increment, scale, seli, ba;
int bspl, bscf, bsel, ad, noisy_sbs, bbal=0;
double mnr[2][SBLIMIT], small;
char used[2][SBLIMIT];
int stereo = fr_ps->stereo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -