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

📄 decode.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 5 页
字号:
	 bit_alloc[j][i] = getbits (bs, 4);

   for (i=jsbound; i<SBLIMIT; i++)
   {
      b = getbits (bs, 4);
      for (j=0; j<stereo; j++)
	 bit_alloc[j][i] = b;
   }

   if (bits_log)
   {
      for (j= 0; j < stereo; j++)
         for (i = 0; i < SBLIMIT; i++)
	 {
	    int alloc_bits = 0, alloc_id = bit_alloc[j][i];

	    if ((j == 0 || i < jsbound) && bit_alloc[j][i] > 0)
	       alloc_bits = 12 * (alloc_id + 1);

	    printf ("alloc_bi[ %d ][ %2d ]= %3d\n", j, i, alloc_bits);
	 }
   }
}


void II_decode_bitalloc (Bit_stream *bs,
			 frame_params *fr_ps,
			 unsigned int bit_alloc[7][SBLIMIT],	
			 int bits_log)
{
   int i,j,c,sbgr;
   int stereo = fr_ps->stereo;
   int sblimit = fr_ps->sblimit;
   int jsbound = fr_ps->jsbound;
   al_table *alloc = fr_ps->alloc;
   unsigned int actual_alloc[7][SBLIMIT];

   for (i = 0; i < SBLIMIT; i++)
      for (j = 0; j < stereo; j++)
	 actual_alloc[j][i] = 0;

   for (i=0; i<jsbound; i++)
      for (j=0;j<stereo;j++)
	 actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);

   for (i=jsbound; i<sblimit; i++)   /* expand to 2 channels */
      actual_alloc[0][i] = bit_alloc[0][i] = bit_alloc[1][i] = (char) getbits (bs, (*alloc)[i][0].bits);

   for (i=sblimit; i<SBLIMIT; i++)
      for (j=0; j<stereo; j++)
	  bit_alloc[j][i] = 0;

   if (bits_log)
   {
      for (j= 0; j < stereo; j++)
         for (i = 0; i < SBLIMIT; i++)
	 {
	    int alloc_bits = 0, alloc_id = bit_alloc[j][i];

	    if (actual_alloc[j][i] > 0)
	       alloc_bits = 12 * (*alloc)[i][alloc_id].bits * (*alloc)[i][alloc_id].group;

	    printf ("alloc_bi[ %d ][ %2d ]= %3d\n", j, i, alloc_bits);
	 }
   }
}


