CSharpRTMP.Core.MediaFormats.BaseMediaDocument.SaveSeekFile C# (CSharp) Method

SaveSeekFile() private method

private SaveSeekFile ( ) : bool
return bool
        private bool SaveSeekFile()
        {
            if (_frames.Count <= 2)
            {
                Logger.FATAL("No frames found");
                return false;
            }
            //1. Open the file
            var seekFile= MediaFile.Initialize(_seekFilePath+".tmp",FileMode.Create,FileAccess.Write);
            if (seekFile == null)
            {
                Logger.FATAL("Unable to open seeking file {0}",_seekFilePath);
                return false;
            }
            //2. Setup the bandwidth hint in bytes/second
            var totalSeconds = (_frames[_frames.Count - 1].AbsoluteTime) / 1000.0;
            _streamCapabilities.BandwidthHint =
                    (uint)(MediaFile.Length / totalSeconds / 1024.0 * 8.0);
            var raw = Utils.Rms.GetStream();
            using (var writer = new H2NBinaryWriter(raw))
            {
                if (!_streamCapabilities.Serialize(writer))
                {
                    Logger.FATAL("Unable to serialize stream capabilities");
                    return false;
                }
                seekFile.Bw.Write((uint) raw.Length);
                raw.WriteTo(seekFile.DataStream);
            }
            seekFile.Bw.Write(_frames.Count);
            //3. Write the frames
            var hasVideo = false;
            ulong maxFrameSize = 0;
            foreach (var mediaFrame in _frames)
            {
               
                if (maxFrameSize < mediaFrame.Length) maxFrameSize = mediaFrame.Length;
                hasVideo |= mediaFrame.Type == MediaFrameType.Video;
                seekFile.Bw.Write(mediaFrame.GetBytes());
                //if (seekFile.WriteBuffer(mediaFrame.GetBytes())) continue;
                //Logger.FATAL("Unable to write frame");
                //return false;
            }
            _keyframeSeek &= hasVideo;

            //4. Write the seek granularity
            seekFile.Bw.Write(_seekGranularity);
            //4. create the time to frame index table. First, see what is the total time
            if (_frames.Count >= 1)
            {
                var totalTime = _frames[_frames.Count - 1].AbsoluteTime;

                //5. build the table
                int frameIndex = 0;
                int seekPoint = 0;
                for (double i = 0; i <= totalTime; i += _seekGranularity)
                {
                    while (_frames[frameIndex].AbsoluteTime < i)
                    {
                        frameIndex++;
                        if (frameIndex >= _frames.Count)
                            break;

                        if (_keyframeSeek)
                        {
                            if ((_frames[frameIndex].Type == MediaFrameType.Video)
                                    && (_frames[frameIndex].IsKeyFrame))
                            {
                                seekPoint = frameIndex;
                            }
                        }
                        else
                        {
                            seekPoint = frameIndex;
                        }
                    }
                    if (frameIndex >= _frames.Count) break;
                    seekFile.Bw.Write(seekPoint);
                }
            }
            //6. Save the max frame size
            seekFile.Bw.Write(maxFrameSize);
            seekFile.Bw.Dispose();
            //7. Done
            return true;
        }
        private bool SaveMetaFile()