void decode(BitStream inStream, DecoderConfig conf) { couplingPoint = 2 * inStream.readBit(); coupledCount = inStream.readBits(3); int gainCount = 0; for (int i = 0; i <= coupledCount; i++) { gainCount++; channelPair[i] = inStream.readBool(); idSelect[i] = inStream.readBits(4); if (channelPair[i]) { chSelect[i] = inStream.readBits(2); if (chSelect[i] == 3) { gainCount++; } } else { chSelect[i] = 2; } } couplingPoint += inStream.readBit(); couplingPoint |= (couplingPoint >> 1); bool sign = inStream.readBool(); double scale = CCE_SCALE[inStream.readBits(2)]; ics.decode(inStream, false, conf); ICSInfo info = ics.getInfo(); int windowGroupCount = info.getWindowGroupCount(); int maxSFB = info.getMaxSFB(); //TODO: int[,] sfbCB = null;//ics.getSectionData().getSfbCB(); for (int i = 0; i < gainCount; i++) { int idx = 0; int cge = 1; int xg = 0; float gainCache = 1.0f; if (i > 0) { cge = couplingPoint == 2 ? 1 : inStream.readBit(); xg = cge == 0 ? 0 : Huffman.decodeScaleFactor(inStream) - 60; gainCache = (float)Math.Pow(scale, -xg); } if (couplingPoint == 2) { gain[i, 0] = gainCache; } else { for (int g = 0; g < windowGroupCount; g++) { for (int sfb = 0; sfb < maxSFB; sfb++, idx++) { if (sfbCB[g, sfb] != ZERO_HCB) { if (cge == 0) { int t = Huffman.decodeScaleFactor(inStream) - 60; if (t != 0) { int s = 1; t = xg += t; if (!sign) { s -= 2 * (t & 0x1); t >>= 1; } gainCache = (float)(Math.Pow(scale, -t) * s); } } gain[i, idx] = gainCache; } } } } } }
public void decode(BitStream inStream, DecoderConfig conf) { var profile = conf.getProfile(); var sf = conf.getSampleFrequency(); if (sf.getIndex() == -1) { throw new AACException("invalid sample frequency"); } readElementInstanceTag(inStream); commonWindow = inStream.readBool(); var info = icsL.getInfo(); if (commonWindow) { info.decode(inStream, conf, commonWindow); icsR.getInfo().setData(info); msMask = (MSMask)inStream.readBits(2); if (msMask == MSMask.TYPE_USED) { int maxSFB = info.getMaxSFB(); int windowGroupCount = info.getWindowGroupCount(); for (int idx = 0; idx < windowGroupCount * maxSFB; idx++) { msUsed[idx] = inStream.readBool(); } } else if (msMask == MSMask.TYPE_ALL_1) { for (int i = 0; i < msUsed.Length; i++) { msUsed[i] = true; } } else if (msMask == MSMask.TYPE_ALL_0) { for (int i = 0; i < msUsed.Length; i++) { msUsed[i] = false; } } else { throw new AACException("reserved MS mask type used"); } } else { msMask = MSMask.TYPE_ALL_0; for (int i = 0; i < msUsed.Length; i++) { msUsed[i] = false; } } if (profile.isErrorResilientProfile() && (info.isLTPrediction1Present())) { if (info.ltpData2Present = inStream.readBool()) { info.getLTPrediction2().decode(inStream, info, profile); } } icsL.decode(inStream, commonWindow, conf); icsR.decode(inStream, commonWindow, conf); }