public void AddOneSample(StreamDataBlockInfo data, uint timeScale, uint defSize, uint defFlags, ref ulong currMdatOffset) { // at this point the samples List should have been created TrackFragmentRunSample sample = new TrackFragmentRunSample(); sample.SampleCompositionTimeOffset = 0; // FIXME: let's see whether we can get by without setting this composition time offset // careful with overflow ulong product = ((ulong)data.SliceDuration) * ((ulong)timeScale); sample.SampleDuration = (uint)(product / (ulong)TimeSpan.FromSeconds(1.0).Ticks); this.Duration += sample.SampleDuration; if (defFlags == 0) { sample.SampleFlags = 0; // FIXME: we are not setting the sample flags at all } if (defSize == 0) { sample.SampleSize = (uint)data.SliceSize; currMdatOffset += sample.SampleSize; } else { currMdatOffset += defSize; } this.Samples.Add(sample); }
public override void Write(BoxWriter writer) { using (new SizeCalculator(this, writer)) { base.Write(writer); writer.WriteUInt32(SampleCount); if (EnumUtils.IsBitSet <TrackFragmentRunBoxFlags>((TrackFragmentRunBoxFlags)base.Flags, TrackFragmentRunBoxFlags.DataOffsetPresent)) { writer.WriteUInt32(DataOffset); } if (EnumUtils.IsBitSet <TrackFragmentRunBoxFlags>((TrackFragmentRunBoxFlags)base.Flags, TrackFragmentRunBoxFlags.FirstSampleFlagsPresent)) { writer.WriteUInt32(FirstSampleFlags); } for (int i = 0; i < this.SampleCount; i++) { TrackFragmentRunSample item = Samples[i]; item.Write(writer, base.Flags); } } }
public override string ToString() { StringBuilder xml = new StringBuilder(); xml.Append(base.ToString()); if (EnumUtils.IsBitSet <TrackFragmentRunBoxFlags>((TrackFragmentRunBoxFlags)base.Flags, TrackFragmentRunBoxFlags.FirstSampleFlagsPresent)) { xml.Append("<firstsampleflags>").Append(FirstSampleFlags).Append("</firstsampleflags>"); } xml.Append("<samplecount>").Append(SampleCount).Append("</samplecount>"); xml.Append("<samples>"); for (int i = 0; i < this.SampleCount; i++) { TrackFragmentRunSample item = Samples[i]; xml.Append(item.ToString()); } xml.Append("</samples>"); xml.Append("</box>"); return(xml.ToString()); }
/// <summary> /// Read /// NOTE: FirstSampleFlags and the flags in TrackFragmentRunSample are as follows: /// bit(6) reserved=0; // 6 bits reserved /// unsigned int(2) sample_depends_on; // 2 bits used as int /// unsigned int(2) sample_is_depended_on; // 2 bits used as int /// unsigned int(2) sample_has_redundancy; // 2 bits used as int /// bit(3) sample_padding_value; // 3 bits /// bit(1) sample_is_difference_sample; // 1 bit i.e. when 1 signals a non-key or non-sync sample /// unsigned int(16) sample_degradation_priority; // 16 bits, total of 32 bits /// </summary> /// <param name="reader"></param> public override void Read(BoxReader reader) { using (new SizeChecker(this, reader)) { base.Read(reader); this.SampleCount = reader.ReadUInt32(); if (EnumUtils.IsBitSet <TrackFragmentRunBoxFlags>((TrackFragmentRunBoxFlags)base.Flags, TrackFragmentRunBoxFlags.DataOffsetPresent)) { this.DataOffset = reader.ReadUInt32(); } if (EnumUtils.IsBitSet <TrackFragmentRunBoxFlags>((TrackFragmentRunBoxFlags)base.Flags, TrackFragmentRunBoxFlags.FirstSampleFlagsPresent)) { this.FirstSampleFlags = reader.ReadUInt32(); } this.Samples = new List <TrackFragmentRunSample>((int)this.SampleCount); for (int i = 0; i < this.SampleCount; i++) { TrackFragmentRunSample item = new TrackFragmentRunSample(); item.Read(reader, base.Flags); this.Samples.Add(item); this.Duration += item.SampleDuration; } } }
public void AddOneSample(StreamDataBlockInfo data, uint timeScale, uint defSize, uint defFlags, ref ulong currMdatOffset) { // at this point the samples List should have been created TrackFragmentRunSample sample = new TrackFragmentRunSample(); sample.SampleCompositionTimeOffset = 0; // FIXME: let's see whether we can get by without setting this composition time offset // careful with overflow ulong product = ((ulong)data.SliceDuration) * ((ulong)timeScale); sample.SampleDuration = (uint)(product / (ulong)TimeSpan.FromSeconds(1.0).Ticks); this.Duration += sample.SampleDuration; if (defFlags == 0) sample.SampleFlags = 0; // FIXME: we are not setting the sample flags at all if (defSize == 0) { sample.SampleSize = (uint)data.SliceSize; currMdatOffset += sample.SampleSize; } else currMdatOffset += defSize; this.Samples.Add(sample); }
/// <summary> /// Read /// NOTE: FirstSampleFlags and the flags in TrackFragmentRunSample are as follows: /// bit(6) reserved=0; // 6 bits reserved /// unsigned int(2) sample_depends_on; // 2 bits used as int /// unsigned int(2) sample_is_depended_on; // 2 bits used as int /// unsigned int(2) sample_has_redundancy; // 2 bits used as int /// bit(3) sample_padding_value; // 3 bits /// bit(1) sample_is_difference_sample; // 1 bit i.e. when 1 signals a non-key or non-sync sample /// unsigned int(16) sample_degradation_priority; // 16 bits, total of 32 bits /// </summary> /// <param name="reader"></param> public override void Read(BoxReader reader) { using (new SizeChecker(this, reader)) { base.Read(reader); this.SampleCount = reader.ReadUInt32(); if (EnumUtils.IsBitSet<TrackFragmentRunBoxFlags>((TrackFragmentRunBoxFlags)base.Flags, TrackFragmentRunBoxFlags.DataOffsetPresent)) { this.DataOffset = reader.ReadUInt32(); } if (EnumUtils.IsBitSet<TrackFragmentRunBoxFlags>((TrackFragmentRunBoxFlags)base.Flags, TrackFragmentRunBoxFlags.FirstSampleFlagsPresent)) { this.FirstSampleFlags = reader.ReadUInt32(); } this.Samples = new List<TrackFragmentRunSample>((int) this.SampleCount); for (int i = 0; i < this.SampleCount; i++) { TrackFragmentRunSample item = new TrackFragmentRunSample(); item.Read(reader, base.Flags); this.Samples.Add(item); this.Duration += item.SampleDuration; } } }