Example #1
0
        private void ReadSubframe()
        {
            uint zeroPadding = bitReader.ReadBits(1);
            if (zeroPadding != 0)
                throw new FlacException("Subframe zero padding is not zero");
            int subframeType = (int)bitReader.ReadBits(6);

            SubframeType type;
            int order = 0;
            if (subframeType == FlacCommons.ConstantSubframeType)
                type = SubframeType.SubframeConstant;
            else if (subframeType == FlacCommons.VerbatimSubframeType)
                type = SubframeType.SubframeVerbatim;
            else if (FlacCommons.FixedSubframeTypeStart <= subframeType &&
                subframeType <= FlacCommons.FixedSubframeTypeEnd)
            {
                type = SubframeType.SubframeFixed;
                order = subframeType - FlacCommons.FixedSubframeTypeStart;
            }
            else if (subframeType >= FlacCommons.LpcSubframeTypeStart)
            {
                type = SubframeType.SubframeLpc;
                order = subframeType - FlacCommons.LpcSubframeTypeStart + 1;
            }
            else
                throw new FlacException("Subframe type is set to reserved");

            uint wastedBitsPerSampleFlag = bitReader.ReadBits(1);
            if (wastedBitsPerSampleFlag > 0)
            {
                this.wastedBitsPerSample = 1 + (int)bitReader.ReadUnary();
            }
            else
                this.wastedBitsPerSample = 0;

            this.subframeType = type;

            int subframeBitsPerSample = FrameBitsPerSample;
            if (ChannelAssignment[subframeIndex] == SoundChannelAssignment.Difference)
            {
                subframeBitsPerSample++; // undocumented
            }

            switch (type)
            {
                case SubframeType.SubframeConstant:
                    PrepareConstantSubframe(subframeBitsPerSample);
                    break;
                case SubframeType.SubframeVerbatim:
                    PrepareVerbatimSubframe(subframeBitsPerSample);
                    break;
                case SubframeType.SubframeLpc:
                    PrepareLpcSubframe(order, subframeBitsPerSample);
                    break;
                case SubframeType.SubframeFixed:
                    PrepareFixedSubframe(order, subframeBitsPerSample);
                    break;
            }

            this.recordType = FlacRecordType.Subframe;
            this.dataRead = false;
        }
Example #2
0
        public void Decode(Frame fr, StreamInfo streamInfo, BitReader str, int bitsPerSample, int channelNum)
        {
            byte header;

            this.channelNum = channelNum;

            header = (byte) str.ReadByte();

            if ((header & 0x80) != 0)
            {
                //TODO: handle corrupt bit
                return;
            }

            byte subtype = (byte)((header & 0x7E) >> 1);

            if (subtype == 0)
            {
                type = SubframeType.Constant;
            }
            else if (subtype == 1)
            {
                type = SubframeType.Verbatim;
            }
            else if ((subtype >= 8)&&(subtype<=12))
            {
                type = SubframeType.Fixed;
                order = (uint)(subtype & 0x7);
            }
            else if ((subtype & 0x20) != 0)
            {
                type = SubframeType.LPC;
                order = (uint)(subtype & 0x1F) + 1;
            }
            else
            {
                //TODO: handle reserved frame types
                return;
            }

            wastedBits = 0;

            if ((header & 0x1) != 0)
            {
                int buff = 0;

                do
                {
                    str.ReadBit(ref buff);
                    wastedBits++;
                } while (buff == 0);
            }

            numSamples = 0;
            numResiduals = 0;

            switch (type)
            {
                case SubframeType.Constant:
                    ProcessConstant(fr, str, bitsPerSample);
                    break;
                case SubframeType.Verbatim:
                    ProcessVerbatim(fr, str, bitsPerSample);
                    break;
                case SubframeType.Fixed:
                    ProcessFixed(fr, str, bitsPerSample);
                    break;
                case SubframeType.LPC:
                    ProcessLPC(fr, str, bitsPerSample);
                    break;

            }
        }
Example #3
0
 protected FlacMethodFirBased(SubframeType subframeType, int estimatedSize, int order, FlacResidualCoefficeints residual)
     : base(subframeType, estimatedSize)
 {
     this.order    = order;
     this.residual = residual;
 }
Example #4
0
 protected FlacMethod(SubframeType subframeType, int estimatedSize)
 {
     this.subframeType  = subframeType;
     this.estimatedSize = estimatedSize;
 }
Example #5
0
 protected FlacMethodFirBased(SubframeType subframeType, int estimatedSize, int order, FlacResidualCoefficeints residual)
     : base(subframeType, estimatedSize)
 {
     this.order = order;
     this.residual = residual;
 }
Example #6
0
 protected FlacMethod(SubframeType subframeType, int estimatedSize)
 {
     this.subframeType = subframeType;
     this.estimatedSize = estimatedSize;
 }