using JT1078.FMp4.Interfaces; using JT1078.FMp4.MessagePack; using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { /// /// sidx /// public class SegmentIndexBox : FullBox,IFMp4MessagePackFormatter { /// /// sidx /// /// /// public SegmentIndexBox(byte version, uint flags=0) : base("sidx", version, flags) { } /// /// /// public uint ReferenceID { get; set; } = 1; /// /// /// public uint Timescale { get; set; } = 1000; /// /// pts /// if(version==0) /// version==0 32 bit /// version>0 64 bit /// public ulong EarliestPresentationTime { get; set; } /// /// /// public ulong FirstOffset { get; set; } = 0; private ushort Reserved { get; set; } //private ushort ReferenceCount { get; set; } /// /// /// public List SegmentIndexs { get; set; } public void ToBuffer(ref FMp4MessagePackWriter writer) { Start(ref writer); WriterFullBoxToBuffer(ref writer); writer.WriteUInt32(ReferenceID); writer.WriteUInt32(Timescale); if (Version == 0) { writer.WriteUInt32((uint)EarliestPresentationTime); writer.WriteUInt32((uint)FirstOffset); } else { writer.WriteUInt64(EarliestPresentationTime); writer.WriteUInt64(FirstOffset); } writer.WriteUInt16(Reserved); if(SegmentIndexs!=null && SegmentIndexs.Count > 0) { writer.WriteUInt16((ushort)SegmentIndexs.Count); foreach(var si in SegmentIndexs) { if (si.ReferenceType) { writer.WriteUInt32(si.ReferencedSize | 0x80000000); } else { writer.WriteUInt32(si.ReferencedSize); } writer.WriteUInt32(si.SubsegmentDuration); if (si.StartsWithSAP) { writer.WriteUInt32((si.SAPDeltaTime | 0x80000000 | (uint)(si.SAPType << 28 & 0x70000000))); } else { writer.WriteUInt32((si.SAPDeltaTime | (uint)((si.SAPType <<28) & 0x70000000))); } } } else { writer.WriteUInt16(0); } End(ref writer); } public class SegmentIndex { /// /// 4byte 32 - 1 /// public bool ReferenceType { get; set; } = false; /// /// 4byte 32 - 31 /// ReferencedSize=(moof size) + (mdat size) /// public uint ReferencedSize { get; set; } = 0; /// /// /// public uint SubsegmentDuration { get; set; } /// /// 4byte 32 - 1 /// public bool StartsWithSAP { get; set; } = true; /// /// 4byte 32 - 3 /// public byte SAPType { get; set; } = 1; /// /// 4byte 32 - 28 /// public uint SAPDeltaTime { get; set; } = 0; } } }