/*
* Copyright (C) 2011 in-somnia
*
* This file is part of JAAD.
*
* JAAD is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* JAAD is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.
* If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.jaad.aac.tools;
import net.sourceforge.jaad.aac.huffman.HCB;
import net.sourceforge.jaad.aac.syntax.CPE;
import net.sourceforge.jaad.aac.syntax.Constants;
import net.sourceforge.jaad.aac.syntax.ICSInfo;
import net.sourceforge.jaad.aac.syntax.ICStream;
/**
* Intensity stereo
* @author in-somnia
*/
public final class IS implements Constants, ISScaleTable, HCB {
private IS() {
}
public static void process(CPE cpe, float[] specL, float[] specR) {
final ICStream ics = cpe.getRightChannel();
final ICSInfo info = ics.getInfo();
final int[] offsets = info.getSWBOffsets();
final int windowGroups = info.getWindowGroupCount();
final int maxSFB = info.getMaxSFB();
final int[] sfbCB = ics.getSfbCB();
final int[] sectEnd = ics.getSectEnd();
final float[] scaleFactors = ics.getScaleFactors();
int w, i, j, c, end, off;
int idx = 0, groupOff = 0;
float scale;
for(int g = 0; g<windowGroups; g++) {
for(i = 0; i<maxSFB;) {
if(sfbCB[idx]==INTENSITY_HCB||sfbCB[idx]==INTENSITY_HCB2) {
end = sectEnd[idx];
for(; i<end; i++, idx++) {
c = sfbCB[idx]==INTENSITY_HCB ? 1 : -1;
if(cpe.isMSMaskPresent())
c *= cpe.isMSUsed(idx) ? -1 : 1;
scale = c*scaleFactors[idx];
for(w = 0; w<info.getWindowGroupLength(g); w++) {
off = groupOff+w*128+offsets[i];
for(j = 0; j<offsets[i+1]-offsets[i]; j++) {
specR[off+j] = specL[off+j]*scale;
}
}
}
}
else {
end = sectEnd[idx];
idx += end-i;
i = end;
}
}
groupOff += info.getWindowGroupLength(g)*128;
}
}
}