private void CalculateBitrate(Stream stream, CInterestedFrames InterestedFrames) { int totalTagSize = ID3v2.GetTagSize(stream); totalTagSize += ID3v1.GetTagSize(stream); totalTagSize += APEv2.GetTagSize(stream); Int64 audioLength = stream.Length - totalTagSize; _bitrate = 0; _isVBR = null; _frames = 0; _totalSeconds = 0; String step = ""; try { int BR, Padding; int FrameSize; int TotalBR = 0; int FrameOffset = 0; //Int64 TagOffset = 0; bool bTrusting = true; bool ignoreall = false; Byte[] FH = new Byte[4]; bool mPerfect = true; stream.Position = _headerOffset; // if (_headerOffset > 0) // { // TagOffset = _headerOffset; // } int offset = 0; int frameCount = 0; int FirstBR = 0; int audioDataSize = (int)(stream.Length - _headerOffset); Byte[] audioData = new Byte[audioDataSize]; //Int64 startoffset = stream.Position; int BufLen = stream.Read(audioData, 0, audioDataSize); while (offset < BufLen - 16 && !ignoreall) { bool reservedlayer = false; // Find FrameSync if (FindFrameSync(FH, audioData, BufLen, ref FrameOffset, ref offset, ref mPerfect, ref ignoreall, ref bTrusting, ref reservedlayer)) { FrameOffset = 0; int bitrateIndex = FH[2] >> 4; if (bitrateIndex <= 0 || bitrateIndex >= 15) { offset -= 3; continue; } Padding = (FH[2] >> 1) & 0x01; BR = GetBitrate(_mpegVersion, _mpegLayer, bitrateIndex); if (BR == 0 || BR % 8 != 0) { offset -= 3; continue; } //step = "last good frame @ " + String(startoffset + offset - 4) + ", frame " + // String(_frames + 1); // todo: put back later /*if (InterestedFrames != NULL) { if (((_frames + 1) * _samplesperframe / (float)_Frequency) * 75.0 >= InterestedFrames->CurrentFrame()) { if (_frames == 0 || InterestedFrames->NoAccomodation) { InterestedFrames->SetCurrentByteOffset(startoffset + offset - 4); InterestedFrames->SetCurrentFrameOffset(_frames); } InterestedFrames->SetCurrentByteEndOffset(startoffset + offset - 4); InterestedFrames->Cur += 1; } else { InterestedFrames->SetCurrentByteOffset(startoffset + offset - 4); InterestedFrames->SetCurrentFrameOffset(_frames); } }*/ if (_isVBR != true) { if (TotalBR == 0) { FirstBR = BR; } else if (BR != FirstBR) { _isVBR = true; } } TotalBR += BR; FrameSize = (int)(BR * _frameSizeConst + Padding * _paddingSizeConst); offset += FrameSize - 4; frameCount++; } }// end while if (frameCount == 0) { throw new InvalidDataException(String.Format("No frames found in {0}", _fileName)); } _frames = frameCount; if (_isVBR == null) { _bitrate = FirstBR; _isVBR = false; } else { _bitrate = TotalBR / _frames; } if (_bitrate == 0) { throw new InvalidDataException(String.Format("Error determining bitrate: {0}", _fileName)); } _totalSeconds = (audioLength / 125.0m) / _bitrate; } catch (Exception ex) { throw new Exception(String.Format("Error calculating bitrate; {0}", step), ex); } }
private void CalculateBitrate(Stream stream, CInterestedFrames InterestedFrames) { int totalTagSize = ID3v2.GetTagSize(stream); totalTagSize += ID3v1.GetTagSize(stream); totalTagSize += APEv2.GetTagSize(stream); Int64 audioLength = stream.Length - totalTagSize; _bitrate = 0; _isVBR = null; _frames = 0; _totalSeconds = 0; String step = ""; try { int BR, Padding; int FrameSize; int TotalBR = 0; int FrameOffset = 0; //Int64 TagOffset = 0; bool bTrusting = true; bool ignoreall = false; Byte[] FH = new Byte[4]; bool mPerfect = true; stream.Position = _headerOffset; // if (_headerOffset > 0) // { // TagOffset = _headerOffset; // } int offset = 0; int frameCount = 0; int FirstBR = 0; int audioDataSize = (int)(stream.Length - _headerOffset); Byte[] audioData = new Byte[audioDataSize]; //Int64 startoffset = stream.Position; int BufLen = stream.Read(audioData, 0, audioDataSize); while (offset < BufLen - 16 && !ignoreall) { bool reservedlayer = false; // Find FrameSync if (FindFrameSync(FH, audioData, BufLen, ref FrameOffset, ref offset, ref mPerfect, ref ignoreall, ref bTrusting, ref reservedlayer)) { FrameOffset = 0; int bitrateIndex = FH[2] >> 4; if (bitrateIndex <= 0 || bitrateIndex >= 15) { offset -= 3; continue; } Padding = (FH[2] >> 1) & 0x01; BR = GetBitrate(_mpegVersion, _mpegLayer, bitrateIndex); if (BR == 0 || BR % 8 != 0) { offset -= 3; continue; } //step = "last good frame @ " + String(startoffset + offset - 4) + ", frame " + // String(_frames + 1); // todo: put back later /*if (InterestedFrames != NULL) * { * if (((_frames + 1) * _samplesperframe / (float)_Frequency) * 75.0 >= InterestedFrames->CurrentFrame()) * { * if (_frames == 0 || InterestedFrames->NoAccomodation) * { * InterestedFrames->SetCurrentByteOffset(startoffset + offset - 4); * InterestedFrames->SetCurrentFrameOffset(_frames); * } * InterestedFrames->SetCurrentByteEndOffset(startoffset + offset - 4); * InterestedFrames->Cur += 1; * } * else * { * InterestedFrames->SetCurrentByteOffset(startoffset + offset - 4); * InterestedFrames->SetCurrentFrameOffset(_frames); * } * }*/ if (_isVBR != true) { if (TotalBR == 0) { FirstBR = BR; } else if (BR != FirstBR) { _isVBR = true; } } TotalBR += BR; FrameSize = (int)(BR * _frameSizeConst + Padding * _paddingSizeConst); offset += FrameSize - 4; frameCount++; } }// end while if (frameCount == 0) { throw new InvalidDataException(String.Format("No frames found in {0}", _fileName)); } _frames = frameCount; if (_isVBR == null) { _bitrate = FirstBR; _isVBR = false; } else { _bitrate = TotalBR / _frames; } if (_bitrate == 0) { throw new InvalidDataException(String.Format("Error determining bitrate: {0}", _fileName)); } _totalSeconds = (audioLength / 125.0m) / _bitrate; } catch (Exception ex) { throw new Exception(String.Format("Error calculating bitrate; {0}", step), ex); } }