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

📄 decode.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 5 页
字号:
		 for (k=0;k<3;k++) sample[j][k][i] = 0;
	   }
	   if(stereo == 2 && i>= jsbound)  /* joint stereo : copy L to R */
		  for (k=0;k<3;k++) sample[1][k][i] = sample[0][k][i];
      }
   for (i = sblimit; i < SBLIMIT; i++)
	 for (j = 0; j < stereo; j++)
		for (k = 0; k < 3; k++)
		   sample[j][k][i] = 0;
}

/******************** mc - layer2 stuff ******************************/
/* 19.10.93 R.S. */

void II_buffer_sample_mc (Bit_stream *bs,
			  frame_params *fr_ps,
			  unsigned int sample[7][3][SBLIMIT],
			  unsigned int bit_alloc[7][SBLIMIT],
			  int ch_start, int channels, int gr)
{
   layer *info = fr_ps->header;
   int i,j,k,m,sbgr,l;
   unsigned int nlevels, c=0;
   int sblimit = fr_ps->sblimit_mc;
   int transmitted;
   al_table *alloc = fr_ps->alloc_mc;

   /* 31/10/95 Ralf Schwalbe LFE */
   /* 961003 FdB LFE number of bits corrected */
   if(info->lfe && info->lfe_alloc > 0)
	info->lfe_spl[gr] = (unsigned int) getbits (bs, info->lfe_alloc+1);

   for (i = 0; i < sblimit; i++)
   {
	  if( i == 0) sbgr = 0 ;
	  else
	     for(l = 1; l < 12; l++)
		if((sb_groups[l-1] < i) && (i <= sb_groups[l]))
		{
		   sbgr = l; break;
		}

	 for (j = ch_start; j < channels; j++)
	 {
	   if (bit_alloc[j][i])
	   {
	     transmitted = 1;
	     if (fr_ps->header->dyn_cross_on == 1)
	     {
		if (fr_ps->dyn_cross_bits == 4 && (
			(fr_ps->header->dyn_cross_mode[sbgr]==1  && j==4) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==2  && j==3) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==3  && j==2) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==4  && j!=2) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==5  && j!=3) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==6  && j!=4) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==7) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==8  && j==4) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==9  && j==3) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==10 && j==4) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==11 && j!=2) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==12 && j!=2) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==13 && j!=3) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==14 && j!=2)
					          ))
		   transmitted = 0;		/* 3/2 */
		if (fr_ps->dyn_cross_bits == 3 && (
			(fr_ps->header->dyn_cross_mode[sbgr]==1  && j==3) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==2  && j==2) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==3) ||
			(fr_ps->header->dyn_cross_mode[sbgr]==4  && j==3)
						  ))
		   transmitted = 0;		/* 3/1 and 2/2 */
		if (fr_ps->dyn_cross_bits == 1 && fr_ps->header->dyn_cross_mode[sbgr]==1 && j==2)
		   transmitted = 0;		/* 3/0 (+2/0) and 2/1 */
		if (fr_ps->header->surround == 3 && fr_ps->header->dyn_second_stereo[sbgr] == 1)
		{
		   if ((fr_ps->header->center == 1 || fr_ps->header->center == 3) && j == 4)
	              transmitted = 0;
	           else if (fr_ps->header->center == 0 && j == 3)
	              transmitted = 0;
		}
	     }
	   }
	   else
	      transmitted = 0;

	   if (transmitted == 1)
	   {
		/* check for grouping in subband */
		if ((*alloc)[i][bit_alloc[j][i]].group==3)
		{
			for (m=0;m<3;m++)
			{
				k = (*alloc)[i][bit_alloc[j][i]].bits;
				sample[j][m][i] = (unsigned int) getbits (bs, k);
			}
		}
		else
		{	/* bit_alloc = 3, 5, 9 */
			nlevels = (*alloc)[i][bit_alloc[j][i]].steps;
			k=(*alloc)[i][bit_alloc[j][i]].bits;
			c = (unsigned int) getbits (bs, k);
			for (k=0;k<3;k++)
			{
				sample[j][k][i] = c % nlevels;
				c /= nlevels;
			}
		}
	   }
	   else   /* no samples transmitted */
	      for (k=0; k<3; k++)
		 sample[j][k][i] = 0;
	 }  /* for channel loop */
   }  /* for sblimit loop */

   for (i = sblimit; i < SBLIMIT; i++)
	 for (j = ch_start; j < channels; j++)
		for (k = 0; k < 3; k++)  sample[j][k][i] = 0;
}

