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.SyntaxConstants; import net.sourceforge.jaad.aac.syntax.ICSInfo; import net.sourceforge.jaad.aac.syntax.ICStream; /** * 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. * * Mid/side stereo * @author in-somnia */ public final class MS implements SyntaxConstants, HCB { private MS() { } public static void process(CPE cpe, float[] specL, float[] specR) { final ICStream ics = cpe.getLeftChannel(); final ICSInfo info = ics.getInfo(); final int[] offsets = info.getSWBOffsets(); final int windowGroups = info.getWindowGroupCount(); final int maxSFB = info.getMaxSFB(); final int[] sfbCBl = ics.getSfbCB(); final int[] sfbCBr = cpe.getRightChannel().getSfbCB(); int groupOff = 0; int g, i, w, j, idx = 0; for(g = 0; g<windowGroups; g++) { for(i = 0; i<maxSFB; i++, idx++) { if(cpe.isMSUsed(idx)&&sfbCBl[idx]<NOISE_HCB&&sfbCBr[idx]<NOISE_HCB) { for(w = 0; w<info.getWindowGroupLength(g); w++) { int off = groupOff+w*128+offsets[i]; for(j = 0; j<offsets[i+1]-offsets[i]; j++) { float t = specL[off+j]-specR[off+j]; specL[off+j] += specR[off+j]; specR[off+j] = t; } } } } groupOff += info.getWindowGroupLength(g)*128; } } }