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;
}
}
}