-
Notifications
You must be signed in to change notification settings - Fork 35
/
ForwardOnlyPageReader.cs
64 lines (57 loc) · 2.31 KB
/
ForwardOnlyPageReader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using NVorbis.Contracts.Ogg;
using System;
using System.Collections.Generic;
using System.IO;
namespace NVorbis.Ogg
{
class ForwardOnlyPageReader : PageReaderBase
{
internal static Func<IPageReader, int, IForwardOnlyPacketProvider> CreatePacketProvider { get; set; } = (pr, ss) => new ForwardOnlyPacketProvider(pr, ss);
private readonly Dictionary<int, IForwardOnlyPacketProvider> _packetProviders = new Dictionary<int, IForwardOnlyPacketProvider>();
private readonly Func<Contracts.IPacketProvider, bool> _newStreamCallback;
public ForwardOnlyPageReader(Stream stream, bool closeOnDispose, Func<Contracts.IPacketProvider, bool> newStreamCallback)
: base(stream, closeOnDispose)
{
_newStreamCallback = newStreamCallback;
}
protected override bool AddPage(int streamSerial, byte[] pageBuf, bool isResync)
{
if (_packetProviders.TryGetValue(streamSerial, out var pp))
{
// try to add the page...
if (pp.AddPage(pageBuf, isResync))
{
// ..., then make sure we're not flagged as the end of the stream...
if (((PageFlags)pageBuf[5] & PageFlags.EndOfStream) == 0)
{
// ... in which case we say we're good.
return true;
}
}
// otherwise, remove the stream from our list and fall through to:
_packetProviders.Remove(streamSerial);
}
// try to add the stream to the list.
pp = CreatePacketProvider(this, streamSerial);
if (pp.AddPage(pageBuf, isResync))
{
_packetProviders.Add(streamSerial, pp);
if (_newStreamCallback(pp))
{
return true;
}
_packetProviders.Remove(streamSerial);
}
return false;
}
protected override void SetEndOfStreams()
{
foreach (var kvp in _packetProviders)
{
kvp.Value.SetEndOfStream();
}
_packetProviders.Clear();
}
public override bool ReadPageAt(long offset) => throw new NotSupportedException();
}
}