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

📄 dyn_cross.c

📁 MPEG 2的音频编码软件。喜欢多媒体的开发人员可以看看。
💻 C
📖 第 1 页 / 共 4 页
字号:
/**********************************************************************
 * ISO MPEG Audio Subgroup Software Simulation Group (1996)
 * ISO 13818-3 MPEG-2 Audio Multichannel Encoder
 *
 * $Id: dyn_cross.c 1.3 1996/02/12 07:13:35 rowlands Exp $
 *
 * $Log: dyn_cross.c $
 * Revision 1.3  1996/02/12 07:13:35  rowlands
 * Release following Munich meeting
 *
 **********************************************************************/

#include "common.h"
#include "encoder.h"

/************************************************************************
 *
 * take_dyn_cross
 *
 * Version 1.0	    94/10/24	Andreas Silzle, IRT
 *
 * Copy the sums, scf, scfsi, if required, in the normal positions.
 *
 ************************************************************************/


/* #define LOW_SBGR	5	original value 960619 FdB			*/
#define LOW_SBGR	0   /* lowest subbandgroup, in which dyn_cross is done.*/
			    /* All sb-groups under that boarder are not	       */
			    /* affected by dyn_cross			       */

void take_dyn_cross (
	int		dyn_cr,	
	frame_params	*fr_ps,  		    
	    /* out: int	fr_ps->header->dyn_cross_on, 
	     *	    int	fr_ps->header->dyn_cross_LR, 
    	     *	    int	fr_ps->header->dyn_cross[SBGRS],	    
	     */			    
	double		sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT], 	    
						    /* in, T23, T24, T34, T234, T56 */
	unsigned int	scalar_sum[][3][SBLIMIT], 			/* in */ 
	unsigned int	scfsi_sum[][SBLIMIT],  				/* in */
	unsigned int	scfsi_dyn[][SBLIMIT],  				/* in */
	double		sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT],	/* out */
	unsigned int	scalar[][3][SBLIMIT], 				/* out */ 
	unsigned int	scfsi[][SBLIMIT]) 				/* out */
{
    int	    sbgr, sb, sufr, smp, dyn_second_stereo = 0;
    layer *info  = fr_ps->header;
    int center   = info->center;
    int surround = info->surround;

    fr_ps->header->dyn_cross_on = 0;
    if (fr_ps->header->dyn_cross_LR && (fr_ps->config == 302 || fr_ps->config == 202 || fr_ps->config == 102))
	dyn_second_stereo = 1;

/*    printf ("dyn_cr: %2d\n", dyn_cr); */

    for (sbgr = LOW_SBGR; sbgr < SBGRS; sbgr++)
    {
	/* signalization */
	if (dyn_cr == 0 && dyn_second_stereo == 0)
	{
	    fr_ps->header->dyn_cross[sbgr] = 0;
	    fr_ps->header->dyn_second_stereo[sbgr] = 0;
	}
	else
	{
	    fr_ps->header->dyn_cross_on = 1;
	    /* original value 960619 FdB */ 
	    /* fr_ps->header->dyn_cross[sbgr] = dyn_cr; */
	    /* systematic variation of dynamic crosstalk over all subbands */
	    if (dyn_cr == -1)
	    {
		switch (fr_ps->config)
		{
		    case 320:	fr_ps->header->dyn_cross[sbgr] = rand () % 15;
				break;
		    case 310:
		    case 220:	fr_ps->header->dyn_cross[sbgr] = rand () % 5;
				break;
		    case 300:
		    case 302:
		    case 210:	fr_ps->header->dyn_cross[sbgr] = rand () % 2;
				break;
		    default:	fr_ps->header->dyn_cross[sbgr] = 0;
				break;
		}
	    }
	    else
		fr_ps->header->dyn_cross[sbgr] = dyn_cr;

	    fr_ps->header->dyn_second_stereo[sbgr] = dyn_second_stereo;
/*
            printf ("sbgr: %2d dyn_cr: %2d dyn_2nd_st: %2d\n",
	    	    sbgr, fr_ps->header->dyn_cross[sbgr],
		    fr_ps->header->dyn_second_stereo[sbgr]);
*/
	    /* copying sums, scf, scfsi */
	    
	    /* 960627 FdB DynX dependent on configuration */
	    if (fr_ps->config == 320)
	    {
		/* 3/2 */
		if(fr_ps->header->dyn_cross[sbgr] == 9 || fr_ps->header->dyn_cross[sbgr] == 11) {
		    T3from[sbgr] = T2[sbgr];
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) {
			scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb];
			for(sufr = 0; sufr<3; ++sufr) {
			    scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
			    for(smp = 0; smp<SCALE_BLOCK; ++smp) {
				sb_sample[T2[sbgr]][sufr][smp][sb] = 
				    sb_sample_sum[T23][sufr][smp][sb];
			    }   /* for(smp..) */
			}	    /* for(sufr.). */
		    }	    /* for(sb..) */
		} 
		else if(fr_ps->header->dyn_cross[sbgr] == 10 || fr_ps->header->dyn_cross[sbgr] == 12) {
		    T4from[sbgr] = T2[sbgr];
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) {
			scfsi[T2[sbgr]][sb] = scfsi_sum[T24][sb];
			for(sufr = 0; sufr<3; ++sufr) {
			    scalar[T2[sbgr]][sufr][sb] = scalar_sum[T24][sufr][sb];
			    for(smp = 0; smp<SCALE_BLOCK; ++smp) {
				sb_sample[T2[sbgr]][sufr][smp][sb] = 
				    sb_sample_sum[T24][sufr][smp][sb];
			    }   /* for(smp..) */
			}	    /* for(sufr..) */
		    }	    /* for(sb..) */
		} 
		else if(fr_ps->header->dyn_cross[sbgr] == 8 || fr_ps->header->dyn_cross[sbgr] == 13) {
		    T4from[sbgr] = T3[sbgr];
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) {
			scfsi[T3[sbgr]][sb] = scfsi_sum[T34][sb];
			for(sufr = 0; sufr<3; ++sufr) {
			    scalar[T3[sbgr]][sufr][sb] = scalar_sum[T34][sufr][sb];
			    for(smp = 0; smp<SCALE_BLOCK; ++smp) {
				sb_sample[T3[sbgr]][sufr][smp][sb] = 
				    sb_sample_sum[T34][sufr][smp][sb];
			    }   /* for(smp..) */
			}	    /* for(sufr..) */
		    }	    /* for(sb..) */
		} 
		else if(fr_ps->header->dyn_cross[sbgr] == 14) {
		    T3from[sbgr] = T4from[sbgr] = T2[sbgr];
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) {
			scfsi[T2[sbgr]][sb] = scfsi_sum[T234][sb];
			for(sufr = 0; sufr<3; ++sufr) {
			    scalar[T2[sbgr]][sufr][sb] = scalar_sum[T234][sufr][sb];
			    for(smp = 0; smp<SCALE_BLOCK; ++smp) {
				sb_sample[T2[sbgr]][sufr][smp][sb] = 
				    sb_sample_sum[T234][sufr][smp][sb];
			    }   /* for(smp..) */
			}	    /* for(sufr..) */
		    }	    /* for(sb..) */
		}		    /* if(dyncr_do[sbgr]..) */
	
		/* scfsi_dyn in scfsi of L0 and R0 */
		/* T2 */
		switch(fr_ps->header->dyn_cross[sbgr]) {
	      case 3: case 5: case 6: case 7: case 13:
		    T2from[sbgr] = T2outof[sbgr];
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) 
			scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb];
		    break;	    
		}	/* switch(dyncr_do[sbgr]) */
		/* T3 */
		switch(fr_ps->header->dyn_cross[sbgr]) {
	      case 2: case 4: case 6: case 7: case 12:
		    T3from[sbgr] = T3outof[sbgr];
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) 
			scfsi[L0][sb] = scfsi_dyn[L0][sb];
		    break;	    
		}	/* switch(dyncr_do[sbgr]) */
		/* T4 */
		switch(fr_ps->header->dyn_cross[sbgr]) {
	      case 1: case 4: case 5: case 7: case 11:
		    T4from[sbgr] = T4outof[sbgr];
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) 
			scfsi[R0][sb] = scfsi_dyn[R0][sb];
		    break;	    
		}	/* switch(fr_ps->header->dyn_cross[sbgr]) */
	    }
	    else if (fr_ps->config == 310 || fr_ps->config == 220)
	    {
		/* 3/1 and 2/2 */
		if(fr_ps->header->dyn_cross[sbgr] == 4) {
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) {
			scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb];
			for(sufr = 0; sufr<3; ++sufr) {
			    scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
			    for(smp = 0; smp<SCALE_BLOCK; ++smp) {
				sb_sample[T2[sbgr]][sufr][smp][sb] = 
				    sb_sample_sum[T23][sufr][smp][sb];
			    }   /* for(smp..) */
			}	    /* for(sufr.). */
		    }	    /* for(sb..) */
		} 
    
		/* scfsi_dyn in scfsi of L0 and R0 */
		/* T2 */
		switch(fr_ps->header->dyn_cross[sbgr]) {
	      case 2: case 3:
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) 
			scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb];
		    break;	    
		}	/* switch(dyncr_do[sbgr]) */
		/* T3 */
		switch(fr_ps->header->dyn_cross[sbgr]) {
	      case 1: case 3:
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) 
			scfsi[T3outof[sbgr]][sb] = scfsi_dyn[T3outof[sbgr]][sb];
		    break;	    
		}	/* switch(dyncr_do[sbgr]) */
	    }
	    else if (fr_ps->config == 300 || fr_ps->config == 302 || fr_ps->config == 210)
	    {
		/* 3/0 (+2/0) and 2/1 */
		/* scfsi_dyn in scfsi of L0 and R0 */
		/* T2 */
		switch(fr_ps->header->dyn_cross[sbgr]) {
	      case 1:
		    for(sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
			    sb<=sb_groups[sbgr]; sb++) 
			scfsi[T2outof[sbgr]][sb] = scfsi_dyn[T2outof[sbgr]][sb];
		    break;	    
		}	/* switch(dyncr_do[sbgr]) */
    
		if (fr_ps->header->dyn_second_stereo[sbgr])
		    for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++)
		    {
			scfsi[T3[sbgr]][sb] = scfsi_sum[T23][sb];
			for (sufr = 0; sufr<3; ++sufr)
			{
			    scalar[T3[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
			    for (smp = 0; smp<SCALE_BLOCK; ++smp)
				sb_sample[T3[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb];
			}	    /* for(sufr..) */
		    }	    /* for(sb..) */
	    }
	    else if (fr_ps->config == 202)
	    {
		if (fr_ps->header->dyn_second_stereo[sbgr])
		    for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++)
		    {
			scfsi[T2[sbgr]][sb] = scfsi_sum[T23][sb];
			for (sufr = 0; sufr<3; ++sufr)
			{
			    scalar[T2[sbgr]][sufr][sb] = scalar_sum[T23][sufr][sb];
			    for (smp = 0; smp<SCALE_BLOCK; ++smp)
				sb_sample[T2[sbgr]][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb];
			}	    /* for(sufr.). */
		    }	    /* for(sb..) */
	    }
	    else if (fr_ps->config == 102)
	    {
		if (fr_ps->header->dyn_second_stereo[sbgr])
		    for (sb=((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); sb<=sb_groups[sbgr]; sb++)
		    {
			scfsi[1][sb] = scfsi_sum[T23][sb];
			for (sufr = 0; sufr<3; ++sufr)
			{
			    scalar[1][sufr][sb] = scalar_sum[T23][sufr][sb];
			    for (smp = 0; smp<SCALE_BLOCK; ++smp)
				sb_sample[1][sufr][smp][sb] = sb_sample_sum[T23][sufr][smp][sb];
			}	    /* for(sufr.). */
		    }	    /* for(sb..) */
	    }
	}	/* if(fr_ps->header->dyn_cross[sbgr] == 0) */
    }		/* for(sbgr=0.. */
}

#ifdef Augmentation_7ch
void take_dyn_cross_aug (
	int		aug_dyn_cr,	
	frame_params	*fr_ps,  		    
	    /* out: int	fr_ps->header->dyn_cross_on, 
	     *	    int	fr_ps->header->dyn_cross_LR, 
    	     *	    int	fr_ps->header->dyn_cross[SBGRS],	    
	     */			    
	double		sb_sample_sum[5][3][SCALE_BLOCK][SBLIMIT], 	    
						    /* in, T23, T24, T34, T234, T56 */
	unsigned int	scalar_sum[][3][SBLIMIT], 			/* in */ 
	unsigned int	scfsi_sum[][SBLIMIT],  				/* in */
	unsigned int	scfsi_dyn[][SBLIMIT],  				/* in */
	double		sb_sample[CHANMAX3][3][SCALE_BLOCK][SBLIMIT],	/* out */
	unsigned int	scalar[][3][SBLIMIT], 				/* out */ 
	unsigned int	scfsi[][SBLIMIT]) 				/* out */
{
    int	    sbgr, sb, sufr, smp;
    layer *info  = fr_ps->header;
    int center   = info->center;
    int surround = info->surround;

    fr_ps->header->aug_dyn_cross_on = 1;

    for (sbgr = LOW_SBGR; sbgr < SBGRS; sbgr++)
    {
	if (aug_dyn_cr == -1)
	    fr_ps->header->aug_dyn_cross[sbgr] = rand () % 19;
	else
	    fr_ps->header->aug_dyn_cross[sbgr] = aug_dyn_cr;

	/* copying sums, scf, scfsi */
	
	if (fr_ps->header->aug_dyn_cross[sbgr] == 4)
	{
	    for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
		    sb <= sb_groups[sbgr]; sb++)
	    {
		scfsi[T5[sbgr]][sb] = scfsi_sum[T56][sb];
		for (sufr = 0; sufr < 3; ++sufr)
		{
		    scalar[T5[sbgr]][sufr][sb] = scalar_sum[T56][sufr][sb];
		    for (smp = 0; smp < SCALE_BLOCK; ++smp)
			sb_sample[T5[sbgr]][sufr][smp][sb] = 
			    sb_sample_sum[T56][sufr][smp][sb];
		}
	    }
	}

	/* scfsi_dyn in scfsi of MPEG2 channels */
	/* L0 */
	switch (fr_ps->header->aug_dyn_cross[sbgr])
	{
	case 5: case 6: case 7: case 8: case 9:
	      for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
		      sb <= sb_groups[sbgr]; sb++) 
		  scfsi[L0][sb] = scfsi_dyn[L0][sb];
	      break;	    
	}
	/* R0 */
	switch (fr_ps->header->aug_dyn_cross[sbgr])
	{
	case 1: case 6: case 11: case 15:
	      for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
		      sb <= sb_groups[sbgr]; sb++) 
		  scfsi[R0][sb] = scfsi_dyn[R0][sb];
	      break;	    
	}
	/* T2 */
	switch (fr_ps->header->aug_dyn_cross[sbgr])
	{
	case 2: case 7: case 10: case 11: case 12: case 13: case 16:
	      for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
		      sb <= sb_groups[sbgr]; sb++) 
		  scfsi[T2[sbgr]][sb] = scfsi_dyn[T2[sbgr]][sb];
	      break;	    
	}
	/* T3 */
	switch (fr_ps->header->aug_dyn_cross[sbgr])
	{
	case 14: case 15: case 16: case 17: case 18:
	      for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
		      sb <= sb_groups[sbgr]; sb++) 
		  scfsi[T3[sbgr]][sb] = scfsi_dyn[T3[sbgr]][sb];
	      break;	    
	}
	/* T4 */
	switch (fr_ps->header->aug_dyn_cross[sbgr])
	{
	case 3: case 8: case 13: case 17:
	      for (sb = ((sbgr==0) ? 0:(sb_groups[sbgr-1]+1)); 
		      sb <= sb_groups[sbgr]; sb++) 
		  scfsi[T4[sbgr]][sb] = scfsi_dyn[T4[sbgr]][sb];
	      break;	    
	}
    }
}
#endif

/************************************************************************
 *
 * trans_chan
 *
 * Version 1.0	    94/06/27	Andreas Silzle, IRT
 * Version 1.1	    94/10/28	Andreas Silzle, IRT
 *
 * Which channels are in the transmission channels 
 * T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof{SBGRS] per subband group.
 * T2outof[] can be changed later by fr_ps->header->dyn_cross_LR.
 *
 ************************************************************************/

void trans_chan (frame_params *fr_ps) 		    
	    /* in:  int	fr_ps->header->tc_alloc[SBGRS], 
    	     *	    int	fr_ps->numchan,	    
	     *	    int	fr_ps->header->matrix,	    0 normal -, 3 no matricing 
	     *	    int fr_ps->header->dyn_cross_LR  0 out of L0, 1 out of R0
	     */			    
/*  global parameters
 *  out:    T2[SBGRS], T3[SBGRS], T4[SBGRS], T2outof[SBGRS], T3outof[SBGRS], T4outof[SBGRS]
 */
{  
    int sbgr;

    for (sbgr = 0; sbgr < SBGRS; sbgr++)
    {
	/* 960627 FdB tca dependent on configuration */
	if (fr_ps->config == 320)
	{
	    /* 3/2 */
	    switch(fr_ps->header->tc_alloc[sbgr]) {
	  case 0:
		T2[sbgr] = C; T3[sbgr] = LS; T4[sbgr] = RS;
		if(fr_ps->header->dyn_cross_LR == 0)
		    T2outof[sbgr] = L0;
		else
		    T2outof[sbgr] = R0;
		T3outof[sbgr] = L0;
		T4outof[sbgr] = R0;
		break;
	  case 1:
		T2[sbgr] = L; T3[sbgr] = LS; T4[sbgr] = RS;
		T2outof[sbgr] = L0;
		T3outof[sbgr] = L0;
		T4outof[sbgr] = R0;
		break;
	  case 2:
		T2[sbgr] = R; T3[sbgr] = LS; T4[sbgr] = RS;
		T2outof[sbgr] = R0;
		T3outof[sbgr] = L0;
		T4outof[sbgr] = R0;
		break;
	  case 3:
		T2[sbgr] = C; T3[sbgr] = L; T4[sbgr] = RS;
		if(fr_ps->header->dyn_cross_LR == 0)

⌨️ 快捷键说明

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