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

📄 decode.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 5 页
字号:
	else
	   for (l = 1; l < 12; l++)
		if ((sb_groups[l-1] < i) && (i <= sb_groups[l]))
		{
		    sbgr = l; break;
		}

	for (j = 0; j < 3; j++)
	    for (k = ch_start; k < channels; k++)
		if (bit_alloc[k][i])
		{
		    if (fr_ps->header->dyn_cross_on == 0)
		    {
			/* 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   /* 21.07.94 Ralf Schwalbe dyn. cross mode */
		    {
			if (fr_ps->dyn_cross_bits == 4  &&
			    ((fr_ps->header->dyn_cross_mode[sbgr]==0) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==1  && k!=4) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==2  && k!=3) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==3  && k!=2) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==8  && k!=4) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==9  && k!=3) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==10 && k!=4)))
			{
			    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];
			}  /* end if 2-channel dyn-cross mode */

			if (fr_ps->dyn_cross_bits != 4 ||
			    ((fr_ps->header->dyn_cross_mode[sbgr]==4  && k==2) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==5  && k==3) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==6  && k==4) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==11 && k==2) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==12 && k==2) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==13 && k==3) ||
			     (fr_ps->header->dyn_cross_mode[sbgr]==14 && k==2))) 
			{
			     if ((fr_ps->dyn_cross_bits == 3 && ((fr_ps->header->dyn_cross_mode[sbgr] == 1 && k==3) ||
								 (fr_ps->header->dyn_cross_mode[sbgr] == 2 && k==2) ||
								 fr_ps->header->dyn_cross_mode[sbgr] == 3 ||
								 (fr_ps->header->dyn_cross_mode[sbgr] == 4 && k==3)
								)) ||
				 (fr_ps->dyn_cross_bits == 1 && fr_ps->header->dyn_cross_mode[sbgr] == 1 && k == 2) ||
				 (fr_ps->header->surround == 3 && fr_ps->header->dyn_second_stereo[sbgr] == 1 &&
				  ((fr_ps->header->center != 0 && j == 4) || (fr_ps->header->center == 0 && j == 3))))
			     {
				     /* no samples to dequantize */
			     }
			     else
			     {
				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];
			    } /* end if ..bits */
			}   /* end if 1-channel dyn-cross mode */
		    } /* end if dyn-cross on */
		} /* if bit_alloc */
	  	else
		    fraction[k][i][j][*z] = 0.0;
    }
    for (i = sblimit; i < SBLIMIT; i++)
	for (j = 0; j < 3; j++)
	    for (k = ch_start; k < channels; k++)
		fraction[k][i][j][*z] = 0.0;
}

#ifdef Augmentation_7ch
void II_dequantize_sample_aug (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,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 ;
	else
	   for(l = 1; l < 12; l++)
		if((sb_groups[l-1] < i) && (i <= sb_groups[l]))
		{
		    sbgr = l; break;
		}
	for (j = 0; j < 3; j++)
	   for ( k = 5; k < 7; k++)
		if (bit_alloc[k][i])
		{
		   if ((fr_ps->header->dyn_cross_aug_mode[sbgr]== 0) ||
		       (fr_ps->header->dyn_cross_aug_mode[sbgr]== 1 && k==5) ||
		       (fr_ps->header->dyn_cross_aug_mode[sbgr]== 2 && k==5) ||
		       (fr_ps->header->dyn_cross_aug_mode[sbgr]== 3 && k==5) ||
		       (fr_ps->header->dyn_cross_aug_mode[sbgr]== 4 && k==5) ||
		       (fr_ps->header->dyn_cross_aug_mode[sbgr]== 5 && k==6) ||
		       (fr_ps->header->dyn_cross_aug_mode[sbgr]==10 && k==6) ||
		       (fr_ps->header->dyn_cross_aug_mode[sbgr]==14 && k==6))
		   {
			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];
		   }  /* end if 2-channel dyn-cross mode */
		} /* if bit_alloc */
		else
		   fraction[k][i][j][*z] = 0.0;
   }
   for (i = sblimit; i < SBLIMIT; i++)
	  for (j = 0; j < 3; j++)
		 for(k = 5; k < 7; k++)
			 fraction[k][i][j][*z] = 0.0;
}
#endif

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

void II_dequantize_sample_ml(unsigned int sample_ml[7][3][SBLIMIT],
			     unsigned int bit_alloc_ml[7][SBLIMIT],
			     double fraction_ml[7][SBLIMIT][3][12],
			     frame_params *fr_ps,
			     int *n_ml_ch,
			     int *z)
{
   int i, j, k, x,sbgr,l;
   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 < 3; j++)
		 for ( k = 0; k < *n_ml_ch; k++)
			if (bit_alloc_ml[k][i])
			{
			  /* JR: ditto */
			  /* locate MSB in the sample */
			   x = 0;
#ifndef MSDOS
			   while ((1L<<x) < (*alloc_ml)[i][bit_alloc_ml[k][i]].steps) x++;
#else
			   /* microsoft C thinks an int is a short */
			   while (( (unsigned long) (1L<<(long)x) <
				(unsigned long)( (*alloc_ml)[i][bit_alloc_ml[k][i]].steps)
			   ) && ( x < 16) ) x++;
#endif
			   /* MSB inversion */
			   if (((sample_ml[k][j][i] >> (x-1)) & 1) == 1)
					fraction_ml[k][i][j][*z] = 0.0;
			   else  fraction_ml[k][i][j][*z] = -1.0;

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

			   /* Dequantize the sample */
			   fraction_ml[k][i][j][*z] += d[(*alloc_ml)[i][bit_alloc_ml[k][i]].quant];
			   fraction_ml[k][i][j][*z] *= c[(*alloc_ml)[i][bit_alloc_ml[k][i]].quant];
			} /* if bit_alloc */
			else fraction_ml[k][i][j][*z] = 0.0;
   }
   for (i = sblimit_ml; i < SBLIMIT; i++)
	  for (j = 0; j < 3; j++)
		 for(k = 0; k < *n_ml_ch; k++)
			 fraction_ml[k][i][j][*z] = 0.0;
}

/**************************************************************************
II_lfe_calc();  R.Schwalbe 
**************************************************************************/
void II_lfe_calc(frame_params *fr_ps)
{
   layer *info = fr_ps->header;
   int x,i;
   al_table *alloc = fr_ps->alloc_mc;

   for(i = 0; i < 12; i++)
   {
	x = 0;
#ifndef MSDOS
   	while ((1L<<x) < (*alloc)[0][info->lfe_alloc].steps) x++;
#else
   	/* microsoft C thinks an int is a short */
   	while (( (unsigned long) (1L<<(long)x) <
   	(unsigned long)( (*alloc)[0][info->lfe_alloc].steps)) && ( x < 16) ) x++;
#endif
   	/* MSB inversion */
   	if (((info->lfe_spl[i] >> (x-1)) & 1) == 1)
     		info->lfe_spl_fraction[i] = 0.0;
   	else 	info->lfe_spl_fraction[i] = -1.0;

   	/* Form a 2's complement sample */
   	info->lfe_spl_fraction[i] += (double) (info->lfe_spl[i] & ((1<<(x-1))-1)) /
	 			(double) (1L<<(x-1));

   	/* Dequantize the sample */
   	info->lfe_spl_fraction[i] += d[(*alloc)[0][info->lfe_alloc].quant];
   	info->lfe_spl_fraction[i] *= c[(*alloc)[0][info->lfe_alloc].quant];

   	/* Denormalize the sample */
   	info->lfe_spl_fraction[i] *= multiple[info->lfe_scf];
    }
}

/************************************************************
/*
/*   Restore the original value of the sample ie multiply
/*    the fraction value by its scalefactor.
/*
/************************* Layer II Stuff **********************/

void I_denormalize_sample (double fraction[7][SBLIMIT][3][12],
			   unsigned int scale_index[7][3][SBLIMIT],
			   int part,
			   frame_params *fr_ps,
			   int *z)
{
   int i, j, 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 (j=0; j<stereo; j++)
	 fraction[j][i][gr_sam][gr_id] *= multiple[scale_index[j][part][i]];
}

void II_denormalize_sample(double fraction[7][SBLIMIT][3][12],
			   unsigned int scale_index[7][3][SBLIMIT],
			   frame_params *fr_ps,
			   int x,
			   int *z)
{
   int i,j,k;
   int stereo = fr_ps->stereo;
   int sblimit = fr_ps->sblimit;

   for (i=0;i<sblimit;i++)
	for (j = 0;j < stereo; j++)
	{
	  fraction[j][i][0][*z] *= multiple[scale_index[j][x][i]];
	  fraction[j][i][1][*z] *= multiple[scale_index[j][x][i]];
	  fraction[j][i][2][*z] *= multiple[scale_index[j][x][i]];
	}
}

/************************* MC Layer II Stuff **********************/

void II_denormalize_sample_mc(double fraction[7][SBLIMIT][3][12],
			     unsigned int scale_index[7][3][SBLIMIT],
			     frame_params *fr_ps,
			     int x, int ch_start, int channels, int *z)
{
   int i,j,k,sbgr,l,bl=0;
   int sblimit = fr_ps->sblimit_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;
		}

      /* 960821 FdB new setup for dyn. crosstalk modes */
      for (bl = 0; bl < 3; bl++)	  		
	if (fr_ps->header->dyn_cross_on == 0)
		for (j = ch_start; j < channels; j++)
			fraction[j][i][bl][*z] *= multiple[scale_index[j][x][i]];
	else if (fr_ps->dyn_cross_bits == 0)   /* for channel mode 2/0 (+2/0) */
	{
		if (fr_ps->header->surround == 3)	/* 2/0 + 2/0 and 1/0 + 2/0 */
		{
			fraction[ch_start][i][bl][*z] *= multiple[scale_index[ch_start][x][i]];
			if (fr_ps->header->dyn_second_stereo[sbgr] == 0)
				fraction[ch_start+1][i][bl][*z] *= multiple[scale_index[ch_start+1][x][i]];
			else
				fraction[ch_start+1][i][bl][*z] = (fraction[ch_start][i][bl][*z] / multiple[scale_index[ch_start][x][i]])
									 * multiple[scale_index[ch_start+1][x][i]];
		}
	}
	else if (fr_ps->dyn_cross_bits == 1)   /* for channel mode 3/0 (+2/0) and 2/1 */
	{
		switch (fr_ps->header->dyn_cross_mode[sbgr])
		{
		  case 0 :	fraction[2][i][bl][*z] *= multiple[scale_index[2][x][i]];
				if (fr_ps->header->surround == 3)		/* 3/0 + 2/0 */
				{
					fraction[3][i][bl][*z] *= multiple[scale_index[3][x][i]];
					if (fr_ps->header->dyn_second_stereo[sbgr] == 0)
						fraction[4][i][bl][*z] *= multiple[scale_index[4][x][i]];
					else
						fraction[4][i][bl][*z] = (fraction[3][i][bl][*z] / multiple[scale_index[3][x][i]])
											 * multiple[scale_index[4][x][i]];
				}
			  	break;
		  case 1 :	if (fr_ps->header->tc_alloc[sbgr] == 0)
					if (fr_ps->header->dyn_cross_LR)	/* C,S from R0 */ 
						fraction[2][i][bl][*z] = (fraction[1][i][bl][*z] / multiple[scale_index[1][x][i]])
							 					 * m

⌨️ 快捷键说明

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