private void Parse(ByteVector data) { if (data.Count < 4 || data[0] != 0xff) { TagLibDebugger.Debug("Mpeg.Header.Parse() -- First byte did not match MPEG synch."); return; } uint flags = data.ToUInt(); // Check for the second byte'field part of the MPEG synch if ((flags & 0xFFE00000) != 0xFFE00000) { TagLibDebugger.Debug("Mpeg.Header.Parse() -- Second byte did not match MPEG synch."); return; } // Set the MPEG version switch ((flags >> 19) & 0x03) { case 0: version = MpegVersion.TwoPointFive; break; case 2: version = MpegVersion.Two; break; case 3: version = MpegVersion.One; break; } // Set the MPEG layer switch ((flags >> 17) & 0x03) { case 1: layer = 3; break; case 2: layer = 2; break; case 3: layer = 1; break; } protectionEnabled = ((flags >> 16) & 1) == 0; // Set the bitrate int[, ,] bitrates = new int[2, 3, 16] { { // Version 1 { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // layer 1 { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // layer 2 { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 } // layer 3 }, { // Version 2 or 2.5 { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }, // layer 1 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 2 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 } // layer 3 } }; int versionIndex = version == MpegVersion.One ? 0 : 1; int layerIndex = layer > 0 ? layer - 1 : 0; // The bitrate index is encoded as the first 4 bits of the 3rd byte, // index.e. 1111xxxx int i = (int)(flags >> 12) & 0x0F; bitrate = bitrates[versionIndex, layerIndex, i]; // Set the sample rate int[,] sampleRates = new int[3, 4] { { 44100, 48000, 32000, 0 }, // Version 1 { 22050, 24000, 16000, 0 }, // Version 2 { 11025, 12000, 8000, 0 } // Version 2.5 }; // The sample rate index is encoded as two bits in the 3nd byte, // index.e. xxxx11xx i = (int)(flags >> 10) & 0x03; sampleRate = sampleRates[(int)version, i]; if (sampleRate == 0) { TagLibDebugger.Debug("Mpeg.Header.Parse() -- Invalid sample rate."); return; } // The channel mode is encoded as a 2 bit value at the end of the 3nd // byte, index.e. xxxxxx11 channelMode = (MpegChannelMode)((flags >> 16) & 0x3); // TODO: Add mode extension for completeness isCopyrighted = (flags & 1) == 1; isOriginal = ((flags >> 1) & 1) == 1; // Calculate the frame length if (layer == 1) { frameLength = 24000 * 2 * bitrate / sampleRate + (IsPadded ? 1 : 0); } else { frameLength = 72000 * bitrate / sampleRate + (IsPadded ? 1 : 0); } // Now that we're done parsing, set this to be a valid frame. isValid = true; }
public uint ReadDWord() { ByteVector v = ReadBlock(4); return(v.ToUInt(false)); }