void II_decode_bitalloc_mc (Bit_stream *bs,
			    frame_params *fr_ps,
			    unsigned int bit_alloc[7][SBLIMIT],	
			    int *l, int *m, int bits_log)
{
   layer *info = fr_ps->header;
   int i,j,c,sbgr;
   int sblimit = fr_ps->sblimit_mc;
   al_table *alloc = fr_ps->alloc_mc;
   unsigned int actual_alloc[7][SBLIMIT];

   for (i = 0; i < SBLIMIT; i++)
      for (j = *l; j < *m; j++)
	 actual_alloc[j][i] = 0;

   /* 10/31/95 Ralf Schwalbe LFE */
   if (info->lfe)
      info->lfe_alloc = (char) getbits (bs, (*alloc)[0][0].bits);

   for (i=0; i<sblimit; i++)
      if (info->dyn_cross_on == 0)
	 for (j=*l;j<*m;j++)
	 {
	    if ((fr_ps->header->center != 3) || (i < 12) || (j !=2))
	       actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
	    else
	       bit_alloc[j][i] = 0;
	 }
      else  /* dyn. cross mode */
      {
	 if (i == 0) sbgr = 0;
	 else
	    for (c = 1; c < 12; c++)
	    {
	       if ((sb_groups[c-1] < i) && (i <= sb_groups[c]))
	       {
		  sbgr = c;  /* search the valid subband group */
		  break;
	       }
	    }
 
	 /* 960816 FdB new setup for dyn. crosstalk modes */
	 if (info->dyn_cross_mode[sbgr] == 0)
	 {
	    for (j = *l; j < *m; j++)
	       if (fr_ps->header->center == 3 && i >= 12 && j == 2)
		  bit_alloc[j][i] = 0;
	       else if (info->surround == 3 && info->dyn_second_stereo[sbgr] == 1)
	       {
		  if (info->center != 0 && j == 4)
		     bit_alloc[j][i] = bit_alloc[3][i];
		  else if (info->center == 0 && j == 3)
		     bit_alloc[j][i] = bit_alloc[2][i];
		  else
		     actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
	       }
	       else
		  actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
	 }
	 else if (fr_ps->dyn_cross_bits == 1)   /* for channel mode 3/0 and 2/1 */
	 {
	    /* DynX mode has to be 1 */
	    if ((info->center == 3) && (i >= 12))    /* 3/0 + phantom center */
	       bit_alloc[2][i] = 0;
	    else if (info->tc_alloc[sbgr] == 1)
	       bit_alloc[2][i] = bit_alloc[0][i];
	    else if (info->tc_alloc[sbgr] == 2)
	       bit_alloc[2][i] = bit_alloc[1][i];
	    else
	       if (info->dyn_cross_LR)
		  bit_alloc[2][i] = bit_alloc[1][i];
	       else
		  bit_alloc[2][i] = bit_alloc[0][i];
 
	    if (info->surround == 3)		/* 3/0 + 2/0 */
	    {
	       actual_alloc[3][i] = bit_alloc[3][i] = (char) getbits (bs, (*alloc)[i][0].bits);
	       if (info->dyn_second_stereo[sbgr] == 1)
		  bit_alloc[4][i] = bit_alloc[3][i];
	       else
		  actual_alloc[4][i] = bit_alloc[4][i] = (char) getbits (bs, (*alloc)[i][0].bits);
	    }
	 }
	 else if (fr_ps->dyn_cross_bits == 3)   /* for channel mode 3/1 and 2/2 */
	 {
	    if ((info->center == 3) && (i >= 12))    /* 3/1 + phantom center */
	       bit_alloc[2][i] = 0;
	    else if ((info->dyn_cross_mode[sbgr] == 1) || (info->dyn_cross_mode[sbgr] == 4))
	       actual_alloc[2][i] = bit_alloc[2][i] = (char) getbits (bs, (*alloc)[i][0].bits);
	    else
	    {
	       /* T2 not transmitted */
	       if (fr_ps->header->surround == 2 ||	/* 2/2 mode */		
		   fr_ps->header->tc_alloc[sbgr] == 1 ||	/* 3/1 mode */
		   fr_ps->header->tc_alloc[sbgr] == 5 ||	/* 3/1 mode (matrix mode 2 only) */
		   fr_ps->header->tc_alloc[sbgr] != 2 && !fr_ps->header->dyn_cross_LR)
		  bit_alloc[2][i] = bit_alloc[0][i];	/* C, L or Ls from L0 */
	       else
		  bit_alloc[2][i] = bit_alloc[1][i];	/* C, R or Rs from RO */
	    }
 
	    if (info->dyn_cross_mode[sbgr] == 2)
	       actual_alloc[3][i] = bit_alloc[3][i] = (char) getbits (bs, (*alloc)[i][0].bits);
	    else if (info->dyn_cross_mode[sbgr] == 4)
	       bit_alloc[3][i] = bit_alloc[2][i];
	    else
	    {
	       /* T3 not transmitted */
	       if (fr_ps->header->surround == 2 ||	/* 2/2 mode */
		   fr_ps->header->tc_alloc[sbgr] == 4 ||	/* 3/1 mode */
		   fr_ps->header->tc_alloc[sbgr] == 5 ||	/* 3/1 mode (matrix mode 2 only) */
		   fr_ps->header->tc_alloc[sbgr] < 3 && fr_ps->header->dyn_cross_LR)
		  bit_alloc[3][i] = bit_alloc[1][i];	/* S, R or Rs from R0 */
	       else
		  bit_alloc[3][i] = bit_alloc[0][i];	/* S, L or Ls from LO */
	    }
	 } 
	 else if (fr_ps->dyn_cross_bits == 4)   /* for channel mode 3/2 */
	 {
	    /* T2 */
	    if ((info->center == 3) && (i >= 12))    /* 3/2 + phantom center */
	       bit_alloc[2][i] = 0;
	    else switch (info->dyn_cross_mode[sbgr])
	    {
	    case 1 :   /* T2 contains bitalloc info */
	    case 2 :
	    case 4 :
	    case 8 :
	    case 9 :
	    case 10: 
	    case 11: 
	    case 12: 
	    case 14: 
		       actual_alloc[2][i] = bit_alloc[2][i] = (char) getbits (bs, (*alloc)[i][0].bits);
		       break;
	    case 3 :   /* T2 contains no bitalloc info */
	    case 5 :
	    case 6 :
	    case 7 :
	    case 13: 
		       if ((info->tc_alloc[sbgr] == 1) || (info->tc_alloc[sbgr] == 7))
			  bit_alloc[2][i] = bit_alloc[0][i];
		       else if ((info->tc_alloc[sbgr] == 2) || (info->tc_alloc[sbgr] == 6))
			  bit_alloc[2][i] = bit_alloc[1][i];
		       else
			  if (info->dyn_cross_LR)
			     bit_alloc[2][i] = bit_alloc[1][i];
			  else
			     bit_alloc[2][i] = bit_alloc[0][i];
		       break;
	    }
 
	    /* T3 */
	    switch (info->dyn_cross_mode[sbgr])
	    {
	    case 1 :   /* T3 contains bitalloc info */
	    case 3 :
	    case 5 :
	    case 8 :
	    case 10: 
	    case 13: 
		       actual_alloc[3][i] = bit_alloc[3][i] = (char) getbits (bs, (*alloc)[i][0].bits);
		       break;
	    case 2 :   /* T3 has to copy its bitalloc from T0 */
	    case 4 :
	    case 6 :
	    case 7 :
	    case 12: 
		       bit_alloc[3][i] = bit_alloc[0][i];
		       break;
	    case 9 :   /* T3 has to copy its bitalloc from T2 */
	    case 11:
	    case 14: 
		       bit_alloc[3][i] = bit_alloc[2][i];
		       break;
	    }
 
	    /* T4 */
	    switch (info->dyn_cross_mode[sbgr])
	    {
	    case 2 :   /* T4 contains bitalloc info */
	    case 3 :
	    case 6 :
	    case 9 : 
		       actual_alloc[4][i] = bit_alloc[4][i] = (char) getbits (bs, (*alloc)[i][0].bits);
		       break;
	    case 1 :   /* T4 has to copy its bitalloc from T1 */
	    case 4 :
	    case 5 :
	    case 7 :
	    case 11: 
		       bit_alloc[4][i] = bit_alloc[1][i];
		       break;
	    case 10:   /* T4 has to copy its bitalloc from T2 */
	    case 12:
	    case 14: 
		       bit_alloc[4][i] = bit_alloc[2][i];
		       break;
	    case 8 :   /* T4 has to copy its bitalloc from T3 */
	    case 13: 
		       bit_alloc[4][i] = bit_alloc[3][i];
		       break;
	    }
	 }
      }

   for (i=sblimit; i<SBLIMIT; i++)
      for (j=*l; j<*m; j++)
	  bit_alloc[j][i] = 0;

   if (bits_log)
   {
      for (j= *l; j < *m; j++)
         for (i = 0; i < SBLIMIT; i++)
	 {
	    int alloc_bits = 0, alloc_id = bit_alloc[j][i];

	    if (actual_alloc[j][i] > 0)
	       alloc_bits = 12 * (*alloc)[i][alloc_id].bits * (*alloc)[i][alloc_id].group;

	    printf ("alloc_bi[ %d ][ %2d ]= %3d\n", j, i, alloc_bits);
	 }
   }
}

