Пример #1
0
        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;
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        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);
        }