Matroska-Solution / Matroska / Extensions / EbmlReaderExtensions.cs
Code · 59 lines · 1609 bytes
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
59using System.Globalization;
using NEbml.Core;

namespace Matroska.Extensions;

internal static class EbmlReaderExtensions
{
	public static bool LocateElement(this EbmlReader reader, ElementDescriptor descriptor)
	{
		return reader.LocateElement(descriptor.Identifier.EncodedValue);
	}

	public static bool LocateElement(this EbmlReader reader, ulong identifier)
	{
		while (reader.ReadNext())
		{
			if (reader.ElementId == identifier)
			{
				return true;
			}
		}

		return false;
	}

	public static bool IsKnownMasterElement(this EbmlReader reader)
	{
		return MatroskaSpecification.ElementDescriptors.TryGetValue(reader.ElementId, out var descriptor) && descriptor.Type == ElementType.MasterElement;
	}

	public static string GetName(this EbmlReader r, bool dumpValue = false)
	{
		var name = "?";
		var dump = "?";

		if (MatroskaSpecification.ElementDescriptors.TryGetValue(r.ElementId, out var el))
		{
			name = el.Name;

			if (dumpValue)
			{
				dump = el.Type switch
				{
					ElementType.AsciiString => r.ReadAscii(),
					ElementType.Binary => "'Binary Data'",
					ElementType.Date => r.ReadDate().ToString(CultureInfo.CurrentCulture),
					ElementType.Float => r.ReadFloat().ToString(CultureInfo.CurrentCulture),
					ElementType.SignedInteger => r.ReadInt().ToString(),
					ElementType.UnsignedInteger => r.ReadUInt().ToString(),
					ElementType.Utf8String => r.ReadUtf(),
					ElementType.MasterElement => "'MasterElement'",
					_ => $"unknown (id:{r})"
				};
			}
		}

		return $"0x{r.ElementId.Value:X8} {name} [{r.ElementSize} bytes]" + (dumpValue ? " Value: " + dump : "");
	}
}