#ifdef Augmentation_7ch
void II_decode_bitalloc_aug (Bit_stream *bs,
			     frame_params *fr_ps,
			     unsigned int bit_alloc[7][SBLIMIT],	
			     int *l, int *m, int bits_log)
{
   layer *info = fr_ps->header;
   int i,j,c,sbgr;
   /* int stereo = fr_ps->stereo; */ /* not used for mc - decoding */
   int sblimit = fr_ps->sblimit_mc;
   al_table *alloc = fr_ps->alloc_mc;
   unsigned int actual_alloc[7][SBLIMIT];

   for (i = 0; i < SBLIMIT; i++)
      for (j = *l; j < *m; j++)
	 actual_alloc[j][i] = 0;

   for (i=0; i<sblimit; i++)
      if (info->aug_dyn_cross_on == 0)
	 for (j=*l;j<*m;j++)
	    actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
      else  /* dyn. cross mode */
      {
        int T5T0 = 0, T6T0 = 0, T6T1 = 1;
    
	 if(i == 0) sbgr = 0;
	 else
	    for(c = 1; c < 12; c++)
	    {
	       if((sb_groups[c-1] < i) && (i <= sb_groups[c]))
	       {
		 sbgr = c;  /* search the valid subband group */
		 break;
		}
	     }
 
        if (info->tc_aug_alloc[sbgr] == 4 || info->tc_aug_alloc[sbgr] == 5)
    	  if (info->dyn_cross_LR == 0)
	    T6T1 = 0;
	  else
	    T6T0 = 1;
        else if (info->tc_aug_alloc[sbgr] == 6 || info->tc_aug_alloc[sbgr] == 7)
          if (info->dyn_cross_LR)
	    T5T0 = 1;

	 /* read bitalloc info from bitstream */
	 switch (info->dyn_cross_aug_mode[sbgr])
	 {
	 case  0:   /* T5 and T6 contains bitalloc info */
		    actual_alloc[5][i] = bit_alloc[5][i] = (char) getbits (bs, (*alloc)[i][0].bits);
		    actual_alloc[6][i] = bit_alloc[6][i] = (char) getbits (bs, (*alloc)[i][0].bits);
		    break;
	 case  1:   /* T5 contains bitalloc info */
	 case  2:
	 case  3:
	 case  4:
		    actual_alloc[5][i] = bit_alloc[5][i] = (char) getbits (bs, (*alloc)[i][0].bits);
		    break;
 
	 case  5:   /* T6 contains bitalloc info */
	 case 10:
	 case 14:
		    actual_alloc[6][i] = bit_alloc[6][i] = (char) getbits (bs, (*alloc)[i][0].bits);
		    break;
	 }
 
	 /* copy bitalloc info from other channels */
	 switch (info->dyn_cross_aug_mode[sbgr])
	 {
	 case  1:   /* copy T6 from T1 */
		    bit_alloc[6][i] = bit_alloc[T6T1][i];
		    break;
	 case  2:   /* copy T6 from T2 */
		    bit_alloc[6][i] = bit_alloc[2][i];
		    break;
	 case  3:   /* copy T6 from T4 */
		    bit_alloc[6][i] = bit_alloc[4][i];
		    break;
	 case  4:   /* copy T6 from T5 */
		    bit_alloc[6][i] = bit_alloc[5][i];
		    break;
	 case  5:   /* copy T5 from T0 */
		    bit_alloc[5][i] = bit_alloc[T5T0][i];
		    break;
	 case  6:   /* copy T5 from T0 and T6 from T1 */
		    bit_alloc[5][i] = bit_alloc[T5T0][i];
		    bit_alloc[6][i] = bit_alloc[T6T1][i];
		    break;
	 case  7:   /* copy T5 from T0 and T6 from T2 */
		    bit_alloc[5][i] = bit_alloc[T5T0][i];
		    bit_alloc[6][i] = bit_alloc[2][i];
		    break;
	 case  8:   /* copy T5 from T0 and T6 from T4 */
		    bit_alloc[5][i] = bit_alloc[T5T0][i];
		    bit_alloc[6][i] = bit_alloc[4][i];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -