Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }