private IEnumerable <RiffElement> GetChildren(List <byte> bytes) { var result = new List <RiffElement>(); for (int i = 0; i < bytes.Count;) { int elementSize = GetInt32FromByteSequence(bytes.GetRange(i + 4, 4)) + 8; if ((elementSize & 1) != 0) { elementSize++; } RiffElement element; int startPosition = this.StartPosition + 12; if (GetFourCCFromBytes(bytes.GetRange(i, 4)) == "LIST") { element = new RiffList(startPosition + i, this); } else { var id = GetFourCCFromBytes(bytes.GetRange(i, 4)); switch (id) { case "avih": element = new RiffChunk <AviMainHeader>(startPosition + i, this); break; case "strh": element = new RiffChunk <AviStreamHeader>(startPosition + i, this); break; default: element = new RiffChunk <byte>(startPosition + i, this); break; } } element.Parse(bytes.GetRange(i, elementSize)); result.Add(element); i += elementSize; } return(result); }
private IEnumerable <RiffElement> GetChunk <T>(RiffList list) where T : struct { foreach (var child in list.Children) { if (child is RiffChunk <T> ) { yield return(child); } } foreach (var newList in list.Children.Where(x => x is RiffList)) { var result = this.GetChunk <T>(newList as RiffList); if (!result.Any()) { break; } foreach (var element in result.ToList()) { yield return(element); } } }
public RiffList(int startPosition, RiffList parent) : base(startPosition, parent) { }
protected RiffElement(int startPosition, RiffList parent) { this.StartPosition = startPosition; this.Parent = parent; }