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; }
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; } }
protected FlacMethodFirBased(SubframeType subframeType, int estimatedSize, int order, FlacResidualCoefficeints residual) : base(subframeType, estimatedSize) { this.order = order; this.residual = residual; }
protected FlacMethod(SubframeType subframeType, int estimatedSize) { this.subframeType = subframeType; this.estimatedSize = estimatedSize; }