private unsafe List<FlacFrameInformation> ScanThisShit(FlacMetadataStreamInfo streamInfo) { Stream stream = _stream; //if (!(stream is BufferedStream)) // stream = new BufferedStream(stream); byte[] buffer = new byte[BufferSize]; stream.Position = 4; //fLaC //skip the metadata FlacMetadata.SkipMetadata(stream); List<FlacFrameInformation> frames = new List<FlacFrameInformation>(); FlacFrameInformation frameInfo = new FlacFrameInformation(); frameInfo.IsFirstFrame = true; FlacFrameHeader baseHeader = null; while (true) { int read = stream.Read(buffer, 0, buffer.Length); if (read <= FlacConstant.FrameHeaderSize) break; fixed (byte* bufferPtr = buffer) { byte* ptr = bufferPtr; //for (int i = 0; i < read - FlacConstant.FrameHeaderSize; i++) while ((bufferPtr + read - FlacConstant.FrameHeaderSize) > ptr) { if (*ptr++ == 0xFF && (*ptr & 0xF8) == 0xF8) //check sync { byte* ptrSafe = ptr; ptr--; FlacFrameHeader tmp; if (IsFrame(ref ptr, streamInfo, out tmp)) { FlacFrameHeader header = tmp; if (frameInfo.IsFirstFrame) { baseHeader = header; frameInfo.IsFirstFrame = false; } if (baseHeader != null && baseHeader.IsFormatEqualTo(header)) { frameInfo.StreamOffset = stream.Position - read + ((ptrSafe - 1) - bufferPtr); frameInfo.Header = header; frames.Add(frameInfo); frameInfo.SampleOffset += header.BlockSize; } else { ptr = ptrSafe; } } else { ptr = ptrSafe; } } } } stream.Position -= FlacConstant.FrameHeaderSize; } return frames; }
private unsafe List<FlacFrameInformation> ScanThisShit(FlacMetadataStreamInfo streamInfo) { Stream stream = _stream; //if (!(stream is BufferedStream)) // stream = new BufferedStream(stream); byte[] buffer = new byte[bufferSize]; int read = 0; stream.Position = 4; //fLaC FlacMetadata.AllDataFromStream(stream); List<FlacFrameInformation> frames = new List<FlacFrameInformation>(); FlacFrameInformation frameInfo = new FlacFrameInformation(); frameInfo.IsFirstFrame = true; FlacFrameHeader header; FlacFrameHeader tmp = null; FlacFrameHeader baseHeader = null; while (true) { read = stream.Read(buffer, 0, buffer.Length); if (read <= FlacConstant.FrameHeaderSize) break; fixed (byte* bufferPtr = buffer) { byte* ptr = bufferPtr; byte* ptrSafe; //for (int i = 0; i < read - FlacConstant.FrameHeaderSize; i++) while ((bufferPtr + read - FlacConstant.FrameHeaderSize) > ptr) { if ((*ptr++ & 0xFF) == 0xFF && (*ptr & 0xF8) == 0xF8) //check sync { ptrSafe = ptr; ptr--; if (IsFrame(ref ptr, streamInfo, baseHeader, out tmp)) { header = tmp; if (frameInfo.IsFirstFrame) { baseHeader = header; frameInfo.IsFirstFrame = false; } if (baseHeader.CompareTo(header)) { frameInfo.StreamOffset = stream.Position - read + ((ptrSafe - 1) - bufferPtr); frameInfo.Header = header; frames.Add(frameInfo); frameInfo.SampleOffset += header.BlockSize; } else { ptr = ptrSafe; } //todo: } else { ptr = ptrSafe; } } } } stream.Position -= FlacConstant.FrameHeaderSize; } return frames; }