本文整理汇总了C#中NVorbis.DataPacket.ReadBit方法的典型用法代码示例。如果您正苦于以下问题:C# DataPacket.ReadBit方法的具体用法?C# DataPacket.ReadBit怎么用?C# DataPacket.ReadBit使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类NVorbis.DataPacket
的用法示例。
在下文中一共展示了DataPacket.ReadBit方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Init
protected override void Init(DataPacket packet)
{
var submapCount = 1;
if (packet.ReadBit()) submapCount += (int)packet.ReadBits(4);
// square polar mapping
var couplingSteps = 0;
if (packet.ReadBit())
{
couplingSteps = (int)packet.ReadBits(8) + 1;
}
var couplingBits = Utils.ilog(_vorbis._channels - 1);
CouplingSteps = new CouplingStep[couplingSteps];
for (int j = 0; j < couplingSteps; j++)
{
var magnitude = (int)packet.ReadBits(couplingBits);
var angle = (int)packet.ReadBits(couplingBits);
if (magnitude == angle || magnitude > _vorbis._channels - 1 || angle > _vorbis._channels - 1)
throw new Exception();
CouplingSteps[j] = new CouplingStep { Angle = angle, Magnitude = magnitude };
}
// reserved bits
if (packet.ReadBits(2) != 0UL) throw new Exception();
// channel multiplex
var mux = new int[_vorbis._channels];
if (submapCount > 1)
{
for (int c = 0; c < ChannelSubmap.Length; c++)
{
mux[c] = (int)packet.ReadBits(4);
if (mux[c] >= submapCount) throw new Exception();
}
}
// submaps
Submaps = new Submap[submapCount];
for (int j = 0; j < submapCount; j++)
{
packet.ReadBits(8); // unused placeholder
var floorNum = (int)packet.ReadBits(8);
if (floorNum >= _vorbis.Floors.Length) throw new Exception();
var residueNum = (int)packet.ReadBits(8);
if (residueNum >= _vorbis.Residues.Length) throw new Exception();
Submaps[j] = new Submap
{
Floor = _vorbis.Floors[floorNum],
Residue = _vorbis.Residues[floorNum]
};
}
ChannelSubmap = new Submap[_vorbis._channels];
for (int c = 0; c < ChannelSubmap.Length; c++)
{
ChannelSubmap[c] = Submaps[mux[c]];
}
}
示例2: Init
protected override void Init(DataPacket packet)
{
int length1 = 1;
if (packet.ReadBit())
length1 += (int) packet.ReadBits(4);
int length2 = 0;
if (packet.ReadBit())
length2 = (int) packet.ReadBits(8) + 1;
int count = Utils.ilog(this._vorbis._channels - 1);
this.CouplingSteps = new VorbisMapping.CouplingStep[length2];
for (int index = 0; index < length2; ++index)
{
int num1 = (int) packet.ReadBits(count);
int num2 = (int) packet.ReadBits(count);
if (num1 == num2 || num1 > this._vorbis._channels - 1 || num2 > this._vorbis._channels - 1)
throw new InvalidDataException();
this.CouplingSteps[index] = new VorbisMapping.CouplingStep()
{
Angle = num2,
Magnitude = num1
};
}
if ((long) packet.ReadBits(2) != 0L)
throw new InvalidDataException();
int[] numArray = new int[this._vorbis._channels];
if (length1 > 1)
{
for (int index = 0; index < this.ChannelSubmap.Length; ++index)
{
numArray[index] = (int) packet.ReadBits(4);
if (numArray[index] >= length1)
throw new InvalidDataException();
}
}
this.Submaps = new VorbisMapping.Submap[length1];
for (int index1 = 0; index1 < length1; ++index1)
{
long num = (long) packet.ReadBits(8);
int index2 = (int) packet.ReadBits(8);
if (index2 >= this._vorbis.Floors.Length)
throw new InvalidDataException();
if ((int) packet.ReadBits(8) >= this._vorbis.Residues.Length)
throw new InvalidDataException();
this.Submaps[index1] = new VorbisMapping.Submap()
{
Floor = this._vorbis.Floors[index2],
Residue = this._vorbis.Residues[index2]
};
}
this.ChannelSubmap = new VorbisMapping.Submap[this._vorbis._channels];
for (int index = 0; index < this.ChannelSubmap.Length; ++index)
this.ChannelSubmap[index] = this.Submaps[numArray[index]];
}
示例3: Init
internal static VorbisMode Init(VorbisStreamDecoder vorbis, DataPacket packet)
{
VorbisMode vorbisMode = new VorbisMode(vorbis);
vorbisMode.BlockFlag = packet.ReadBit();
vorbisMode.WindowType = (int) packet.ReadBits(16);
vorbisMode.TransformType = (int) packet.ReadBits(16);
int index = (int) packet.ReadBits(8);
if (vorbisMode.WindowType != 0 || vorbisMode.TransformType != 0 || index >= vorbis.Maps.Length)
throw new InvalidDataException();
vorbisMode.Mapping = vorbis.Maps[index];
vorbisMode.BlockSize = vorbisMode.BlockFlag ? vorbis.Block1Size : vorbis.Block0Size;
if (vorbisMode.BlockFlag)
{
vorbisMode._windows = new float[4][];
vorbisMode._windows[0] = new float[vorbis.Block1Size];
vorbisMode._windows[1] = new float[vorbis.Block1Size];
vorbisMode._windows[2] = new float[vorbis.Block1Size];
vorbisMode._windows[3] = new float[vorbis.Block1Size];
}
else
{
vorbisMode._windows = new float[1][];
vorbisMode._windows[0] = new float[vorbis.Block0Size];
}
vorbisMode.CalcWindows();
return vorbisMode;
}
示例4: Init
internal static VorbisMode Init(VorbisStreamDecoder vorbis, DataPacket packet)
{
var mode = new VorbisMode(vorbis);
mode.BlockFlag = packet.ReadBit();
mode.WindowType = (int)packet.ReadBits(16);
mode.TransformType = (int)packet.ReadBits(16);
var mapping = (int)packet.ReadBits(8);
if (mode.WindowType != 0 || mode.TransformType != 0 || mapping >= vorbis.Maps.Length) throw new InvalidDataException();
mode.Mapping = vorbis.Maps[mapping];
mode.BlockSize = mode.BlockFlag ? vorbis.Block1Size : vorbis.Block0Size;
// now pre-calc the window(s)...
if (mode.BlockFlag)
{
// long block
mode._windows = new float[4][];
mode._windows[0] = new float[vorbis.Block1Size];
mode._windows[1] = new float[vorbis.Block1Size];
mode._windows[2] = new float[vorbis.Block1Size];
mode._windows[3] = new float[vorbis.Block1Size];
}
else
{
// short block
mode._windows = new float[1][];
mode._windows[0] = new float[vorbis.Block0Size];
}
mode.CalcWindows();
return mode;
}
示例5: Init
protected override void Init(DataPacket packet)
{
this._begin = (int) packet.ReadBits(24);
this._end = (int) packet.ReadBits(24);
this._partitionSize = (int) packet.ReadBits(24) + 1;
this._classifications = (int) packet.ReadBits(6) + 1;
this._classBookNum = (int) packet.ReadBits(8);
this._classBook = this._vorbis.Books[this._classBookNum];
this._cascade = new int[this._classifications];
int length = 0;
int val2 = 0;
for (int index = 0; index < this._classifications; ++index)
{
int num1 = 0;
int num2 = (int) packet.ReadBits(3);
if (packet.ReadBit())
num1 = (int) packet.ReadBits(5);
this._cascade[index] = num1 << 3 | num2;
length += VorbisResidue.Residue0.icount(this._cascade[index]);
val2 = Math.Max(Utils.ilog(this._cascade[index]), val2);
}
this._maxPasses = val2;
int[] numArray = new int[length];
for (int index = 0; index < length; ++index)
numArray[index] = (int) packet.ReadBits(8);
int num3 = 0;
this._books = new VorbisCodebook[this._classifications][];
this._bookNums = new int[this._classifications][];
for (int index1 = 0; index1 < this._classifications; ++index1)
{
this._books[index1] = new VorbisCodebook[8];
this._bookNums[index1] = new int[8];
int num1 = 1;
int index2 = 0;
while (num1 < 256)
{
if ((this._cascade[index1] & num1) == num1)
{
int index3 = numArray[num3++];
this._books[index1][index2] = this._vorbis.Books[index3];
this._bookNums[index1][index2] = index3;
if (this._books[index1][index2].MapType == 0)
throw new InvalidDataException();
}
num1 <<= 1;
++index2;
}
}
this._classWordsPerCodeWord = this._classBook.Dimensions;
this._nToRead = this._end - this._begin;
this._partsToRead = this._nToRead / this._partitionSize;
this._partWords = (this._partsToRead + this._classWordsPerCodeWord - 1) / this._classWordsPerCodeWord;
}
示例6: LoadBooks
bool LoadBooks(DataPacket packet)
{
bool equal = true;
byte[] sequence = new byte[] { 0x05, 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73 };
byte[] packets = packet.ReadBytes(7);
for (int i = 0; i < 7; i++)
{
if (packets[i] != sequence[i])
{
equal = false;
break;
}
}
if (!equal)
{
return false;
}
if (!_pagesSeen.Contains((_lastPageSeen = packet.PageSequenceNumber))) _pagesSeen.Add(_lastPageSeen);
var bits = packet.BitsRead;
_glueBits += packet.BitsRead;
// get books
Books = new VorbisCodebook[packet.ReadByte() + 1];
for (int i = 0; i < Books.Length; i++)
{
Books[i] = VorbisCodebook.Init(this, packet, i);
}
_bookBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get times
Times = new VorbisTime[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Times.Length; i++)
{
Times[i] = VorbisTime.Init(this, packet);
}
_timeHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get floor
Floors = new VorbisFloor[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Floors.Length; i++)
{
Floors[i] = VorbisFloor.Init(this, packet);
}
_floorHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get residue
Residues = new VorbisResidue[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Residues.Length; i++)
{
Residues[i] = VorbisResidue.Init(this, packet);
}
_resHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get map
Maps = new VorbisMapping[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Maps.Length; i++)
{
Maps[i] = VorbisMapping.Init(this, packet);
}
_mapHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get mode settings
Modes = new VorbisMode[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Modes.Length; i++)
{
Modes[i] = VorbisMode.Init(this, packet);
}
_modeHdrBits += packet.BitsRead - bits;
// check the framing bit
if (!packet.ReadBit()) throw new InvalidDataException();
++_glueBits;
_wasteHdrBits += 8 * packet.Length - packet.BitsRead;
_modeFieldBits = Utils.ilog(Modes.Length - 1);
return true;
}
示例7: UnpackPacket
bool UnpackPacket(DataPacket packet)
{
// make sure we're on an audio packet
if (packet.ReadBit())
{
// we really can't do anything... count the bits as waste
return false;
}
// get mode and prev/next flags
var modeBits = _modeFieldBits;
_mode = Modes[(int)packet.ReadBits(_modeFieldBits)];
if (_mode.BlockFlag)
{
_prevFlag = packet.ReadBit();
_nextFlag = packet.ReadBit();
modeBits += 2;
}
else
{
_prevFlag = _nextFlag = false;
}
if (packet.IsShort) return false;
var startBits = packet.BitsRead;
var halfBlockSize = _mode.BlockSize / 2;
// read the noise floor data (but don't decode yet)
for (int i = 0; i < _channels; i++)
{
_floorData[i] = _mode.Mapping.ChannelSubmap[i].Floor.UnpackPacket(packet, _mode.BlockSize, i);
_noExecuteChannel[i] = !_floorData[i].ExecuteChannel;
// go ahead and clear the residue buffers
Array.Clear(_residue[i], 0, halfBlockSize);
}
// make sure we handle no-energy channels correctly given the couplings...
foreach (var step in _mode.Mapping.CouplingSteps)
{
if (_floorData[step.Angle].ExecuteChannel || _floorData[step.Magnitude].ExecuteChannel)
{
_floorData[step.Angle].ForceEnergy = true;
_floorData[step.Magnitude].ForceEnergy = true;
}
}
var floorBits = packet.BitsRead - startBits;
startBits = packet.BitsRead;
foreach (var subMap in _mode.Mapping.Submaps)
{
for (int j = 0; j < _channels; j++)
{
if (_mode.Mapping.ChannelSubmap[j] != subMap)
{
_floorData[j].ForceNoEnergy = true;
}
}
var rTemp = subMap.Residue.Decode(packet, _noExecuteChannel, _channels, _mode.BlockSize);
for (int c = 0; c < _channels; c++)
{
var r = _residue[c];
var rt = rTemp[c];
for (int i = 0; i < halfBlockSize; i++)
{
r[i] += rt[i];
}
}
}
_glueBits += 1;
_modeBits += modeBits;
_floorBits += floorBits;
_resBits += packet.BitsRead - startBits;
_wasteBits += 8 * packet.Length - packet.BitsRead;
_packetCount += 1;
return true;
}
示例8: LoadBooks
void LoadBooks(DataPacket packet)
{
packet.SkipBits(8);
if ( !packet.ReadBytes ( 6 ).SequenceEqual ( new byte [] { 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73 } ) ) throw new ArgumentException ( "Corrupted book header!" );
var bits = packet.BitsRead;
_glueBits += packet.BitsRead;
// get books
Books = new VorbisCodebook[packet.ReadByte() + 1];
for (int i = 0; i < Books.Length; i++)
{
Books[i] = VorbisCodebook.Init(this, packet, i);
}
_bookBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get times
Times = new VorbisTime[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Times.Length; i++)
{
Times[i] = VorbisTime.Init(this, packet);
}
_timeHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get floor
Floors = new VorbisFloor[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Floors.Length; i++)
{
Floors[i] = VorbisFloor.Init(this, packet);
}
_floorHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get residue
Residues = new VorbisResidue[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Residues.Length; i++)
{
Residues[i] = VorbisResidue.Init(this, packet);
}
_resHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get map
Maps = new VorbisMapping[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Maps.Length; i++)
{
Maps[i] = VorbisMapping.Init(this, packet);
}
_mapHdrBits += packet.BitsRead - bits;
bits = packet.BitsRead;
// get mode settings
Modes = new VorbisMode[(int)packet.ReadBits(6) + 1];
for (int i = 0; i < Modes.Length; i++)
{
Modes[i] = VorbisMode.Init(this, packet);
}
_modeHdrBits += packet.BitsRead - bits;
// check the framing bit
if ( !packet.ReadBit () ) throw new ArgumentException ();
++_glueBits;
_wasteHdrBits += 8 * packet.Length - packet.BitsRead;
_modeFieldBits = Utils.ilog(Modes.Length - 1);
}
示例9: GetPacketLength
internal int GetPacketLength(DataPacket curPacket, DataPacket lastPacket)
{
// if we don't have a previous packet, or we're re-syncing, this packet has no audio data to return
if (lastPacket == null || curPacket.IsResync) return 0;
// make sure they are audio packets
if (curPacket.ReadBit()) return 0;
if (lastPacket.ReadBit()) return 0;
// get the current packet's information
var modeIdx = (int)curPacket.ReadBits(_modeFieldBits);
if (modeIdx < 0 || modeIdx >= Modes.Length) return 0;
var mode = Modes[modeIdx];
// get the last packet's information
modeIdx = (int)lastPacket.ReadBits(_modeFieldBits);
if (modeIdx < 0 || modeIdx >= Modes.Length) return 0;
var prevMode = Modes[modeIdx];
// now calculate the totals...
return mode.BlockSize / 4 + prevMode.BlockSize / 4;
}
示例10: UnpackPacket
internal override PacketData UnpackPacket(DataPacket packet, int blockSize, int channel)
{
var data = _reusablePacketData[channel];
data.BlockSize = blockSize;
data.ForceEnergy = false;
data.ForceNoEnergy = false;
data.PostCount = 0;
Array.Clear(data.Posts, 0, 64);
// hoist ReadPosts to here since that's all we're doing...
if (packet.ReadBit())
{
var postCount = 2;
data.Posts[0] = (int)packet.ReadBits(_yBits);
data.Posts[1] = (int)packet.ReadBits(_yBits);
for (int i = 0; i < _partitionClass.Length; i++)
{
var clsNum = _partitionClass[i];
var cdim = _classDimensions[clsNum];
var cbits = _classSubclasses[clsNum];
var csub = (1 << cbits) - 1;
var cval = 0U;
if (cbits > 0)
{
if ((cval = (uint)_classMasterbooks[clsNum].DecodeScalar(packet)) == uint.MaxValue)
{
// we read a bad value... bail
postCount = 0;
break;
}
}
for (int j = 0; j < cdim; j++)
{
var book = _subclassBooks[clsNum][cval & csub];
cval >>= cbits;
if (book != null)
{
if ((data.Posts[postCount] = book.DecodeScalar(packet)) == -1)
{
// we read a bad value... bail
postCount = 0;
i = _partitionClass.Length;
break;
}
}
++postCount;
}
}
data.PostCount = postCount;
}
return data;
}
示例11: InitLookupTable
private void InitLookupTable(DataPacket packet)
{
this.MapType = (int) packet.ReadBits(4);
if (this.MapType == 0)
return;
float num1 = Utils.ConvertFromVorbisFloat32(packet.ReadUInt32());
float num2 = Utils.ConvertFromVorbisFloat32(packet.ReadUInt32());
int count = (int) packet.ReadBits(4) + 1;
bool flag = packet.ReadBit();
int length = this.Entries * this.Dimensions;
float[] numArray1 = new float[length];
if (this.MapType == 1)
length = this.lookup1_values();
uint[] numArray2 = new uint[length];
for (int index = 0; index < length; ++index)
numArray2[index] = (uint) packet.ReadBits(count);
if (this.MapType == 1)
{
for (int index1 = 0; index1 < this.Entries; ++index1)
{
double num3 = 0.0;
int num4 = 1;
for (int index2 = 0; index2 < this.Dimensions; ++index2)
{
int index3 = index1 / num4 % length;
double num5 = (double) numArray2[index3] * (double) num2 + (double) num1 + num3;
numArray1[index1 * this.Dimensions + index2] = (float) num5;
if (flag)
num3 = num5;
num4 *= length;
}
}
}
else
{
for (int index1 = 0; index1 < this.Entries; ++index1)
{
double num3 = 0.0;
int index2 = index1 * this.Dimensions;
for (int index3 = 0; index3 < this.Dimensions; ++index3)
{
double num4 = (double) numArray2[index2] * (double) num2 + (double) num1 + num3;
numArray1[index1 * this.Dimensions + index3] = (float) num4;
if (flag)
num3 = num4;
++index2;
}
}
}
this.LookupTable = numArray1;
}
示例12: GetPacketLength
internal int GetPacketLength(DataPacket curPacket, DataPacket lastPacket)
{
if (lastPacket == null || curPacket.IsResync || (curPacket.ReadBit() || lastPacket.ReadBit()))
return 0;
int index1 = (int) curPacket.ReadBits(this._modeFieldBits);
if (index1 < 0 || index1 >= this.Modes.Length)
return 0;
VorbisMode vorbisMode1 = this.Modes[index1];
int index2 = (int) lastPacket.ReadBits(this._modeFieldBits);
if (index2 < 0 || index2 >= this.Modes.Length)
return 0;
VorbisMode vorbisMode2 = this.Modes[index2];
return vorbisMode1.BlockSize / 4 + vorbisMode2.BlockSize / 4;
}
示例13: LoadBooks
private void LoadBooks(DataPacket packet)
{
packet.SkipBits(8);
if (!Enumerable.SequenceEqual<byte>((IEnumerable<byte>) packet.ReadBytes(6), (IEnumerable<byte>) new byte[6]
{
(byte) 118,
(byte) 111,
(byte) 114,
(byte) 98,
(byte) 105,
(byte) 115
}))
throw new InvalidDataException("Corrupted book header!");
long bitsRead1 = packet.BitsRead;
this._glueBits += packet.BitsRead;
this.Books = new VorbisCodebook[(int) packet.ReadByte() + 1];
for (int number = 0; number < this.Books.Length; ++number)
this.Books[number] = VorbisCodebook.Init(this, packet, number);
this._bookBits += packet.BitsRead - bitsRead1;
long bitsRead2 = packet.BitsRead;
this.Times = new VorbisTime[(int) packet.ReadBits(6) + 1];
for (int index = 0; index < this.Times.Length; ++index)
this.Times[index] = VorbisTime.Init(this, packet);
this._timeHdrBits += packet.BitsRead - bitsRead2;
long bitsRead3 = packet.BitsRead;
this.Floors = new VorbisFloor[(int) packet.ReadBits(6) + 1];
for (int index = 0; index < this.Floors.Length; ++index)
this.Floors[index] = VorbisFloor.Init(this, packet);
this._floorHdrBits += packet.BitsRead - bitsRead3;
long bitsRead4 = packet.BitsRead;
this.Residues = new VorbisResidue[(int) packet.ReadBits(6) + 1];
for (int index = 0; index < this.Residues.Length; ++index)
this.Residues[index] = VorbisResidue.Init(this, packet);
this._resHdrBits += packet.BitsRead - bitsRead4;
long bitsRead5 = packet.BitsRead;
this.Maps = new VorbisMapping[(int) packet.ReadBits(6) + 1];
for (int index = 0; index < this.Maps.Length; ++index)
this.Maps[index] = VorbisMapping.Init(this, packet);
this._mapHdrBits += packet.BitsRead - bitsRead5;
long bitsRead6 = packet.BitsRead;
this.Modes = new VorbisMode[(int) packet.ReadBits(6) + 1];
for (int index = 0; index < this.Modes.Length; ++index)
this.Modes[index] = VorbisMode.Init(this, packet);
this._modeHdrBits += packet.BitsRead - bitsRead6;
if (!packet.ReadBit())
throw new InvalidDataException();
++this._glueBits;
this._wasteHdrBits += (long) (8 * packet.Length) - packet.BitsRead;
this._modeFieldBits = Utils.ilog(this.Modes.Length - 1);
}
示例14: InitTree
private void InitTree(DataPacket packet)
{
int num1 = 0;
bool flag;
if (packet.ReadBit())
{
int num2 = (int) packet.ReadBits(5) + 1;
int num3 = 0;
while (num3 < this.Entries)
{
int num4 = (int) packet.ReadBits(Utils.ilog(this.Entries - num3));
while (--num4 >= 0)
this.Lengths[num3++] = num2;
++num2;
}
num1 = 0;
flag = false;
}
else
{
flag = packet.ReadBit();
for (int index = 0; index < this.Entries; ++index)
{
if (!flag || packet.ReadBit())
{
this.Lengths[index] = (int) packet.ReadBits(5) + 1;
++num1;
}
else
this.Lengths[index] = -1;
}
}
this.MaxBits = Enumerable.Max((IEnumerable<int>) this.Lengths);
int[] numArray1 = (int[]) null;
if (flag && num1 >= this.Entries >> 2)
{
numArray1 = new int[this.Entries];
Array.Copy((Array) this.Lengths, (Array) numArray1, this.Entries);
flag = false;
}
int length = !flag ? 0 : num1;
int[] numArray2 = (int[]) null;
int[] codeList = (int[]) null;
if (!flag)
codeList = new int[this.Entries];
else if (length != 0)
{
numArray1 = new int[length];
codeList = new int[length];
numArray2 = new int[length];
}
VorbisCodebook vorbisCodebook = this;
int[] numArray3 = this.Lengths;
int num5 = this.Entries;
int[] numArray4 = numArray2;
int num6 = flag ? 1 : 0;
int sortedEntries = length;
int[] codewords = codeList;
int[] codewordLengths = numArray1;
int[] len = numArray3;
int n = num5;
int[] values = numArray4;
if (!vorbisCodebook.ComputeCodewords(num6 != 0, sortedEntries, codewords, codewordLengths, len, n, values))
throw new InvalidDataException();
this.LTree = Huffman.BuildLinkedList<int>(numArray2 ?? Enumerable.ToArray<int>(Enumerable.Range(0, codeList.Length)), numArray1 ?? this.Lengths, codeList);
}
示例15: Init
protected override void Init(DataPacket packet)
{
// this is pretty well stolen directly from libvorbis... BSD license
_begin = (int)packet.ReadBits(24);
_end = (int)packet.ReadBits(24);
_partitionSize = (int)packet.ReadBits(24) + 1;
_classifications = (int)packet.ReadBits(6) + 1;
_classBook = _vorbis.Books[(int)packet.ReadBits(8)];
_cascade = new int[_classifications];
var acc = 0;
for (int i = 0; i < _classifications; i++)
{
var low_bits = (int)packet.ReadBits(3);
if (packet.ReadBit())
{
_cascade[i] = (int)packet.ReadBits(5) << 3 | low_bits;
}
else
{
_cascade[i] = low_bits;
}
acc += icount(_cascade[i]);
}
var bookNums = new int[acc];
for (var i = 0; i < acc; i++)
{
bookNums[i] = (int)packet.ReadBits(8);
if (_vorbis.Books[bookNums[i]].MapType == 0) throw new Exception();
}
var entries = _classBook.Entries;
var dim = _classBook.Dimensions;
var partvals = 1;
while (dim > 0)
{
partvals *= _classifications;
if (partvals > entries) throw new Exception();
--dim;
}
// now the lookups
dim = _classBook.Dimensions;
_books = new VorbisCodebook[_classifications][];
acc = 0;
var maxstage = 0;
int stages;
for (int j = 0; j < _classifications; j++)
{
stages = Utils.ilog(_cascade[j]);
_books[j] = new VorbisCodebook[stages];
if (stages > 0)
{
maxstage = Math.Max(maxstage, stages);
for (int k = 0; k < stages; k++)
{
if ((_cascade[j] & (1 << k)) > 0)
{
_books[j][k] = _vorbis.Books[bookNums[acc++]];
}
}
}
}
_maxStages = maxstage;
_decodeMap = new int[partvals][];
for (int j = 0; j < partvals; j++)
{
var val = j;
var mult = partvals / _classifications;
_decodeMap[j] = new int[_classBook.Dimensions];
for (int k = 0; k < _classBook.Dimensions; k++)
{
var deco = val / mult;
val -= deco * mult;
mult /= _classifications;
_decodeMap[j][k] = deco;
}
}
_entryCache = new int[_partitionSize];
_partWordCache = new int[_vorbis._channels][][];
var maxPartWords = ((_end - _begin) / _partitionSize + _classBook.Dimensions - 1) / _classBook.Dimensions;
for (int ch = 0; ch < _vorbis._channels; ch++)
{
_partWordCache[ch] = new int[maxPartWords][];
}
}