#ifdef Augmentation_7ch
void II_buffer_sample_aug(Bit_stream *bs,
			frame_params *fr_ps,
			unsigned int sample[7][3][SBLIMIT],
			unsigned int bit_alloc[7][SBLIMIT],
			int gr)
{
   int i,j,k,m,sbgr,l;
   unsigned int nlevels, c=0;
   int sblimit = fr_ps->sblimit_mc;
   int transmitted;
   al_table *alloc = fr_ps->alloc_mc;

   for (i = 0; i < sblimit; i++)
   {
      if( i == 0) sbgr = 0;
      else
	 for(l = 1; l < 12; l++)
	    if((sb_groups[l-1] < i) && (i <= sb_groups[l]))
	    {
	       sbgr = l; break;
	    }

      for (j = 5; j < 7; j++)
      {
	 if (bit_alloc[j][i])
	 {
	    transmitted = 1;
	    if (fr_ps->header->aug_dyn_cross_on == 1)
	    {
	       if (j == 5)
	       {
		  if (fr_ps->header->dyn_cross_aug_mode[sbgr] > 4)
		     transmitted = 0;
	       }
	       else
	       {
		  transmitted = 0;
		  switch (fr_ps->header->dyn_cross_aug_mode[sbgr])
		  {
		  case  0:
		  case  5:
		  case 10:
		  case 14:
			   transmitted = 1;
			   break;
		  }
	       }
	    }
	 }
	 else
	    transmitted = 0;

	 if (transmitted == 1)
	 {
	      /* check for grouping in subband */
	      if ((*alloc)[i][bit_alloc[j][i]].group==3)
	      {
		      for (m=0;m<3;m++)
		      {
			      k = (*alloc)[i][bit_alloc[j][i]].bits;
			      sample[j][m][i] = (unsigned int) getbits (bs, k);
		      }
	      }
	      else
	      {	/* bit_alloc = 3, 5, 9 */
		      nlevels = (*alloc)[i][bit_alloc[j][i]].steps;
		      k=(*alloc)[i][bit_alloc[j][i]].bits;
		      c = (unsigned int) getbits (bs, k);
		      for (k=0;k<3;k++)
		      {
			      sample[j][k][i] = c % nlevels;
			      c /= nlevels;
		      }
	      }
	 }
	 else   /* no samples transmitted */
	    for (k=0; k<3; k++)
	       sample[j][k][i] = 0;
      }  /* for channel loop */
   }  /* for sblimit loop */

   for (i = sblimit; i < SBLIMIT; i++)
	 for (j = 5; j < 7; j++)
		for (k = 0; k < 3; k++)  sample[j][k][i] = 0;
}
#endif

/***************************************************************/
/* 09/03/1995 JMZ Multilingual */

/***************************************************************/
/* 15/03/1995 JMZ */

void II_buffer_sample_ml(Bit_stream *bs,
			 frame_params *fr_ps,
			 unsigned int sample_ml[7][3][SBLIMIT],
			 unsigned int bit_alloc_ml[7][SBLIMIT],
			 int *n_ml_ch)
{
   int i,j,k,m,sbgr,l;
   unsigned int nlevels, c=0;
   int sblimit_ml = fr_ps->sblimit_ml;
   al_table *alloc_ml = fr_ps->alloc_ml;

   for (i = 0; i < sblimit_ml; i++)
   {
	 for (j = 0; j < *n_ml_ch; j++)
	 {
	   if (bit_alloc_ml[j][i])
	   {
		/* JR: no dynamic crosstalk for multilingual channels */
		/* check for grouping in subband */
		if ((*alloc_ml)[i][bit_alloc_ml[j][i]].group==3)
		{

			for (m=0;m<3;m++)
			{
				k = (*alloc_ml)[i][bit_alloc_ml[j][i]].bits;
				sample_ml[j][m][i] = (unsigned int) getbits (bs, k);
			}

		}
		else
		{    /* bit_alloc = 3, 5, 9 */
		  nlevels = (*alloc_ml)[i][bit_alloc_ml[j][i]].steps;
		  k=(*alloc_ml)[i][bit_alloc_ml[j][i]].bits;
		  c = (unsigned int) getbits (bs, k);
		  for (k=0;k<3;k++)
		  {
			sample_ml[j][k][i] = c % nlevels;
			c /= nlevels;
		  }
		}
	   }
	   else
	   {      /* for no sample transmitted */
		 for (k=0;k<3;k++) sample_ml[j][k][i] = 0;
	   }
	 }
   }

   for (i = sblimit_ml; i < SBLIMIT; i++)
	 for (j = 0; j < *n_ml_ch; j++)
		for (k = 0; k < 3; k++)
		   sample_ml[j][k][i] = 0;
}

/**************************************************************
/*
/*   Restore the compressed sample to a factional number.
/*   first complement the MSB of the sample
/*    for layer I :
/*    Use s = (s' + 2^(-nb+1) ) * 2^nb / (2^nb-1)
/*   for Layer II :
/*   Use the formula s = s' * c + d
/*
/**************************************************************/

