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()