public override void BuildTree(BitStream m) { //Read tag int tag = m.ReadBits(1); //If tag is zero, finish if (tag == 0) { return; } lowByteTree = new Huffmantree(); lowByteTree.BuildTree(m); highByteTree = new Huffmantree(); highByteTree.BuildTree(m); iMarker1 = m.ReadBits(16); //System.Console.WriteLine("M1:" + iMarker1); iMarker2 = m.ReadBits(16); //System.Console.WriteLine("M2:" + iMarker2); iMarker3 = m.ReadBits(16); //System.Console.WriteLine("M3:" + iMarker3); RootNode = new Node(); BuildTree(m, RootNode); //For some reason we have to skip a bit m.ReadBits(1); if (marker1 == null) { // System.Console.WriteLine("Not using marker 1"); marker1 = new Node(); } if (marker2 == null) { // System.Console.WriteLine("Not using marker 2"); marker2 = new Node(); } if (marker3 == null) { // System.Console.WriteLine("Not using marker 3"); marker3 = new Node(); } }
/// <summary> /// Reads the next frame. /// </summary> public void ReadNextFrame() { uint mask = 1; if (CurrentFrame >= File.Header.NbFrames) throw new EndOfStreamException("No more frames"); long currentPos = File.Stream.Position; //If this frame has a palette record if ((File.FrameTypes[CurrentFrame] & mask) > 0) { //Update the palette UpdatePalette(); } //Sound data mask <<= 1; for (int i = 0; i < 7; i++, mask <<= 1) { if ((file.FrameTypes[CurrentFrame] & mask) > 0) { long pos = File.Stream.Position; uint length = Util.ReadDWord(File.Stream); //We assume compression, if not, well too bad uint unpackedLength = Util.ReadDWord(File.Stream); BitStream m = new BitStream(File.Stream); if (m.ReadBits(1) != 0) //Audio present { bool stereo = m.ReadBits(1) > 0; bool is16Bit = m.ReadBits(1) > 0; //Next are some trees uint nbTrees = 1; if (stereo) nbTrees <<= 1; if (is16Bit) nbTrees <<= 1; Huffmantree[] tree = new Huffmantree[nbTrees]; byte[] audioData = new byte[unpackedLength + 4]; uint audioDataIndex = 0; for (int k = 0; k < nbTrees; k++) { tree[k] = new Huffmantree(); tree[k].BuildTree(m); } int res; if (is16Bit) { Int16 rightBaseMSB = 0, rightBaseLSB = 0, leftBaseMSB = 0, leftBaseLSB = 0; rightBaseMSB = (Int16)(m.ReadBits(8)); rightBaseLSB = (Int16)(m.ReadBits(8)); //Add sample (little endian) audioData[audioDataIndex++] = (byte)rightBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)rightBaseMSB; //Higher byte if (stereo) { leftBaseMSB = (Int16)(m.ReadBits(8)); leftBaseLSB = (Int16)(m.ReadBits(8)); //Add sample (little endian) audioData[audioDataIndex++] = (byte)leftBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)leftBaseMSB; //Higher byte } for (int l = 0; l < unpackedLength / 2; l++) { if ((l & ((stereo) ? 1 : 0)) > 0) { res = tree[2].Decode(m); leftBaseLSB += (Int16)res; res = tree[3].Decode(m); leftBaseMSB += (Int16)res; leftBaseMSB += (Int16)(leftBaseLSB >> 8); leftBaseLSB &= 0xFF; //Add sample (little endian) audioData[audioDataIndex++] = (byte)leftBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)leftBaseMSB; //Higher byte } else { res = tree[0].Decode(m); rightBaseLSB += (Int16)res; res = tree[1].Decode(m); rightBaseMSB += (Int16)res; rightBaseMSB += (Int16)(rightBaseLSB >> 8); rightBaseLSB &= 0xFF; //Add sample (little endian) audioData[audioDataIndex++] = (byte)rightBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)rightBaseMSB; //Higher byte } } } else { byte rightBase = (byte)m.ReadBits(8), leftBase = 0; //Add sample audioData[audioDataIndex++] = rightBase; if (stereo) { leftBase = (byte)m.ReadBits(8); //Add sample audioData[audioDataIndex++] = leftBase; } for (int l = 0; l < unpackedLength; l++) { if ((l & ((stereo) ? 1 : 0)) > 0) { leftBase += (byte)tree[1].Decode(m); //Add sample audioData[audioDataIndex++] = leftBase; } else { rightBase += (byte)tree[0].Decode(m); //Add sample audioData[audioDataIndex++] = rightBase; } } } lastAudioData[i] = audioData; } File.Stream.Seek(pos + (long)length, SeekOrigin.Begin); } } //Video data try { DecodeVideo(); } catch (IOException exc) { Console.WriteLine("Exception caught while decoding frame:" + exc.ToString()); } //Seek to the next frame File.Stream.Seek(currentPos + File.FrameSizes[CurrentFrame], SeekOrigin.Begin); CurrentFrame++; }
public override void BuildTree(BitStream m) { //Read tag int tag = m.ReadBits(1); //If tag is zero, finish if (tag == 0) return; lowByteTree = new Huffmantree(); lowByteTree.BuildTree(m); highByteTree = new Huffmantree(); highByteTree.BuildTree(m); iMarker1 = m.ReadBits(16); //System.Console.WriteLine("M1:" + iMarker1); iMarker2 = m.ReadBits(16); //System.Console.WriteLine("M2:" + iMarker2); iMarker3 = m.ReadBits(16); //System.Console.WriteLine("M3:" + iMarker3); RootNode = new Node(); BuildTree(m, RootNode); //For some reason we have to skip a bit m.ReadBits(1); if (marker1 == null) { // System.Console.WriteLine("Not using marker 1"); marker1 = new Node(); } if (marker2 == null) { // System.Console.WriteLine("Not using marker 2"); marker2 = new Node(); } if (marker3 == null) { // System.Console.WriteLine("Not using marker 3"); marker3 = new Node(); } }
/// <summary> /// Reads the next frame. /// </summary> public void ReadNextFrame() { uint mask = 1; if (CurrentFrame >= File.Header.NbFrames) { throw new EndOfStreamException("No more frames"); } long currentPos = File.Stream.Position; //If this frame has a palette record if ((File.FrameTypes[CurrentFrame] & mask) > 0) { //Update the palette UpdatePalette(); } //Sound data mask <<= 1; for (int i = 0; i < 7; i++, mask <<= 1) { if ((file.FrameTypes[CurrentFrame] & mask) > 0) { long pos = File.Stream.Position; uint length = Util.ReadDWord(File.Stream); //We assume compression, if not, well too bad uint unpackedLength = Util.ReadDWord(File.Stream); BitStream m = new BitStream(File.Stream); if (m.ReadBits(1) != 0) //Audio present { bool stereo = m.ReadBits(1) > 0; bool is16Bit = m.ReadBits(1) > 0; //Next are some trees uint nbTrees = 1; if (stereo) { nbTrees <<= 1; } if (is16Bit) { nbTrees <<= 1; } Huffmantree[] tree = new Huffmantree[nbTrees]; byte[] audioData = new byte[unpackedLength + 4]; uint audioDataIndex = 0; for (int k = 0; k < nbTrees; k++) { tree[k] = new Huffmantree(); tree[k].BuildTree(m); } int res; if (is16Bit) { Int16 rightBaseMSB = 0, rightBaseLSB = 0, leftBaseMSB = 0, leftBaseLSB = 0; rightBaseMSB = (Int16)(m.ReadBits(8)); rightBaseLSB = (Int16)(m.ReadBits(8)); //Add sample (little endian) audioData[audioDataIndex++] = (byte)rightBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)rightBaseMSB; //Higher byte if (stereo) { leftBaseMSB = (Int16)(m.ReadBits(8)); leftBaseLSB = (Int16)(m.ReadBits(8)); //Add sample (little endian) audioData[audioDataIndex++] = (byte)leftBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)leftBaseMSB; //Higher byte } for (int l = 0; l < unpackedLength / 2; l++) { if ((l & ((stereo) ? 1 : 0)) > 0) { res = tree[2].Decode(m); leftBaseLSB += (Int16)res; res = tree[3].Decode(m); leftBaseMSB += (Int16)res; leftBaseMSB += (Int16)(leftBaseLSB >> 8); leftBaseLSB &= 0xFF; //Add sample (little endian) audioData[audioDataIndex++] = (byte)leftBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)leftBaseMSB; //Higher byte } else { res = tree[0].Decode(m); rightBaseLSB += (Int16)res; res = tree[1].Decode(m); rightBaseMSB += (Int16)res; rightBaseMSB += (Int16)(rightBaseLSB >> 8); rightBaseLSB &= 0xFF; //Add sample (little endian) audioData[audioDataIndex++] = (byte)rightBaseLSB; //Lower byte audioData[audioDataIndex++] = (byte)rightBaseMSB; //Higher byte } } } else { byte rightBase = (byte)m.ReadBits(8), leftBase = 0; //Add sample audioData[audioDataIndex++] = rightBase; if (stereo) { leftBase = (byte)m.ReadBits(8); //Add sample audioData[audioDataIndex++] = leftBase; } for (int l = 0; l < unpackedLength; l++) { if ((l & ((stereo) ? 1 : 0)) > 0) { leftBase += (byte)tree[1].Decode(m); //Add sample audioData[audioDataIndex++] = leftBase; } else { rightBase += (byte)tree[0].Decode(m); //Add sample audioData[audioDataIndex++] = rightBase; } } } lastAudioData[i] = audioData; } File.Stream.Seek(pos + (long)length, SeekOrigin.Begin); } } //Video data try { DecodeVideo(); } catch (IOException exc) { Console.WriteLine("Exception caught while decoding frame:" + exc.ToString()); } //Seek to the next frame File.Stream.Seek(currentPos + File.FrameSizes[CurrentFrame], SeekOrigin.Begin); CurrentFrame++; }