📄 encode.c
字号:
* queued into the output fifo to be transmitted. * * For Layer II, the three scale factors associated with * a given subband and channel are transmitted in accordance * with the scfsi, which is transmitted first. * ************************************************************************/ void I_encode_scale(scalar, bit_alloc, fr_ps, bs)unsigned int scalar[2][3][SBLIMIT];unsigned int bit_alloc[2][SBLIMIT];frame_params *fr_ps;Bit_stream_struc *bs;{ int stereo = fr_ps->stereo; int i,j; for (i=0;i<SBLIMIT;i++) for (j=0;j<stereo;j++) if (bit_alloc[j][i]) putbits(bs,scalar[j][0][i],6);} /***************************** Layer II ********************************/ void II_encode_scale(bit_alloc, scfsi, scalar, fr_ps, bs)unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT];unsigned int scalar[2][3][SBLIMIT];frame_params *fr_ps;Bit_stream_struc *bs;{ int stereo = fr_ps->stereo; int sblimit = fr_ps->sblimit; 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 perm_smr[2][SBLIMIT];frame_params *fr_ps;{ int i,j,k; int stereo = fr_ps->stereo; 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 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 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;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 perm_smr[2][SBLIMIT];unsigned int scfsi[2][SBLIMIT];unsigned int bit_alloc[2][SBLIMIT];int *adb;frame_params *fr_ps;{ int noisy_sbs; int mode, mode_ext, lay; int rq_db; 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 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, bbal ; double mnr[2][SBLIMIT], small; char used[2][SBLIMIT]; int stereo = fr_ps->stereo; int jsbound = fr_ps->jsbound;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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -