📄 dyn_cross.c
字号:
/**********************************************************************
* 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 + -