@@ -0,0 +1,42 @@ | |||||
using JT1078.FMp4.MessagePack; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using Xunit; | |||||
using JT1078.Protocol.Extensions; | |||||
namespace JT1078.FMp4.Test.Boxs | |||||
{ | |||||
public class MovieExtendsBox_Test | |||||
{ | |||||
/// <summary> | |||||
/// 使用doc/video/fragmented_demo.mp4 | |||||
/// </summary> | |||||
[Fact] | |||||
public void Test1() | |||||
{ | |||||
//000000286d7665780000002074726578000000000000000100000001000000000000000000000000 | |||||
//00 00 00 28 | |||||
//6d 76 65 78 | |||||
//00 00 00 20 | |||||
//74 72 65 78 | |||||
//00 | |||||
//00 00 00 | |||||
//00 00 00 01 | |||||
//00 00 00 01 | |||||
//00 00 00 00 | |||||
//00 00 00 00 | |||||
//00 00 00 00 | |||||
MovieExtendsBox movieExtendsBox = new MovieExtendsBox(); | |||||
movieExtendsBox.TrackExtendsBoxs = new List<TrackExtendsBox>(); | |||||
TrackExtendsBox trackExtendsBox1 = new TrackExtendsBox(); | |||||
trackExtendsBox1.TrackID = 0x01; | |||||
trackExtendsBox1.DefaultSampleDescriptionIndex = 0x01; | |||||
movieExtendsBox.TrackExtendsBoxs.Add(trackExtendsBox1); | |||||
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x00000028]); | |||||
movieExtendsBox.ToBuffer(ref writer); | |||||
var hex = writer.FlushAndGetArray().ToHexString(); | |||||
Assert.Equal("000000286d7665780000002074726578000000000000000100000001000000000000000000000000".ToUpper(), hex); | |||||
} | |||||
} | |||||
} |
@@ -80,8 +80,7 @@ namespace JT1078.FMp4.Test | |||||
/// </summary> | /// </summary> | ||||
[Fact(DisplayName = "moov_trak_mdia_mdhd")] | [Fact(DisplayName = "moov_trak_mdia_mdhd")] | ||||
public void moov_trak_mdia_mdhd_test() | public void moov_trak_mdia_mdhd_test() | ||||
{ | |||||
{ | |||||
MediaHeaderBox mediaHeaderBox = new MediaHeaderBox(0, 0); | MediaHeaderBox mediaHeaderBox = new MediaHeaderBox(0, 0); | ||||
mediaHeaderBox.CreationTime = 0; | mediaHeaderBox.CreationTime = 0; | ||||
mediaHeaderBox.ModificationTime = 0; | mediaHeaderBox.ModificationTime = 0; | ||||
@@ -214,7 +213,114 @@ namespace JT1078.FMp4.Test | |||||
[Fact(DisplayName = "moov_mvex")] | [Fact(DisplayName = "moov_mvex")] | ||||
public void trak_mvex_test() | public void trak_mvex_test() | ||||
{ | { | ||||
//todo:moov_mvex | |||||
//moov->mvex | |||||
MovieExtendsBox movieExtendsBox = new MovieExtendsBox(); | |||||
//moov->mvex->trex | |||||
movieExtendsBox.TrackExtendsBoxs = new List<TrackExtendsBox>(); | |||||
TrackExtendsBox trackExtendsBox1 = new TrackExtendsBox(); | |||||
trackExtendsBox1.TrackID = 0x01; | |||||
trackExtendsBox1.DefaultSampleDescriptionIndex = 0x01; | |||||
movieExtendsBox.TrackExtendsBoxs.Add(trackExtendsBox1); | |||||
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x00000028]); | |||||
movieExtendsBox.ToBuffer(ref writer); | |||||
var hex = writer.FlushAndGetArray().ToHexString(); | |||||
Assert.Equal("000000286d7665780000002074726578000000000000000100000001000000000000000000000000".ToUpper(), hex); | |||||
} | |||||
/// <summary> | |||||
/// 使用doc/video/fragmented_demo.mp4 | |||||
/// </summary> | |||||
[Fact(DisplayName = "moov_udta")] | |||||
public void moov_udta_test() | |||||
{ | |||||
//todo:moov->udta | |||||
} | |||||
/// <summary> | |||||
/// 使用doc/video/fragmented_demo.mp4 | |||||
/// </summary> | |||||
[Fact(DisplayName = "moof")] | |||||
public void moof_test() | |||||
{ | |||||
//000006d8747261660000002474666864000000390000000100000000000002fc0000bb80000066ee01010000 | |||||
//00 00 06 d8 | |||||
//74 72 61 66 | |||||
//00 00 00 24 | |||||
//74 66 68 64 | |||||
//00 | |||||
//00 00 39 | |||||
//00 00 00 01 | |||||
//忽略以下可选数据 | |||||
//00 00 00 00 00 00 02 fc | |||||
//00 00 bb 80 | |||||
//00 00 66 ee | |||||
//01 01 00 00 | |||||
//moof | |||||
MovieFragmentBox movieFragmentBox = new MovieFragmentBox(); | |||||
//moof->mfhd | |||||
movieFragmentBox.MovieFragmentHeaderBox = new MovieFragmentHeaderBox(); | |||||
movieFragmentBox.MovieFragmentHeaderBox.SequenceNumber = 0x01; | |||||
//moof->traf | |||||
movieFragmentBox.TrackFragmentBox = new TrackFragmentBox(); | |||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox = new TrackFragmentHeaderBox(); | |||||
movieFragmentBox.TrackFragmentBox.TrackFragmentHeaderBox.TrackID = 0x01; | |||||
//moof->tfdt | |||||
movieFragmentBox.TrackFragmentBox.TrackFragmentBaseMediaDecodeTimeBox = new TrackFragmentBaseMediaDecodeTimeBox(); | |||||
//todo:moof->trun | |||||
movieFragmentBox.TrackFragmentBox.TrackRunBox = new TrackRunBox(0, 0x00000305); | |||||
} | |||||
/// <summary> | |||||
/// 使用doc/video/fragmented_demo.mp4 | |||||
/// </summary> | |||||
[Fact(DisplayName = "mdat")] | |||||
public void mdat_test() | |||||
{ | |||||
//todo:mdat | |||||
MediaDataBox mediaDataBox = new MediaDataBox(); | |||||
} | |||||
/// <summary> | |||||
/// 使用doc/video/fragmented_demo.mp4 | |||||
/// </summary> | |||||
[Fact(DisplayName = "mfra")] | |||||
public void mfra_test() | |||||
{ | |||||
//000000436d6672610000002b7466726101000000000000010000000000000001000000000000000000000000000002fc010101000000106d66726f0000000000000043 | |||||
//00 00 00 43 | |||||
//6d 66 72 61 | |||||
//00 00 00 2b | |||||
//74 66 72 61 | |||||
//01 | |||||
//00 00 00 | |||||
//00 00 00 01 | |||||
//00 00 00 00 | |||||
//00 00 00 01 | |||||
//00 00 00 00 00 00 00 00 | |||||
//00 00 00 00 00 00 02 fc | |||||
//01 01 01 | |||||
//00 00 00 10 | |||||
//6d 66 72 6f | |||||
//00 | |||||
//00 00 00 | |||||
//00 00 00 43 | |||||
//mfra | |||||
MovieFragmentRandomAccessBox movieFragmentRandomAccessBox = new MovieFragmentRandomAccessBox(); | |||||
//mfra->tfra | |||||
movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox = new TrackFragmentRandomAccessBox(1); | |||||
movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackID = 0x01; | |||||
movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfos = new List<TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo>(); | |||||
TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo trackFragmentRandomAccessInfo1 = new TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfo(); | |||||
trackFragmentRandomAccessInfo1.Time = 0; | |||||
trackFragmentRandomAccessInfo1.MoofOffset = 0x00000000000002fc; | |||||
trackFragmentRandomAccessInfo1.TrafNumber = 0x01; | |||||
trackFragmentRandomAccessInfo1.TrunNumber = 0x01; | |||||
trackFragmentRandomAccessInfo1.SampleNumber = 0x01; | |||||
movieFragmentRandomAccessBox.TrackFragmentRandomAccessBox.TrackFragmentRandomAccessInfos.Add(trackFragmentRandomAccessInfo1); | |||||
//mfra->mfro | |||||
movieFragmentRandomAccessBox.MovieFragmentRandomAccessOffsetBox = new MovieFragmentRandomAccessOffsetBox(0); | |||||
movieFragmentRandomAccessBox.MovieFragmentRandomAccessOffsetBox.MfraSize = 0x00000043; | |||||
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x00000043]); | |||||
movieFragmentRandomAccessBox.ToBuffer(ref writer); | |||||
var hex = writer.FlushAndGetArray().ToHexString(); | |||||
Assert.Equal("000000436d6672610000002b7466726101000000000000010000000000000001000000000000000000000000000002fc010101000000106d66726f0000000000000043".ToUpper(), hex); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -16,7 +16,7 @@ namespace JT1078.FMp4 | |||||
/// </summary> | /// </summary> | ||||
/// <param name="version"></param> | /// <param name="version"></param> | ||||
/// <param name="flags"></param> | /// <param name="flags"></param> | ||||
public TrackFragmentBaseMediaDecodeTimeBox(byte version, uint flags=0) : base("tfdt", version, flags) | |||||
public TrackFragmentBaseMediaDecodeTimeBox(byte version=1, uint flags=0) : base("tfdt", version, flags) | |||||
{ | { | ||||
} | } | ||||
public uint BaseMediaDecodeTime { get; set; } | public uint BaseMediaDecodeTime { get; set; } | ||||
@@ -52,14 +52,14 @@ namespace JT1078.FMp4 | |||||
if (SampleDependencyTypeBox != null) | if (SampleDependencyTypeBox != null) | ||||
{ | { | ||||
SampleDependencyTypeBox.ToBuffer(ref writer); | SampleDependencyTypeBox.ToBuffer(ref writer); | ||||
} | |||||
if (TrackFragmentBaseMediaDecodeTimeBox != null) | |||||
{ | |||||
TrackFragmentBaseMediaDecodeTimeBox.ToBuffer(ref writer); | |||||
} | } | ||||
if (TrackRunBox != null) | if (TrackRunBox != null) | ||||
{ | { | ||||
TrackRunBox.ToBuffer(ref writer); | TrackRunBox.ToBuffer(ref writer); | ||||
} | |||||
if (TrackFragmentBaseMediaDecodeTimeBox != null) | |||||
{ | |||||
TrackFragmentBaseMediaDecodeTimeBox.ToBuffer(ref writer); | |||||
} | } | ||||
if (SampleToGroupBox != null) | if (SampleToGroupBox != null) | ||||
{ | { | ||||
@@ -23,18 +23,18 @@ namespace JT1078.FMp4 | |||||
/// tfhd | /// tfhd | ||||
/// </summary> | /// </summary> | ||||
/// <param name="flags"></param> | /// <param name="flags"></param> | ||||
public TrackFragmentHeaderBox(uint flags) : this(0, flags) | |||||
public TrackFragmentHeaderBox(uint flags=0) : this(0, flags) | |||||
{ | { | ||||
} | } | ||||
public uint TrackID { get; set; } | public uint TrackID { get; set; } | ||||
#region all the following are optional fields | #region all the following are optional fields | ||||
public ulong BaseDataOffset { get; set; } | |||||
public uint SampleDescriptionIndex { get; set; } | |||||
public uint DefaultSampleDuration { get; set; } | |||||
public uint DefaultSampleSize { get; set; } | |||||
public uint DefaultSampleFlags { get; set; } | |||||
public ulong? BaseDataOffset { get; set; } | |||||
public uint? SampleDescriptionIndex { get; set; } | |||||
public uint? DefaultSampleDuration { get; set; } | |||||
public uint? DefaultSampleSize { get; set; } | |||||
public uint? DefaultSampleFlags { get; set; } | |||||
#endregion | #endregion | ||||
public void ToBuffer(ref FMp4MessagePackWriter writer) | public void ToBuffer(ref FMp4MessagePackWriter writer) | ||||
{ | { | ||||
@@ -47,6 +47,7 @@ namespace JT1078.FMp4 | |||||
writer.WriteUInt32((uint)(LengthSizeOfSampleNum | (LengthSizeOfTrunNum << 2) | (LengthSizeOfTrafNum << 4))); | writer.WriteUInt32((uint)(LengthSizeOfSampleNum | (LengthSizeOfTrunNum << 2) | (LengthSizeOfTrafNum << 4))); | ||||
if(TrackFragmentRandomAccessInfos!=null && TrackFragmentRandomAccessInfos.Count > 0) | if(TrackFragmentRandomAccessInfos!=null && TrackFragmentRandomAccessInfos.Count > 0) | ||||
{ | { | ||||
writer.WriteUInt32((uint)TrackFragmentRandomAccessInfos.Count); | |||||
foreach (var item in TrackFragmentRandomAccessInfos) | foreach (var item in TrackFragmentRandomAccessInfos) | ||||
{ | { | ||||
if (Version == 1) | if (Version == 1) | ||||
@@ -377,6 +377,16 @@ | |||||
mvex | mvex | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:JT1078.FMp4.MovieExtendsBox.MovieExtendsHeaderBox"> | |||||
<summary> | |||||
mehd | |||||
</summary> | |||||
</member> | |||||
<member name="P:JT1078.FMp4.MovieExtendsBox.TrackExtendsBoxs"> | |||||
<summary> | |||||
trex | |||||
</summary> | |||||
</member> | |||||
<member name="T:JT1078.FMp4.MovieExtendsHeaderBox"> | <member name="T:JT1078.FMp4.MovieExtendsHeaderBox"> | ||||
<summary> | <summary> | ||||
mehd | mehd | ||||
@@ -763,6 +773,18 @@ | |||||
mdia | mdia | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="T:JT1078.FMp4.TrackExtendsBox"> | |||||
<summary> | |||||
trex | |||||
</summary> | |||||
</member> | |||||
<member name="M:JT1078.FMp4.TrackExtendsBox.#ctor(System.Byte,System.UInt32)"> | |||||
<summary> | |||||
trex | |||||
</summary> | |||||
<param name="version"></param> | |||||
<param name="flags"></param> | |||||
</member> | |||||
<member name="T:JT1078.FMp4.TrackFragmentBaseMediaDecodeTimeBox"> | <member name="T:JT1078.FMp4.TrackFragmentBaseMediaDecodeTimeBox"> | ||||
<summary> | <summary> | ||||
tfdt | tfdt | ||||