⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encode.c

📁 Motion JPEG编解码器源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
 * 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 + -