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

📄 dyn_cross.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 4 页
字号:
	break;
 case 10: 
	if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
	    bit_alloc[T4[sbgr]][min_sb] = 1;
	break;
 case 11: 
	if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
	    bit_alloc[T3[sbgr]][min_sb] = 1;
	if(min_ch == R0 && bit_alloc[R0][min_sb] != 0)
	    bit_alloc[T4[sbgr]][min_sb] = 1;
	break;
 case 12: 
	if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
	    bit_alloc[T4[sbgr]][min_sb] = 1;
	if(min_ch == L0 && bit_alloc[L0][min_sb] != 0)
	    bit_alloc[T3[sbgr]][min_sb] = 1;
	break;
 case 13: 
	if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) 
	    bit_alloc[T2[sbgr]][min_sb] = 1;
	if(min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0)
	    bit_alloc[T4[sbgr]][min_sb] = 1;
	break;
 case 14: 
	if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) {
	    bit_alloc[T3[sbgr]][min_sb] = 1;
	    bit_alloc[T4[sbgr]][min_sb] = 1;
	}
	break;
 case 15: 
	fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!\n");
	fflush(stderr);
	exit(0);
	break;
    }	    /* switch.. */
}
else if (fr_ps->config == 310 || fr_ps->config == 220)
{
    /* 3/1 and 2/2 */
    switch(fr_ps->header->dyn_cross[sbgr]) {
  case 0:	
	break;
  case 1: 
	if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0)
	    bit_alloc[T3[sbgr]][min_sb] = 1;
	break;
  case 2: 
	if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0)
	    bit_alloc[T2[sbgr]][min_sb] = 1;
	break;
  case 3: 
	if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0) 
	    bit_alloc[T2[sbgr]][min_sb] = 1;
	if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0) 
	    bit_alloc[T3[sbgr]][min_sb] = 1;
	break;
  case 4: 
	if(min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0)
	    bit_alloc[T3[sbgr]][min_sb] = 1;
	break;
 default: 
	fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!\n");
	fflush(stderr);
	exit(0);
	break;
    }	    /* switch.. */
}
else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
{
    /* 3/0 (+2/0) and 2/1 */
    switch(fr_ps->header->dyn_cross[sbgr]) {
  case 0:	
	break;
  case 1: 
	if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0)
	    bit_alloc[T2[sbgr]][min_sb] = 1;
	break;
 default: 
	fprintf(stderr, "FORBIDDEN DYN_CROSS!!!!!\n");
	fflush(stderr);
	exit(0);
	break;
    }	    /* switch.. */
    if (fr_ps->header->dyn_second_stereo[sbgr])
	if(min_ch == T4outof[sbgr] && bit_alloc[T4outof[sbgr]][min_sb] != 0)
	    bit_alloc[T4[sbgr]][min_sb] = 1;
}
else if (fr_ps->config == 202)
{
    if (fr_ps->header->dyn_second_stereo[sbgr])
	if(min_ch == T3outof[sbgr] && bit_alloc[T3outof[sbgr]][min_sb] != 0)
	    bit_alloc[T3[sbgr]][min_sb] = 1;
}
else if (fr_ps->config == 102)
{
    if (fr_ps->header->dyn_second_stereo[sbgr])
	if(min_ch == T2outof[sbgr] && bit_alloc[T2outof[sbgr]][min_sb] != 0)
	    bit_alloc[T2[sbgr]][min_sb] = 1;
}
}