static double c[17] = { 1.33333333333, 1.60000000000, 1.14285714286,
						1.77777777777, 1.06666666666, 1.03225806452,
						1.01587301587, 1.00787401575, 1.00392156863,
						1.00195694716, 1.00097751711, 1.00048851979,
						1.00024420024, 1.00012208522, 1.00006103888,
						1.00003051851, 1.00001525902 };

static double d[17] = { 0.500000000, 0.500000000, 0.250000000, 0.500000000,
						0.125000000, 0.062500000, 0.031250000, 0.015625000,
						0.007812500, 0.003906250, 0.001953125, 0.0009765625,
						0.00048828125, 0.00024414063, 0.00012207031,
						0.00006103516, 0.00003051758 };

/************************** Layer II stuff ************************/

void I_dequantize_sample (unsigned int sample[7][3][SBLIMIT],
			  int part,
			  unsigned int bit_alloc[7][SBLIMIT],
			  double fraction[7][SBLIMIT][3][12],
			  frame_params *fr_ps, int *z)
{
   int i, nb, k, gr_id, gr_sam;
   int stereo = fr_ps->stereo;
   int sblimit = fr_ps->sblimit;

   gr_id = 4*part + (*z / 3);
   gr_sam = *z % 3;

   for (i=0; i<SBLIMIT; i++)
      for (k=0; k<stereo; k++)
	 if (bit_alloc[k][i])
	 {
	    nb = bit_alloc[k][i] + 1;
	    if (((sample[k][0][i] >> nb-1) & 1) == 1)
	       fraction[k][i][gr_sam][gr_id] = 0.0;
	    else
	       fraction[k][i][gr_sam][gr_id] = -1.0;

	    fraction[k][i][gr_sam][gr_id] += (double) (sample[k][0][i] & ((1<<nb-1)-1)) /
		 (double) (1L<<nb-1);

	    fraction[k][i][gr_sam][gr_id] =
		 (double) (fraction[k][i][gr_sam][gr_id] + 1.0 / (double)(1L<<nb-1)) *
		     (double) (1L<<nb) / (double) ((1L<<nb)-1);
	 }
	 else
	    fraction[k][i][gr_sam][gr_id] = 0.0;
}
void II_dequantize_sample (unsigned int sample[7][3][SBLIMIT],
			   unsigned int bit_alloc[7][SBLIMIT],
			   double fraction[7][SBLIMIT][3][12],
			   frame_params *fr_ps, int *z)
{
   int i, j, k, x;
   int stereo = fr_ps->stereo;
   int sblimit = fr_ps->sblimit;
   al_table *alloc = fr_ps->alloc;

   for (i=0;i<sblimit;i++)  for (j=0;j<3;j++) for (k = 0; k < stereo ; k++)
	 if (bit_alloc[k][i])
	 {
	   /* locate MSB in the sample */
	   x = 0;
#ifndef MSDOS
	   while ((1L<<x) < (*alloc)[i][bit_alloc[k][i]].steps) x++;
#else
	   /* microsoft C thinks an int is a short */
	   while (( (unsigned long) (1L<<(long)x) <
				(unsigned long)( (*alloc)[i][bit_alloc[k][i]].steps)
			  ) && ( x < 16) ) x++;
#endif

	   /* MSB inversion */
	   if (((sample[k][j][i] >> (x-1)) & 1) == 1)
		  fraction[k][i][j][*z] = 0.0;
	   else  fraction[k][i][j][*z] = -1.0;

	   /* Form a 2's complement sample */
	   fraction[k][i][j][*z] += (double) (sample[k][j][i] & ((1<<(x-1))-1)) /
							(double) (1L<<(x-1));

	   /* Dequantize the sample */
	   fraction[k][i][j][*z] += d[(*alloc)[i][bit_alloc[k][i]].quant];
	   fraction[k][i][j][*z] *= c[(*alloc)[i][bit_alloc[k][i]].quant];
	 }
	 else fraction[k][i][j][*z] = 0.0;

   for (i=sblimit;i<SBLIMIT;i++)
	  for (j=0;j<3;j++)
		 for(k = 0; k < stereo; k++)
			 fraction[k][i][j][*z] = 0.0;
}


/************************** MC Layer II stuff ************************/

void II_dequantize_sample_mc (unsigned int sample[7][3][SBLIMIT],
			      unsigned int bit_alloc[7][SBLIMIT],
			      double fraction[7][SBLIMIT][3][12],
			      frame_params *fr_ps, int ch_start, int channels, int *z)
{
   int i, j, k, x,sbgr,l;
   int sblimit = fr_ps->sblimit_mc;
   al_table *alloc = fr_ps->alloc_mc;

   for (i = 0; i < sblimit; i++)
   {
	if (i == 0) sbgr = 0;

⌨️ 快捷键说明

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