private void ReadMdia(ref TrakInfo trackData, BoxInfo mdiaBox) { var maxLen = mdiaBox.BoxOffset + mdiaBox.Offset; BoxInfo?box = null; do { box = NextBox(maxLen); if (box != null) { if (box.Value.Type.Check(mdhd)) { ReadMdhd(ref trackData); } if (box.Value.Type.Check(hdlr)) { ReadHdlr(ref trackData); } if (box.Value.Type.Check(minf)) { ReadMinf(ref trackData, box.Value); } SeekNext(box.Value); } } while (!(box == null || box.Value.Last)); }
private void ReadChaptersText(TrakInfo textBox) { if (textBox.Durations != null && textBox.Samples != null) { var len = Math.Min(textBox.Durations.Length, textBox.Samples.Length); if (len > 0) { Chapters = new ChapterInfo[len]; var pos = TimeSpan.FromSeconds(0); var tps = (double)textBox.TimeUnitPerSecond; if (tps <= 0.1) { tps = 600; } for (int i = 0; i < len; i++) { var ci = new ChapterInfo(); ci.Time = pos; var d = (double)textBox.Durations[i]; pos += TimeSpan.FromSeconds(d / tps); stream.Seek(SeekOrigin.Begin, textBox.Samples[i]); ci.Name = ReadPascalString(Encoding.UTF8); Chapters[i] = ci; } } } }
private TrakInfo ReadTrak(BoxInfo trakBox) { var maxLen = trakBox.BoxOffset + trakBox.Offset; var trakData = new TrakInfo(); BoxInfo?box = null; do { box = NextBox(maxLen); if (box != null) { if (box.Value.Type.Check(tkhd)) { ReadTkhd(ref trakData); } if (box.Value.Type.Check(mdia)) { ReadMdia(ref trakData, box.Value); } if (box.Value.Type.Check(tref)) { ReadTref(ref trakData, box.Value); } SeekNext(box.Value); } } while (!(box == null || box.Value.Last)); return(trakData); }
private void ReadTkhd(ref TrakInfo trakData) { var v = new byte[1]; stream.Read(v, 1); var isv8 = v[0] == 1; stream.Seek(SeekOrigin.Current, 3 + (isv8 ? 8 + 8 : 4 + 4)); trakData.Id = ReadUint32(); }
private void ReadHdlr(ref TrakInfo trakData) { stream.Seek(SeekOrigin.Current, 4 + 4); var b = new byte[4]; stream.Read(b, 4); var bc = new char[4]; AsciiEncoding.Current.GetDecoder().GetChars(b, 0, 4, bc, 0); trakData.Type = new string(bc); }
private void ReadChap(ref TrakInfo trakData, BoxInfo box2) { var len = (box2.Offset - 8) / 4; if (len > 0 && len < 1024) { trakData.Chaps = new uint[len]; for (uint i = 0; i < len; i++) { trakData.Chaps[i] = ReadUint32(); } } }
private void ReadStco(ref TrakInfo trakData) { stream.Seek(SeekOrigin.Current, 4); var len = ReadUint32(); if (len > 1024) { len = 0; } trakData.Samples = new long[len]; for (uint i = 0; i < len; i++) { trakData.Samples[i] = ReadUint32(); } }
private void ReadStts(ref TrakInfo trakData) { stream.Seek(SeekOrigin.Current, 4); var len = ReadUint32(); if (len > 1024) { len = 0; } trakData.Durations = new uint[len]; trakData.FrameCount = new uint[len]; for (uint i = 0; i < len; i++) { trakData.FrameCount[i] = ReadUint32(); trakData.Durations[i] = ReadUint32(); } }
private void ReadMinf(ref TrakInfo trakData, BoxInfo box2) { var maxLen = box2.BoxOffset + box2.Offset; BoxInfo?box = null; do { box = NextBox(maxLen); if (box != null) { if (box.Value.Type.Check(stbl)) { ReadStbl(ref trakData, box.Value); } SeekNext(box.Value); } } while (!(box == null || box.Value.Last)); }