#ifdef Augmentation_7ch
void choose_dyn_aug (
	frame_params	*fr_ps, 
	    /* in:  fr_ps->header->dyn_cross[sbgr] 
	     *	    fr_ps->alloc
	     */
	int		min_ch,				/* in */
	int		min_sb,				/* in */
	int		sbgr, 				/* in */
	unsigned int	bit_alloc[CHANMAX3][SBLIMIT])	/* out */
{
/*  global parameters
 *  in:	T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS]
 */
    layer *info  = fr_ps->header;
    int dynx_T2 = !dyn_ch (fr_ps, sbgr, 2);
    int dynx_T3 = !dyn_ch (fr_ps, sbgr, 3);
    int dynx_T4 = !dyn_ch (fr_ps, sbgr, 4);
    int T5T0 = L0, T6T0 = L0, T6T1 = R0;
    
    if (info->aug_tc_alloc[sbgr] == 4 || info->aug_tc_alloc[sbgr] == 5)
    	if (fr_ps->header->dyn_cross_LR == 0)
	    T6T1 = L0;
	else
	    T6T0 = R0;
    else if (info->aug_tc_alloc[sbgr] == 6 || info->aug_tc_alloc[sbgr] == 7)
        if (info->dyn_cross_LR)
	    T5T0 = R0;

    /* 5/2 */
    switch (fr_ps->header->aug_dyn_cross[sbgr])
    {
    case 0:	
	  break;
    case 1: 
	  if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0)
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
    case 2: 
	  if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
	      (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
    case 3: 
	  if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
	      (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
    case 4: 
	  if (min_ch == T5[sbgr] && bit_alloc[T5[sbgr]][min_sb] != 0)
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
    case 5: 
	  if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  break;
    case 6: 
	  if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0) 
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
    case 7: 
	  if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
	      (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
    case 8: 
	  if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0) 
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
	      (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
    case 9: 
	  if (min_ch == T5T0 && bit_alloc[T5T0][min_sb] != 0)
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if (min_ch == T6T0 && bit_alloc[T6T0][min_sb] != 0)
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   case 10: 
	  if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
	      (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  break;
   case 11: 
	  if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
	      (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0)
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   case 12: 
	  if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
	      (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   case 13: 
	  if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
	      (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
	      (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   case 14: 
	  if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
	      (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  break;
   case 15: 
	  if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
	      (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if (min_ch == T6T1 && bit_alloc[T6T1][min_sb] != 0)
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   case 16: 
	  if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
	      (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if ((min_ch == T2[sbgr] && bit_alloc[T2[sbgr]][min_sb] != 0) ||
	      (dynx_T2 && min_ch == T2from[sbgr] && bit_alloc[T2from[sbgr]][min_sb] != 0))
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   case 17: 
	  if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
	      (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = 1;
	  if ((min_ch == T4[sbgr] && bit_alloc[T4[sbgr]][min_sb] != 0) ||
	      (dynx_T4 && min_ch == T4from[sbgr] && bit_alloc[T4from[sbgr]][min_sb] != 0))
	      bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   case 18:
	  if ((min_ch == T3[sbgr] && bit_alloc[T3[sbgr]][min_sb] != 0) ||
	      (dynx_T3 && min_ch == T3from[sbgr] && bit_alloc[T3from[sbgr]][min_sb] != 0))
	      bit_alloc[T5[sbgr]][min_sb] = bit_alloc[T6[sbgr]][min_sb] = 1;
	  break;
   default: 
	  fprintf (stderr, "FORBIDDEN AUG_DYN_CROSS!!!!!\n");
	  fflush (stderr);
	  exit (1);
	  break;
    }
}
#endif


/************************************************************************
 *
 * scfsi_calc_dyn    
 *
 * Version 1.0	    94/07/07	Andreas Silzle, IRT
 *
 * Calculating the scale factor select information of one channel 
 * without changing the scale factors.
 *
 ************************************************************************/

void scfsi_calc_dyn (
	unsigned int	scalar_dyn[][3][SBLIMIT],   /* in/out */
	int		ch, 			    /* in */
	int		sblimit,		    /* in */ 
	unsigned int	scfsi_dyn[][SBLIMIT]) 	    /* out */
{
    int	    sb;
    
    for (sb = 0; sb < sblimit; sb++)
    {
	/* If the subbands are coded only with SCF's, they must be accurate. */
	/* 1993-02-19 and 1994-03-17 shn */
	/* 4 patterns are possible: 0: ABC, 1: AAB, 2: AAA, 3: ABB */
	if ((scalar_dyn[ch][0][sb] != scalar_dyn[ch][1][sb]) &&
	    (scalar_dyn[ch][1][sb] != scalar_dyn[ch][2][sb]))
	    scfsi_dyn[ch][sb] = 0;
	else
	if ((scalar_dyn[ch][0][sb] == scalar_dyn[ch][1][sb]) &&
	    (scalar_dyn[ch][1][sb] != scalar_dyn[ch][2][sb]))
	    scfsi_dyn[ch][sb] = 1;
	else
	if ((scalar_dyn[ch][0][sb] == scalar_dyn[ch][1][sb]) &&
	    (scalar_dyn[ch][1][sb] == scalar_dyn[ch][2][sb]))
	    scfsi_dyn[ch][sb] = 2;
	else
	    scfsi_dyn[ch][sb] = 3;
    }	/* for (sb.. */
}

/************************************************************************
 *
 * scfsi_calc    
 *
 * Version 1.0	    94/07/07	Andreas Silzle, IRT
 *
 * Calculating the scale factor select information of one channel. 
 *
 * route: II_transmission_pattern (Layer II only)
 *
 * PURPOSE:For a given subband, determines whether to send 1, 2, or
 * all 3 of the scalefactors, and fills in the scalefactor
 * select information accordingly
 *
 * SEMANTICS:  The subbands and channels are classified based on how much
 * the scalefactors changes over its three values (corresponding
 * to the 3 sets of 12 samples per subband).  The classification
 * will send 1 or 2 scalefactors instead of three if the scalefactors
 * do not change much.  The scalefactor select information,
 * #scfsi#, is filled in accordingly.
 *
 ************************************************************************/

void scfsi_calc (
	unsigned int	scalar[][3][SBLIMIT], 	/* in/out */
	int		ch, 			/* in */
	int		sblimit,		/* in */ 
	unsigned int	scfsi[][SBLIMIT]) 	/* out */
{
    int dscf[2];
    int class[2], sb, j;
    static int pattern[5][5] = {
	0x123, 0x122, 0x122, 0x133, 0x123,
	0x113, 0x111, 0x111, 0x444, 0x113,
	0x111, 0x111, 0x111, 0x333, 0x113,
	0x222, 0x222, 0x222, 0x333, 0x123,
	0x123, 0x122, 0x122, 0x133, 0x123    };

    for (sb = 0; sb < sblimit; sb++)
    {
	dscf[0] = (scalar[ch][0][sb] - scalar[ch][1][sb]);
	dscf[1] = (scalar[ch][1][sb] - scalar[ch][2][sb]);
	for (j=0; j<2; j++)
	{
	    if (dscf[j] <= -3)
		class[j] = 0;
	    else if (dscf[j] > -3 && dscf[j] < 0)
		class[j] = 1;
	    else if (dscf[j] == 0)
		class[j] = 2;
	    else if (dscf[j] > 0 && dscf[j] < 3)
		class[j] = 3;
	    else 
		class[j] = 4;
	}
	switch (pattern[class[0]][class[1]])
	{
	case 0x123 :
	    scfsi[ch][sb] = 0;
	    break;
	case 0x122 :
	    scfsi[ch][sb] = 3;
	    scalar[ch][2][sb] = scalar[ch][1][sb];
	    break;
	case 0x133 :
	    scfsi[ch][sb] = 3;
	    scalar[ch][1][sb] = scalar[ch][2][sb];
	    break;
	case 0x113 :
	    scfsi[ch][sb] = 1;
	    scalar[ch][1][sb] = scalar[ch][0][sb];
	    break;
	case 0x111 :
	    scfsi[ch][sb] = 2;
	    scalar[ch][1][sb] = scalar[ch][2][sb] = scalar[ch][0][sb];
	    break;
	case 0x222 :
	    scfsi[ch][sb] = 2;
	    scalar[ch][0][sb] = scalar[ch][2][sb] = scalar[ch][1][sb];
	    break;
	case 0x333 :
	    scfsi[ch][sb] = 2;
	    scalar[ch][0][sb] = scalar[ch][1][sb] = scalar[ch][2][sb];
	    break;
	case 0x444 :
	    scfsi[ch][sb] = 2;
	    if (scalar[ch][0][sb] > scalar[ch][2][sb])
		scalar[ch][0][sb] = scalar[ch][2][sb];
	    scalar[ch][1][sb] = scalar[ch][2][sb] = scalar[ch][0][sb];
	}	/* switch */
    }		/* for (sb.. */
}

/************************************************************************
 *
 * scf_calc    
 *
 * Calculating the scale factor for one channel.
 *
 * Version 1.0	    94/07/07	Andreas Silzle, IRT
 *
 * route: II_scale_factor_calc() 
 *
 * PURPOSE:For each subband, calculate the scale factor for each set
 * of the 12 subband samples
 *
 * SEMANTICS:  Pick the scalefactor #multiple[]# just larger than the
 * absolute value of the peak subband sample of 12 samples,
 * and store the corresponding scalefactor index in #scalar#.
 *
 * Layer II has three sets of 12-subband samples for a given
 * subband.
 *
 ************************************************************************/

void scf_calc (
	double		sample[][3][SCALE_BLOCK][SBLIMIT], /* in */
	int		sblimit,		/* in */
	int		ch,			/* in */
	unsigned int	scf[][3][SBLIMIT])	/* out */ 
{
/* global variables: 
 * double multiple[64] 
 */
    int	    sb, smp, sufr, r;
    double  s[SBLIMIT];

    for (sufr=0; sufr<3; sufr++)
    {
	for (sb=0; sb<sblimit; sb++)
	    for (smp=1, s[sb] = mod(sample[ch][sufr][0][sb]); 
		    smp<SCALE_BLOCK; smp++)
		if (mod(sample[ch][sufr][smp][sb]) > s[sb])
		    s[sb] = mod(sample[ch][sufr][smp][sb]);

	for (sb=0; sb<sblimit; sb++)
	    for (r=SCALE_RANGE-1, scf[ch][sufr][sb]=0; r>=0; r--)
		if (s[sb] < multiple[r])
		{                       /* <= changed to <, 1992-11-06 shn*/
		    scf[ch][sufr][sb] = r;
		    break;
		}
    }   /* for (sufr.. */
}

⌨️ 快捷键说明

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