/// <summary> /// Read - read in the SampleTableBox from the input MP4 file. /// Sub-boxes can come in in any order. /// </summary> /// <param name="reader">BoxReader</param> public override void Read(BoxReader reader) { using (new SizeChecker(this, reader)) { base.Read(reader); while (reader.BaseStream.Position < (long)(this.Size + this.Offset)) { long pos = reader.BaseStream.Position; Box test = new Box(BoxTypes.Any); test.Read(reader); reader.BaseStream.Position = pos; if (test.Type == BoxTypes.TimeToSample) { this.DecodingTimeToSampleBox = new DecodingTimeToSampleBox(this); DecodingTimeToSampleBox.Read(reader); } else if (test.Type == BoxTypes.CompositionOffset) { this.CompositionTimeToSample = new CompositionTimeToSample(this); CompositionTimeToSample.Read(reader); } else if (test.Type == BoxTypes.SampleDescription) { this.SampleDescriptionsBox = new SampleDescriptionsBox(this); SampleDescriptionsBox.Read(reader); } else if (test.Type == BoxTypes.SampleToChunk) { this.SampleToChunkBox = new SampleToChunkBox(this); SampleToChunkBox.Read(reader); } else if (test.Type == BoxTypes.SampleSize) { this.SampleSizeBox = new SampleSizeBox(this); SampleSizeBox.Read(reader); } else if (test.Type == BoxTypes.ChunkOffset) // FIXME: this can be a "co64" box { this.ChunkOffSetBox = new ChunkOffSetBox(this); ChunkOffSetBox.Read(reader); } else if (test.Type == BoxTypes.SyncSampleMap) { this.SyncSampleMapBox = new SyncSampleMapBox(); SyncSampleMapBox.Read(reader); } else { reader.BaseStream.Position = (long)(test.Size + test.Offset); // skip unknown box Debug.WriteLine(string.Format("Unknown box type {0} in SampleTableBox (stbl), skipped", test.Type.ToString())); } } // end of while if (SampleToChunkBox != null) { SampleToChunkBox.CheckIntegrityOfChunkData(); } } }
/// <summary> /// Read - read in the SampleTableBox from the input MP4 file. /// Sub-boxes can come in in any order. /// </summary> /// <param name="reader">BoxReader</param> public override void Read(BoxReader reader) { using (new SizeChecker(this, reader)) { base.Read(reader); while (reader.BaseStream.Position < (long)(this.Size + this.Offset)) { long pos = reader.BaseStream.Position; Box test = new Box(BoxTypes.Any); test.Read(reader); reader.BaseStream.Position = pos; if (test.Type == BoxTypes.TimeToSample) { this.DecodingTimeToSampleBox = new DecodingTimeToSampleBox(this); DecodingTimeToSampleBox.Read(reader); } else if (test.Type == BoxTypes.CompositionOffset) { this.CompositionTimeToSample = new CompositionTimeToSample(this); CompositionTimeToSample.Read(reader); } else if (test.Type == BoxTypes.SampleDescription) { this.SampleDescriptionsBox = new SampleDescriptionsBox(this); SampleDescriptionsBox.Read(reader); } else if (test.Type == BoxTypes.SampleToChunk) { this.SampleToChunkBox = new SampleToChunkBox(this); SampleToChunkBox.Read(reader); } else if (test.Type == BoxTypes.SampleSize) { this.SampleSizeBox = new SampleSizeBox(this); SampleSizeBox.Read(reader); } else if (test.Type == BoxTypes.ChunkOffset) { // FIXME: this can be a "co64" box this.ChunkOffSetBox = new ChunkOffSetBox(this); ChunkOffSetBox.Read(reader); } else if (test.Type == BoxTypes.SyncSampleMap) { this.SyncSampleMapBox = new SyncSampleMapBox(); SyncSampleMapBox.Read(reader); } else { reader.BaseStream.Position = (long)(test.Size + test.Offset); // skip unknown box Debug.WriteLine(string.Format("Unknown box type {0} in SampleTableBox (stbl), skipped", test.Type.ToString())); } } // end of while if (SampleToChunkBox != null) SampleToChunkBox.CheckIntegrityOfChunkData(); } }