public void Seek(TimeSpan when) { lock ( LoadPacketBuffer ) { while (LoadPacketBuffer.Count > 0) { var apr = LoadPacketBuffer.Dequeue(); Keyframes += apr.Count(ap => ap.IsKeyframe); Packets.AddRange(apr); } } if (Packets.Count <= 0) { return; } DumpChunksAround(when); var i = BinarySearchIndexBefore(Packets, ap => ap.SinceStart >= when); if (i == -1) { i = 0; } Debug.Assert(Packets[i].DecodedCache != null); CurrentFrame.SinceStart = Packets[i].SinceStart; CurrentFrame.Data = Packets[i].DecodedCache; }
public void Dispose() { // n.b. Resize uses this -- we may need to refactor if we need to do something permanent LoadCancel = true; LoadThread.Join(); foreach (var ap in Packets) { using (ap.RestartPosition) {} } Packets.Clear(); Debug.Assert(!LoadThread.IsAlive); // We assert this... LoadPacketBuffer.Clear(); // ... because we're not locking this. }