package net.sourceforge.jaad.aac.sbr; /** * This class is part of JAAD ( jaadec.sourceforge.net ) that is distributed * under the Public Domain license. Code changes provided by the JCodec project * are distributed under FreeBSD license. * * @author in-somnia */ class TFGrid implements SBRConstants { /* function constructs new time border vector */ /* first build into temp vector to be able to use previous vector on error */ public static int envelope_time_border_vector(SBR sbr, int ch) { int l, border, temp; int[] t_E_temp = new int[6]; t_E_temp[0] = sbr.rate*sbr.abs_bord_lead[ch]; t_E_temp[sbr.L_E[ch]] = sbr.rate*sbr.abs_bord_trail[ch]; switch(sbr.bs_frame_class[ch]) { case FIXFIX: switch(sbr.L_E[ch]) { case 4: temp = (sbr.numTimeSlots/4); t_E_temp[3] = sbr.rate*3*temp; t_E_temp[2] = sbr.rate*2*temp; t_E_temp[1] = sbr.rate*temp; break; case 2: t_E_temp[1] = sbr.rate*(sbr.numTimeSlots/2); break; default: break; } break; case FIXVAR: if(sbr.L_E[ch]>1) { int i = sbr.L_E[ch]; border = sbr.abs_bord_trail[ch]; for(l = 0; l<(sbr.L_E[ch]-1); l++) { if(border<sbr.bs_rel_bord[ch][l]) return 1; border -= sbr.bs_rel_bord[ch][l]; t_E_temp[--i] = sbr.rate*border; } } break; case VARFIX: if(sbr.L_E[ch]>1) { int i = 1; border = sbr.abs_bord_lead[ch]; for(l = 0; l<(sbr.L_E[ch]-1); l++) { border += sbr.bs_rel_bord[ch][l]; if(sbr.rate*border+sbr.tHFAdj>sbr.numTimeSlotsRate+sbr.tHFGen) return 1; t_E_temp[i++] = sbr.rate*border; } } break; case VARVAR: if(sbr.bs_num_rel_0[ch]!=0) { int i = 1; border = sbr.abs_bord_lead[ch]; for(l = 0; l<sbr.bs_num_rel_0[ch]; l++) { border += sbr.bs_rel_bord_0[ch][l]; if(sbr.rate*border+sbr.tHFAdj>sbr.numTimeSlotsRate+sbr.tHFGen) return 1; t_E_temp[i++] = sbr.rate*border; } } if(sbr.bs_num_rel_1[ch]!=0) { int i = sbr.L_E[ch]; border = sbr.abs_bord_trail[ch]; for(l = 0; l<sbr.bs_num_rel_1[ch]; l++) { if(border<sbr.bs_rel_bord_1[ch][l]) return 1; border -= sbr.bs_rel_bord_1[ch][l]; t_E_temp[--i] = sbr.rate*border; } } break; } /* no error occured, we can safely use this t_E vector */ for(l = 0; l<6; l++) { sbr.t_E[ch][l] = t_E_temp[l]; } return 0; } public static void noise_floor_time_border_vector(SBR sbr, int ch) { sbr.t_Q[ch][0] = sbr.t_E[ch][0]; if(sbr.L_E[ch]==1) { sbr.t_Q[ch][1] = sbr.t_E[ch][1]; sbr.t_Q[ch][2] = 0; } else { int index = middleBorder(sbr, ch); sbr.t_Q[ch][1] = sbr.t_E[ch][index]; sbr.t_Q[ch][2] = sbr.t_E[ch][sbr.L_E[ch]]; } } private static int middleBorder(SBR sbr, int ch) { int retval = 0; switch(sbr.bs_frame_class[ch]) { case FIXFIX: retval = sbr.L_E[ch]/2; break; case VARFIX: if(sbr.bs_pointer[ch]==0) retval = 1; else if(sbr.bs_pointer[ch]==1) retval = sbr.L_E[ch]-1; else retval = sbr.bs_pointer[ch]-1; break; case FIXVAR: case VARVAR: if(sbr.bs_pointer[ch]>1) retval = sbr.L_E[ch]+1-sbr.bs_pointer[ch]; else retval = sbr.L_E[ch]-1; break; } return (retval>0) ? retval : 0; } }