protected unsafe virtual bool ParseHeader(ref byte* headerBuffer, FlacMetadataStreamInfo streamInfo) { const string loggerLocation = "FlacFrameHeader.ParseHeader(byte*, FlacMetadataStreamInfo)"; int x = -1; //tmp value to store in if (headerBuffer[0] == 0xFF && headerBuffer[1] >> 1 == 0x7C) //sync bits { if ((headerBuffer[1] & 0x02) != 0) // ...10 2. letzes bits muss 0 sein { Error("Invalid FlacFrame. Reservedbit_0 is 1", loggerLocation); return false; } byte* __headerbufferPtr = headerBuffer; FlacBitReader reader = new FlacBitReader(__headerbufferPtr, 0); #region blocksize //blocksize x = headerBuffer[2] >> 4; int blocksize = -1; if (x == 0) { Error("Invalid Blocksize value: 0", loggerLocation); return false; } else if (x == 1) blocksize = 192; else if (x >= 2 && x <= 5) blocksize = 576 << (x - 2); else if (x == 6 || x == 7) blocksize_hint = x; else if (x >= 8 && x <= 15) blocksize = 256 << (x - 8); else { Error("Invalid Blocksize value: " + x, loggerLocation); return false; } BlockSize = blocksize; #endregion blocksize #region samplerate //samplerate x = headerBuffer[2] & 0x0F; int sampleRate = -1; if (x == 0) { if (streamInfo != null) sampleRate = streamInfo.SampleRate; else { Error("Missing Samplerate. Samplerate Index = 0 && streamInfoMetaData == null.", loggerLocation); return false; } } else if (x >= 1 && x <= 11) sampleRate = FlacConstant.SampleRateTable[x]; else if (x >= 12 && x <= 14) sampleRate_hint = x; else { Error("Invalid SampleRate value: " + x, loggerLocation); return false; } SampleRate = sampleRate; #endregion samplerate #region channels x = headerBuffer[3] >> 4; //cc: unsigned int channels = -1; if ((x & 8) != 0) { channels = 2; if ((x & 7) > 2 || (x & 7) < 0) { Error("Invalid ChannelAssignment", loggerLocation); return false; } else ChannelAssignment = (ChannelAssignment)((x & 7) + 1); } else { channels = x + 1; ChannelAssignment = ChannelAssignment.Independent; } Channels = channels; #endregion channels #region bitspersample x = (headerBuffer[3] & 0x0E) >> 1; int bitsPerSample = -1; if (x == 0) { if (streamInfo != null) bitsPerSample = streamInfo.BitsPerSample; else { Error("Missing BitsPerSample. Index = 0 && streamInfoMetaData == null.", loggerLocation); return false; } } else if (x == 3 || x >= 7 || x < 0) { Error("Invalid BitsPerSampleIndex", loggerLocation); return false; } else bitsPerSample = FlacConstant.BitPerSampleTable[x]; BitsPerSample = bitsPerSample; #endregion bitspersample if ((headerBuffer[3] & 0x01) != 0) // reserved bit -> 0 { Error("Invalid FlacFrame. Reservedbit_1 is 1", loggerLocation); return false; } //reader.SkipBits(4 * 8); //erste 3 bytes headerbytes überspringen, da diese schon ohne reader verarbeitet reader.ReadBits(32); //BYTE 4 #region utf8 //variable blocksize if ((headerBuffer[1] & 0x01) != 0 || (streamInfo != null && streamInfo.MinBlockSize != streamInfo.MaxBlockSize)) { ulong samplenumber; if (reader.ReadUTF8_64(out samplenumber) && samplenumber != ulong.MaxValue) { NumberType = FlacNumberType.SampleNumber; SampleNumber = samplenumber; } else { Error("Invalid UTF8 Samplenumber coding.", loggerLocation); return false; } } else //fixed blocksize { uint framenumber;// = reader.ReadUTF8(); if (reader.ReadUTF8_32(out framenumber) && framenumber != uint.MaxValue) { NumberType = FlacNumberType.FrameNumber; FrameNumber = framenumber; } else { Error("Invalid UTF8 Framenumber coding.", loggerLocation); return false; } } #endregion utf8 #region read hints //blocksize am ende des frameheaders if (blocksize_hint != 0) { x = (int)reader.ReadBits(8); if (blocksize_hint == 7) { x = (x << 8) | (int)reader.ReadBits(8); } BlockSize = x + 1; } //samplerate am ende des frameheaders if (sampleRate_hint != 0) { x = (int)reader.ReadBits(8); if (sampleRate_hint != 12) { x = (x << 8) | (int)reader.ReadBits(8); } if (sampleRate_hint == 12) SampleRate = x * 1000; else if (sampleRate_hint == 13) SampleRate = x; else SampleRate = x * 10; } #endregion read hints //if (Channels == 1 && BitsPerSample == 24 && SampleRate == 44100) // System.Diagnostics.Debugger.Break(); if (DoCRC) { var crc8 = CSMath.CRC8.Instance.CalcCheckSum(reader.Buffer, 0, reader.Position); CRC8 = (byte)reader.ReadBits(8); if (CRC8 != crc8) { Error("CRC8 missmatch", loggerLocation); return false; } } headerBuffer += reader.Position; return true; } Error("Invalid Syncbits", loggerLocation); return false; }
private unsafe bool ParseHeader(ref byte *headerBuffer, FlacMetadataStreamInfo streamInfo) { const string loggerLocation = "FlacFrameHeader.ParseHeader(byte*, FlacMetadataStreamInfo)"; int val; if (headerBuffer[0] == 0xFF && headerBuffer[1] >> 1 == 0x7C) //sync bits { if ((headerBuffer[1] & 0x02) != 0) { Error("Invalid FlacFrame. Reservedbit_0 is 1", loggerLocation); return(false); } byte * __headerbufferPtr = headerBuffer; FlacBitReader reader = new FlacBitReader(__headerbufferPtr, 0); #region blocksize //blocksize val = headerBuffer[2] >> 4; int blocksize = -1; if (val == 0) { Error("Invalid Blocksize value: 0", loggerLocation); return(false); } if (val == 1) { blocksize = 192; } else if (val >= 2 && val <= 5) { blocksize = 576 << (val - 2); } else if (val == 6 || val == 7) { _blocksizeHint = val; } else if (val >= 8 && val <= 15) { blocksize = 256 << (val - 8); } else { Error("Invalid Blocksize value: " + val, loggerLocation); return(false); } BlockSize = blocksize; #endregion blocksize #region samplerate //samplerate val = headerBuffer[2] & 0x0F; int sampleRate = -1; if (val == 0) { if (streamInfo != null) { sampleRate = streamInfo.SampleRate; } else { Error("Missing Samplerate. Samplerate Index = 0 && streamInfoMetaData == null.", loggerLocation); return(false); } } else if (val >= 1 && val <= 11) { sampleRate = FlacConstant.SampleRateTable[val]; } else if (val >= 12 && val <= 14) { _sampleRateHint = val; } else { Error("Invalid SampleRate value: " + val, loggerLocation); return(false); } SampleRate = sampleRate; #endregion samplerate #region channels val = headerBuffer[3] >> 4; //cc: unsigned int channels; if ((val & 8) != 0) { channels = 2; if ((val & 7) > 2 || (val & 7) < 0) { Error("Invalid ChannelAssignment", loggerLocation); return(false); } ChannelAssignment = (ChannelAssignment)((val & 7) + 1); } else { channels = val + 1; ChannelAssignment = ChannelAssignment.Independent; } Channels = channels; #endregion channels #region bitspersample val = (headerBuffer[3] & 0x0E) >> 1; int bitsPerSample; if (val == 0) { if (streamInfo != null) { bitsPerSample = streamInfo.BitsPerSample; } else { Error("Missing BitsPerSample. Index = 0 && streamInfoMetaData == null.", loggerLocation); return(false); } } else if (val == 3 || val >= 7 || val < 0) { Error("Invalid BitsPerSampleIndex", loggerLocation); return(false); } else { bitsPerSample = FlacConstant.BitPerSampleTable[val]; } BitsPerSample = bitsPerSample; #endregion bitspersample if ((headerBuffer[3] & 0x01) != 0) // reserved bit -> 0 { Error("Invalid FlacFrame. Reservedbit_1 is 1", loggerLocation); return(false); } reader.ReadBits(32); //skip the first 4 bytes since they got already processed //BYTE 4 #region utf8 //variable blocksize if ((headerBuffer[1] & 0x01) != 0 || (streamInfo != null && streamInfo.MinBlockSize != streamInfo.MaxBlockSize)) { ulong samplenumber; if (reader.ReadUTF8_64(out samplenumber) && samplenumber != ulong.MaxValue) { BlockingStrategy = BlockingStrategy.VariableBlockSize; SampleNumber = (long)samplenumber; } else { Error("Invalid UTF8 Samplenumber coding.", loggerLocation); return(false); } } else //fixed blocksize { uint framenumber; if (reader.ReadUTF8_32(out framenumber) && framenumber != uint.MaxValue) { BlockingStrategy = BlockingStrategy.FixedBlockSize; FrameNumber = (int)framenumber; } else { Error("Invalid UTF8 Framenumber coding.", loggerLocation); return(false); } } #endregion utf8 #region read hints //blocksize am ende des frameheaders if (_blocksizeHint != 0) { val = (int)reader.ReadBits(8); if (_blocksizeHint == 7) { val = (val << 8) | (int)reader.ReadBits(8); } BlockSize = val + 1; } //samplerate if (_sampleRateHint != 0) { val = (int)reader.ReadBits(8); if (_sampleRateHint != 12) { val = (val << 8) | (int)reader.ReadBits(8); } if (_sampleRateHint == 12) { SampleRate = val * 1000; } else if (_sampleRateHint == 13) { SampleRate = val; } else { SampleRate = val * 10; } } #endregion read hints if (DoCrc) { var crc8 = Utils.CRC8.Instance.CalcCheckSum(reader.Buffer, 0, reader.Position); Crc8 = (byte)reader.ReadBits(8); if (Crc8 != crc8) { Error("CRC8 missmatch", loggerLocation); return(false); } } else { Crc8 = (byte)reader.ReadBits(8); } headerBuffer += reader.Position; return(true); } Error("Invalid Syncbits", loggerLocation); return(false); }
private unsafe bool ParseHeader(ref byte* headerBuffer, FlacMetadataStreamInfo streamInfo) { const string loggerLocation = "FlacFrameHeader.ParseHeader(byte*, FlacMetadataStreamInfo)"; int val; if (headerBuffer[0] == 0xFF && headerBuffer[1] >> 1 == 0x7C) //sync bits { if ((headerBuffer[1] & 0x02) != 0) { Error("Invalid FlacFrame. Reservedbit_0 is 1", loggerLocation); return false; } byte* __headerbufferPtr = headerBuffer; FlacBitReader reader = new FlacBitReader(__headerbufferPtr, 0); #region blocksize //blocksize val = headerBuffer[2] >> 4; int blocksize = -1; if (val == 0) { Error("Invalid Blocksize value: 0", loggerLocation); return false; } if (val == 1) blocksize = 192; else if (val >= 2 && val <= 5) blocksize = 576 << (val - 2); else if (val == 6 || val == 7) _blocksizeHint = val; else if (val >= 8 && val <= 15) blocksize = 256 << (val - 8); else { Error("Invalid Blocksize value: " + val, loggerLocation); return false; } BlockSize = blocksize; #endregion blocksize #region samplerate //samplerate val = headerBuffer[2] & 0x0F; int sampleRate = -1; if (val == 0) { if (streamInfo != null) sampleRate = streamInfo.SampleRate; else { Error("Missing Samplerate. Samplerate Index = 0 && streamInfoMetaData == null.", loggerLocation); return false; } } else if (val >= 1 && val <= 11) sampleRate = FlacConstant.SampleRateTable[val]; else if (val >= 12 && val <= 14) _sampleRateHint = val; else { Error("Invalid SampleRate value: " + val, loggerLocation); return false; } SampleRate = sampleRate; #endregion samplerate #region channels val = headerBuffer[3] >> 4; //cc: unsigned int channels; if ((val & 8) != 0) { channels = 2; if ((val & 7) > 2 || (val & 7) < 0) { Error("Invalid ChannelAssignment", loggerLocation); return false; } ChannelAssignment = (ChannelAssignment)((val & 7) + 1); } else { channels = val + 1; ChannelAssignment = ChannelAssignment.Independent; } Channels = channels; #endregion channels #region bitspersample val = (headerBuffer[3] & 0x0E) >> 1; int bitsPerSample; if (val == 0) { if (streamInfo != null) bitsPerSample = streamInfo.BitsPerSample; else { Error("Missing BitsPerSample. Index = 0 && streamInfoMetaData == null.", loggerLocation); return false; } } else if (val == 3 || val >= 7 || val < 0) { Error("Invalid BitsPerSampleIndex", loggerLocation); return false; } else bitsPerSample = FlacConstant.BitPerSampleTable[val]; BitsPerSample = bitsPerSample; #endregion bitspersample if ((headerBuffer[3] & 0x01) != 0) // reserved bit -> 0 { Error("Invalid FlacFrame. Reservedbit_1 is 1", loggerLocation); return false; } reader.ReadBits(32); //skip the first 4 bytes since they got already processed //BYTE 4 #region utf8 //variable blocksize if ((headerBuffer[1] & 0x01) != 0 || (streamInfo != null && streamInfo.MinBlockSize != streamInfo.MaxBlockSize)) { ulong samplenumber; if (reader.ReadUTF8_64(out samplenumber) && samplenumber != ulong.MaxValue) { BlockingStrategy = BlockingStrategy.VariableBlockSize; SampleNumber = (long) samplenumber; } else { Error("Invalid UTF8 Samplenumber coding.", loggerLocation); return false; } } else //fixed blocksize { uint framenumber; if (reader.ReadUTF8_32(out framenumber) && framenumber != uint.MaxValue) { BlockingStrategy = BlockingStrategy.FixedBlockSize; FrameNumber = (int) framenumber; } else { Error("Invalid UTF8 Framenumber coding.", loggerLocation); return false; } } #endregion utf8 #region read hints //blocksize am ende des frameheaders if (_blocksizeHint != 0) { val = (int)reader.ReadBits(8); if (_blocksizeHint == 7) { val = (val << 8) | (int)reader.ReadBits(8); } BlockSize = val + 1; } //samplerate if (_sampleRateHint != 0) { val = (int)reader.ReadBits(8); if (_sampleRateHint != 12) { val = (val << 8) | (int)reader.ReadBits(8); } if (_sampleRateHint == 12) SampleRate = val * 1000; else if (_sampleRateHint == 13) SampleRate = val; else SampleRate = val * 10; } #endregion read hints if (DoCrc) { var crc8 = Utils.CRC8.Instance.CalcCheckSum(reader.Buffer, 0, reader.Position); Crc8 = (byte) reader.ReadBits(8); if (Crc8 != crc8) { Error("CRC8 missmatch", loggerLocation); return false; } } else { Crc8 = (byte) reader.ReadBits(8); } headerBuffer += reader.Position; return true; } Error("Invalid Syncbits", loggerLocation); return false; }
protected unsafe virtual bool ParseHeader(ref byte *headerBuffer, FlacMetadataStreamInfo streamInfo) { const string loggerLocation = "FlacFrameHeader.ParseHeader(byte*, FlacMetadataStreamInfo)"; int x = -1; //tmp value to store in if (headerBuffer[0] == 0xFF && headerBuffer[1] >> 1 == 0x7C) //sync bits { if ((headerBuffer[1] & 0x02) != 0) // ...10 2. letzes bits muss 0 sein { Error("Invalid FlacFrame. Reservedbit_0 is 1", loggerLocation); return(false); } byte * __headerbufferPtr = headerBuffer; FlacBitReader reader = new FlacBitReader(__headerbufferPtr, 0); #region blocksize //blocksize x = headerBuffer[2] >> 4; int blocksize = -1; if (x == 0) { Error("Invalid Blocksize value: 0", loggerLocation); return(false); } else if (x == 1) { blocksize = 192; } else if (x >= 2 && x <= 5) { blocksize = 576 << (x - 2); } else if (x == 6 || x == 7) { blocksize_hint = x; } else if (x >= 8 && x <= 15) { blocksize = 256 << (x - 8); } else { Error("Invalid Blocksize value: " + x, loggerLocation); return(false); } BlockSize = blocksize; #endregion blocksize #region samplerate //samplerate x = headerBuffer[2] & 0x0F; int sampleRate = -1; if (x == 0) { if (streamInfo != null) { sampleRate = streamInfo.SampleRate; } else { Error("Missing Samplerate. Samplerate Index = 0 && streamInfoMetaData == null.", loggerLocation); return(false); } } else if (x >= 1 && x <= 11) { sampleRate = FlacConstant.SampleRateTable[x]; } else if (x >= 12 && x <= 14) { sampleRate_hint = x; } else { Error("Invalid SampleRate value: " + x, loggerLocation); return(false); } SampleRate = sampleRate; #endregion samplerate #region channels x = headerBuffer[3] >> 4; //cc: unsigned int channels = -1; if ((x & 8) != 0) { channels = 2; if ((x & 7) > 2 || (x & 7) < 0) { Error("Invalid ChannelAssignment", loggerLocation); return(false); } else { ChannelAssignment = (ChannelAssignment)((x & 7) + 1); } } else { channels = x + 1; ChannelAssignment = ChannelAssignment.Independent; } Channels = channels; #endregion channels #region bitspersample x = (headerBuffer[3] & 0x0E) >> 1; int bitsPerSample = -1; if (x == 0) { if (streamInfo != null) { bitsPerSample = streamInfo.BitsPerSample; } else { Error("Missing BitsPerSample. Index = 0 && streamInfoMetaData == null.", loggerLocation); return(false); } } else if (x == 3 || x >= 7 || x < 0) { Error("Invalid BitsPerSampleIndex", loggerLocation); return(false); } else { bitsPerSample = FlacConstant.BitPerSampleTable[x]; } BitsPerSample = bitsPerSample; #endregion bitspersample if ((headerBuffer[3] & 0x01) != 0) // reserved bit -> 0 { Error("Invalid FlacFrame. Reservedbit_1 is 1", loggerLocation); return(false); } //reader.SkipBits(4 * 8); //erste 3 bytes headerbytes überspringen, da diese schon ohne reader verarbeitet reader.ReadBits(32); //BYTE 4 #region utf8 //variable blocksize if ((headerBuffer[1] & 0x01) != 0 || (streamInfo != null && streamInfo.MinBlockSize != streamInfo.MaxBlockSize)) { ulong samplenumber; if (reader.ReadUTF8_64(out samplenumber) && samplenumber != ulong.MaxValue) { NumberType = FlacNumberType.SampleNumber; SampleNumber = samplenumber; } else { Error("Invalid UTF8 Samplenumber coding.", loggerLocation); return(false); } } else //fixed blocksize { uint framenumber;// = reader.ReadUTF8(); if (reader.ReadUTF8_32(out framenumber) && framenumber != uint.MaxValue) { NumberType = FlacNumberType.FrameNumber; FrameNumber = framenumber; } else { Error("Invalid UTF8 Framenumber coding.", loggerLocation); return(false); } } #endregion utf8 #region read hints //blocksize am ende des frameheaders if (blocksize_hint != 0) { x = (int)reader.ReadBits(8); if (blocksize_hint == 7) { x = (x << 8) | (int)reader.ReadBits(8); } BlockSize = x + 1; } //samplerate am ende des frameheaders if (sampleRate_hint != 0) { x = (int)reader.ReadBits(8); if (sampleRate_hint != 12) { x = (x << 8) | (int)reader.ReadBits(8); } if (sampleRate_hint == 12) { SampleRate = x * 1000; } else if (sampleRate_hint == 13) { SampleRate = x; } else { SampleRate = x * 10; } } #endregion read hints //if (Channels == 1 && BitsPerSample == 24 && SampleRate == 44100) // System.Diagnostics.Debugger.Break(); if (DoCRC) { var crc8 = CSMath.CRC8.Instance.CalcCheckSum(reader.Buffer, 0, reader.Position); CRC8 = (byte)reader.ReadBits(8); if (CRC8 != crc8) { Error("CRC8 missmatch", loggerLocation); return(false); } } headerBuffer += reader.Position; return(true); } Error("Invalid Syncbits", loggerLocation); return(false); }