diff --git a/src/JT1078.FMp4/Boxs/FragmentBox.cs b/src/JT1078.FMp4/Boxs/FragmentBox.cs index d3c512a..9f7b6c4 100644 --- a/src/JT1078.FMp4/Boxs/FragmentBox.cs +++ b/src/JT1078.FMp4/Boxs/FragmentBox.cs @@ -1,12 +1,32 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class FragmentBox + public class FragmentBox:IFMp4MessagePackFormatter { + /// + /// moof + /// public MovieFragmentBox MovieFragmentBox { get; set; } + /// + /// mdat + /// public MediaDataBox MediaDataBox { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + if (MovieFragmentBox != null) + { + MovieFragmentBox.ToBuffer(ref writer); + } + if (MediaDataBox != null) + { + MediaDataBox.ToBuffer(ref writer); + } + } } } diff --git a/src/JT1078.FMp4/Boxs/MediaDataBox.cs b/src/JT1078.FMp4/Boxs/MediaDataBox.cs index 90f94c3..0ca9162 100644 --- a/src/JT1078.FMp4/Boxs/MediaDataBox.cs +++ b/src/JT1078.FMp4/Boxs/MediaDataBox.cs @@ -1,15 +1,33 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class MediaDataBox : Mp4Box + /// + /// mdat + /// + public class MediaDataBox : Mp4Box, IFMp4MessagePackFormatter { + /// + /// mdat + /// public MediaDataBox() : base("mdat") { } public byte[] Data { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + if (Data != null && Data.Length > 0) + { + writer.WriteArray(Data); + } + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/MovieFragmentBox.cs b/src/JT1078.FMp4/Boxs/MovieFragmentBox.cs index 7f26a58..ae7708c 100644 --- a/src/JT1078.FMp4/Boxs/MovieFragmentBox.cs +++ b/src/JT1078.FMp4/Boxs/MovieFragmentBox.cs @@ -1,16 +1,43 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class MovieFragmentBox : Mp4Box + /// + /// moof + /// + public class MovieFragmentBox : Mp4Box, IFMp4MessagePackFormatter { + /// + /// moof + /// public MovieFragmentBox() : base("moof") { } - + /// + /// mfhd + /// public MovieFragmentHeaderBox MovieFragmentHeaderBox { get; set; } + /// + /// traf + /// public TrackFragmentBox TrackFragmentBox { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + if (MovieFragmentHeaderBox != null) + { + MovieFragmentHeaderBox.ToBuffer(ref writer); + } + if (TrackFragmentBox != null) + { + TrackFragmentBox.ToBuffer(ref writer); + } + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/MovieFragmentHeaderBox.cs b/src/JT1078.FMp4/Boxs/MovieFragmentHeaderBox.cs index 960a087..05932eb 100644 --- a/src/JT1078.FMp4/Boxs/MovieFragmentHeaderBox.cs +++ b/src/JT1078.FMp4/Boxs/MovieFragmentHeaderBox.cs @@ -1,15 +1,33 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class MovieFragmentHeaderBox : FullBox + /// + /// mfhd + /// + public class MovieFragmentHeaderBox : FullBox, IFMp4MessagePackFormatter { + /// + /// mfhd + /// + /// + /// public MovieFragmentHeaderBox(byte version=0, uint flags=0) : base("mfhd", version, flags) { } public uint SequenceNumber { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + WriterFullBoxToBuffer(ref writer); + writer.WriteUInt32(SequenceNumber); + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessBox.cs b/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessBox.cs index a6e7a69..65dd2b1 100644 --- a/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessBox.cs +++ b/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessBox.cs @@ -1,17 +1,43 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class MovieFragmentRandomAccessBox : Mp4Box + /// + /// mfra + /// + public class MovieFragmentRandomAccessBox : Mp4Box, IFMp4MessagePackFormatter { + /// + /// mfra + /// public MovieFragmentRandomAccessBox() : base("mfra") { } - + /// + /// tfra + /// public TrackFragmentRandomAccessBox TrackFragmentRandomAccessBox { get; set; } - + /// + /// mfro + /// public MovieFragmentRandomAccessOffsetBox MovieFragmentRandomAccessOffsetBox { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + if (TrackFragmentRandomAccessBox != null) + { + TrackFragmentRandomAccessBox.ToBuffer(ref writer); + } + if (MovieFragmentRandomAccessOffsetBox != null) + { + MovieFragmentRandomAccessOffsetBox.ToBuffer(ref writer); + } + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessOffsetBox.cs b/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessOffsetBox.cs index c100c7e..28da638 100644 --- a/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessOffsetBox.cs +++ b/src/JT1078.FMp4/Boxs/MovieFragmentRandomAccessOffsetBox.cs @@ -1,15 +1,33 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class MovieFragmentRandomAccessOffsetBox : FullBox + /// + /// mfro + /// + public class MovieFragmentRandomAccessOffsetBox : FullBox, IFMp4MessagePackFormatter { + /// + /// mfro + /// + /// + /// public MovieFragmentRandomAccessOffsetBox(byte version, uint flags=0) : base("mfro", version, flags) { } public uint MfraSize { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + WriterFullBoxToBuffer(ref writer); + writer.WriteUInt32(MfraSize); + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs b/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs index 41ded80..5b67d2b 100644 --- a/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs +++ b/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs @@ -1,11 +1,21 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class SampleDependencyTypeBox : FullBox + /// + /// sdtp + /// + public class SampleDependencyTypeBox : FullBox, IFMp4MessagePackFormatter { + /// + /// sdtp + /// + /// + /// public SampleDependencyTypeBox(byte version=0, uint flags=0) : base("sdtp", version, flags) { } @@ -14,6 +24,27 @@ namespace JT1078.FMp4 /// public List SampleDependencyTypes { get; set; } + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + WriterFullBoxToBuffer(ref writer); + if(SampleDependencyTypes!=null && SampleDependencyTypes.Count > 0) + { + //todo: wait ref doc + foreach(var item in SampleDependencyTypes) + { + writer.WriteByte(item.IsLeading); + writer.WriteByte(item.SampleDependsOn); + writer.WriteByte(item.SampleIsDependedOn); + writer.WriteByte(item.SampleHasRedundancy); + writer.WriteByte(item.DegradPrio); + writer.WriteByte(item.IsNonSync); + writer.WriteByte(item.PaddingValue); + } + } + End(ref writer); + } + public class SampleDependencyType { public byte IsLeading { get; set; } diff --git a/src/JT1078.FMp4/Boxs/SampleToGroupBox.cs b/src/JT1078.FMp4/Boxs/SampleToGroupBox.cs index 3329de3..2f47f72 100644 --- a/src/JT1078.FMp4/Boxs/SampleToGroupBox.cs +++ b/src/JT1078.FMp4/Boxs/SampleToGroupBox.cs @@ -1,11 +1,21 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class SampleToGroupBox : FullBox + /// + /// sbgp + /// + public class SampleToGroupBox : FullBox, IFMp4MessagePackFormatter { + /// + /// sbgp + /// + /// + /// public SampleToGroupBox(byte version, uint flags) : base("sbgp", version, flags) { } @@ -20,6 +30,11 @@ namespace JT1078.FMp4 public List SampleToGroupInfos { get; set; } + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + //todo:sbgp + } + public class SampleToGroupInfo { public uint SampleCount { get; set; } diff --git a/src/JT1078.FMp4/Boxs/SubSampleInformationBox.cs b/src/JT1078.FMp4/Boxs/SubSampleInformationBox.cs index 55bbdc8..942b1f4 100644 --- a/src/JT1078.FMp4/Boxs/SubSampleInformationBox.cs +++ b/src/JT1078.FMp4/Boxs/SubSampleInformationBox.cs @@ -1,11 +1,21 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class SubSampleInformationBox : FullBox + /// + /// subs + /// + public class SubSampleInformationBox : FullBox, IFMp4MessagePackFormatter { + /// + /// subs + /// + /// + /// public SubSampleInformationBox(byte version, uint flags=0) : base("subs", version, flags) { } @@ -14,6 +24,11 @@ namespace JT1078.FMp4 public List SubSampleInformations { get; set; } + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + //todo:subs + } + public class SubSampleInformation { public uint SampleDelta { get; set; } diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs index 9aa2fe4..e261a81 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentBaseMediaDecodeTimeBox.cs @@ -1,14 +1,32 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class TrackFragmentBaseMediaDecodeTimeBox : FullBox + /// + /// tfdt + /// + public class TrackFragmentBaseMediaDecodeTimeBox : FullBox, IFMp4MessagePackFormatter { + /// + /// tfdt + /// + /// + /// public TrackFragmentBaseMediaDecodeTimeBox(byte version, uint flags=0) : base("tfdt", version, flags) { } public uint BaseMediaDecodeTime { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + WriterFullBoxToBuffer(ref writer); + writer.WriteUInt32(BaseMediaDecodeTime); + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs index a6612d9..fa1aa2a 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentBox.cs @@ -1,19 +1,75 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class TrackFragmentBox : Mp4Box + /// + /// traf + /// + public class TrackFragmentBox : Mp4Box, IFMp4MessagePackFormatter { + /// + /// traf + /// public TrackFragmentBox() : base("traf") { } + /// + /// tfhd + /// public TrackFragmentHeaderBox TrackFragmentHeaderBox { get; set; } + /// + /// sdtp + /// public SampleDependencyTypeBox SampleDependencyTypeBox { get; set; } + /// + /// trun + /// public TrackRunBox TrackRunBox { get; set; } + /// + /// tfdt + /// public TrackFragmentBaseMediaDecodeTimeBox TrackFragmentBaseMediaDecodeTimeBox { get; set; } + /// + /// sbgp + /// public SampleToGroupBox SampleToGroupBox { get; set; } + /// + /// subs + /// public SubSampleInformationBox SubSampleInformationBox { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + if (TrackFragmentHeaderBox != null) + { + TrackFragmentHeaderBox.ToBuffer(ref writer); + } + if (SampleDependencyTypeBox != null) + { + SampleDependencyTypeBox.ToBuffer(ref writer); + } + if (TrackRunBox != null) + { + TrackRunBox.ToBuffer(ref writer); + } + if (TrackFragmentBaseMediaDecodeTimeBox != null) + { + TrackFragmentBaseMediaDecodeTimeBox.ToBuffer(ref writer); + } + if (SampleToGroupBox != null) + { + SampleToGroupBox.ToBuffer(ref writer); + } + if (SubSampleInformationBox != null) + { + SubSampleInformationBox.ToBuffer(ref writer); + } + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs index 69b2ca7..091906e 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs @@ -1,14 +1,28 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class TrackFragmentHeaderBox : FullBox + /// + /// tfhd + /// + public class TrackFragmentHeaderBox : FullBox, IFMp4MessagePackFormatter { + /// + /// tfhd + /// + /// + /// public TrackFragmentHeaderBox(byte version, uint flags) : base("tfhd", version, flags) { } + /// + /// tfhd + /// + /// public TrackFragmentHeaderBox(uint flags) : this(0, flags) { } @@ -20,7 +34,15 @@ namespace JT1078.FMp4 public uint SampleDescriptionIndex { get; set; } public uint DefaultSampleDuration { get; set; } public uint DefaultSampleSize { get; set; } - public uint DefaultSampleFlags { get; set; } + public uint DefaultSampleFlags { get; set; } #endregion + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + WriterFullBoxToBuffer(ref writer); + writer.WriteUInt32(TrackID); + //todo:all the following are optional fields + End(ref writer); + } } } diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs index c0a6b5d..8a3ba3c 100644 --- a/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs @@ -1,11 +1,21 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class TrackFragmentRandomAccessBox : FullBox + /// + /// tfra + /// + public class TrackFragmentRandomAccessBox : FullBox, IFMp4MessagePackFormatter { + /// + /// tfra + /// + /// + /// public TrackFragmentRandomAccessBox(byte version, uint flags=0) : base("tfra", version, flags) { } @@ -28,6 +38,16 @@ namespace JT1078.FMp4 public uint LengthSizeOfSampleNum { get; set; } public uint NumberOfEntry { get; set; } public List TrackFragmentRandomAccessInfos { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + WriterFullBoxToBuffer(ref writer); + + //todo:tfra + End(ref writer); + } + public class TrackFragmentRandomAccessInfo { public ulong Time { get; set; } diff --git a/src/JT1078.FMp4/Boxs/TrackRunBox.cs b/src/JT1078.FMp4/Boxs/TrackRunBox.cs index 1cc0cdc..0947a76 100644 --- a/src/JT1078.FMp4/Boxs/TrackRunBox.cs +++ b/src/JT1078.FMp4/Boxs/TrackRunBox.cs @@ -1,11 +1,21 @@ -using System; +using JT1078.FMp4.Interfaces; +using JT1078.FMp4.MessagePack; +using System; using System.Collections.Generic; using System.Text; namespace JT1078.FMp4 { - public class TrackRunBox : FullBox + /// + /// trun + /// + public class TrackRunBox : FullBox, IFMp4MessagePackFormatter { + /// + /// trun + /// + /// + /// public TrackRunBox(byte version, uint flags) : base("trun", version, flags) { } @@ -20,6 +30,15 @@ namespace JT1078.FMp4 /// length:SampleCount /// public List TrackRunInfos { get; set; } + + public void ToBuffer(ref FMp4MessagePackWriter writer) + { + Start(ref writer); + WriterFullBoxToBuffer(ref writer); + //todo: TrackRunBox + End(ref writer); + } + public class TrackRunInfo { public uint SampleDuration { get; set; } diff --git a/src/JT1078.FMp4/FMp4Box.cs b/src/JT1078.FMp4/FMp4Box.cs index 32be246..1de854f 100644 --- a/src/JT1078.FMp4/FMp4Box.cs +++ b/src/JT1078.FMp4/FMp4Box.cs @@ -20,17 +20,27 @@ namespace JT1078.FMp4 /// public MovieBox MovieBox { get; set; } /// - /// + /// fboxs /// public List FragmentBoxs { get; set; } /// - /// + /// mfra /// public MovieFragmentRandomAccessBox MovieFragmentRandomAccessBox { get; set; } public void ToBuffer(ref FMp4MessagePackWriter writer) { FileTypeBox.ToBuffer(ref writer); + MovieBox.ToBuffer(ref writer); + if(FragmentBoxs!=null && FragmentBoxs.Count > 0) + { + foreach(var item in FragmentBoxs) + { + item.MovieFragmentBox.ToBuffer(ref writer); + item.MediaDataBox.ToBuffer(ref writer); + } + } + } } } diff --git a/src/JT1078.FMp4/JT1078.FMp4.xml b/src/JT1078.FMp4/JT1078.FMp4.xml index bb40784..ce55626 100644 --- a/src/JT1078.FMp4/JT1078.FMp4.xml +++ b/src/JT1078.FMp4/JT1078.FMp4.xml @@ -24,6 +24,18 @@ length:EntryCount + + + stco + + + + + stco + + + + length:EntryCount @@ -50,6 +62,18 @@ DepOn:field_size=>DataType + + + ctts + + + + + ctts + + + + version == 1 @@ -151,6 +175,16 @@ 4位*n + + + moof + + + + + mdat + + 填充值 @@ -254,6 +288,16 @@ minf + + + mdat + + + + + mdat + + mdhd @@ -315,7 +359,7 @@ - trak + mvex @@ -328,6 +372,82 @@ mvex + + + mehd + + + + + mehd + + + + + + + moof + + + + + moof + + + + + mfhd + + + + + traf + + + + + mfhd + + + + + mfhd + + + + + + + mfra + + + + + mfra + + + + + tfra + + + + + mfro + + + + + mfro + + + + + mfro + + + + mvhd @@ -385,6 +505,18 @@ length:sample_count + + + sdtp + + + + + sdtp + + + + is taken from the sample_count in the Sample Size Box ('stsz') or Compact Sample Size Box(‘stz2’). @@ -449,6 +581,30 @@ stco + + + stsc + + + + + stsc + + + + + + + sbgp + + + + + sbgp + + + + version == 1 @@ -510,6 +666,18 @@ length:Length + + + subs + + + + + subs + + + + version == 1 @@ -540,6 +708,18 @@ length:ItemCount + + + stts + + + + + stts + + + + trak @@ -560,6 +740,88 @@ mdia + + + tfdt + + + + + tfdt + + + + + + + traf + + + + + traf + + + + + tfhd + + + + + sdtp + + + + + trun + + + + + tfdt + + + + + sbgp + + + + + subs + + + + + tfhd + + + + + tfhd + + + + + + + tfhd + + + + + + tfra + + + + + tfra + + + + 4byte 32-26 @@ -592,6 +854,18 @@ + + + trun + + + + + trun + + + + 可选的 @@ -683,12 +957,12 @@ - + fboxs - + mfra