using JT1078.FMp4.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
using JT1078.Protocol.Extensions;
using JT1078.FMp4.Enums;
using JT1078.FMp4.Samples;
namespace JT1078.FMp4.Test
{
public class FMp4Box_Test
{
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "ftyp")]
public void ftyp_test()
{
var MinorVersion = Encoding.ASCII.GetString(new byte[4] { 0,0,2,0});
FileTypeBox fileTypeBox = new FileTypeBox();
fileTypeBox.MajorBrand = "isom";
fileTypeBox.MinorVersion = "\0\0\u0002\0";
fileTypeBox.CompatibleBrands.Add("isom");
fileTypeBox.CompatibleBrands.Add("iso2");
fileTypeBox.CompatibleBrands.Add("avc1");
fileTypeBox.CompatibleBrands.Add("iso6");
fileTypeBox.CompatibleBrands.Add("mp41");
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x25]);
fileTypeBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
Assert.Equal("000000246674797069736f6d0000020069736f6d69736f326176633169736f366d703431".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_mvhd")]
public void moov_mvhd_test()
{
MovieHeaderBox movieHeaderBox = new MovieHeaderBox(0);
movieHeaderBox.CreationTime = 0;
movieHeaderBox.ModificationTime = 0;
movieHeaderBox.Timescale = 1000;
movieHeaderBox.Duration = 0;
movieHeaderBox.NextTrackID = 2;
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
movieHeaderBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
Assert.Equal("0000006c6d766864000000000000000000000000000003e8000000000001000001000000000000000000000000010000000000000000000000000000000100000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_tkhd")]
public void moov_trak_tkhd_test()
{
TrackHeaderBox trackHeaderBox = new TrackHeaderBox(0,3);
trackHeaderBox.CreationTime = 0;
trackHeaderBox.ModificationTime = 0;
trackHeaderBox.TrackID = 1;
trackHeaderBox.Duration = 0;
trackHeaderBox.Width = 544u;
trackHeaderBox.Height = 960u;
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
trackHeaderBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
Assert.Equal("0000005C746B68640000000300000000000000000000000100000000000000000000000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000004000000000000220000003C0".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_mdia")]
public void moov_trak_mdia_test()
{
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_mdia_mdhd")]
public void moov_trak_mdia_mdhd_test()
{
MediaHeaderBox mediaHeaderBox = new MediaHeaderBox(0, 0);
mediaHeaderBox.CreationTime = 0;
mediaHeaderBox.ModificationTime = 0;
mediaHeaderBox.Timescale = 0x00124f80;
mediaHeaderBox.Duration = 0;
mediaHeaderBox.Language = "und";
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
mediaHeaderBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
//000000206d64686400000000000000000000000000124f800000000055c40000
//00000020
//6d646864
//00000000
//00000000
//00000000
//00124f80
//00000000
//55c4
//0000
Assert.Equal("000000206d64686400000000000000000000000000124f800000000055c40000".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_mdia_hdlr")]
public void moov_trak_mdia_hdlr_test()
{
HandlerBox handlerBox = new HandlerBox(0, 0);
handlerBox.HandlerType = Enums.HandlerType.vide;
handlerBox.Name = "VideoHandler";
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
handlerBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
Assert.Equal("0000002C68646C72000000000000000076696465000000000000000000000000566964656F48616E646C6572".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_mdia_hdlr_minf")]
public void moov_trak_mdia_hdlr_minf_test()
{
HandlerBox handlerBox = new HandlerBox(0, 0);
handlerBox.HandlerType = Enums.HandlerType.vide;
handlerBox.Name = "VideoHandler\0";
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
handlerBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
Assert.Equal("0000002D68646C72000000000000000076696465000000000000000000000000566964656F48616E646C657200".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_mdia_hdlr_minf_vmhd")]
public void moov_trak_mdia_hdlr_minf_vmhd_test()
{
VideoMediaHeaderBox videoMediaHeaderBox = new VideoMediaHeaderBox();
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
videoMediaHeaderBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
Assert.Equal("00000014766d6864000000010000000000000000".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_mdia_hdlr_minf_dinf")]
public void moov_trak_mdia_hdlr_minf_dinf_test()
{
DataInformationBox dataInformationBox = new DataInformationBox();
DataReferenceBox dataReferenceBox = new DataReferenceBox();
dataReferenceBox.DataEntryBoxes = new List();
dataReferenceBox.DataEntryBoxes.Add(new DataEntryUrlBox(version: 0, flags: 1));
dataInformationBox.DataReferenceBox = dataReferenceBox;
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[10240]);
dataInformationBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
//0000002464696e660000001c6472656600000000000000010000000c75726c2000000001
Assert.Equal("0000002464696e660000001c6472656600000000000000010000000c75726c2000000001".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_trak_mdia_hdlr_minf_stbl")]
public void moov_trak_mdia_hdlr_minf_stbl_test()
{
//000000e17374626c000000957374736400000000000000010000008561766331000000000000000100000000000000000000000000000000022003c0004800000048000000000000000100000000000000000000000000000000000000000000000000000000000000000018ffff0000002f617663430164001fffe100176764001facd940881e684000f4240037b40883c60c658001000568efbcb0000000001073747473000000000000000000000010737473630000000000000000000000147374737a000000000000000000000000000000107374636f0000000000000000
//stbl
SampleTableBox sampleTableBox = new SampleTableBox();
//stbl->stsd
SampleDescriptionBox sampleDescriptionBox = new SampleDescriptionBox(HandlerType.none);
//stbl->stsd->avc1
AVC1SampleEntry aVC1SampleEntry = new AVC1SampleEntry();
aVC1SampleEntry.Width = 0x0220;
aVC1SampleEntry.Height = 0x03c0;
//stbl->stsd->avc1->avcc
AVCConfigurationBox aVCConfigurationBox = new AVCConfigurationBox();
aVCConfigurationBox.AVCProfileIndication = 0x64;
aVCConfigurationBox.ProfileCompatibility = 0;
aVCConfigurationBox.AVCLevelIndication = 0x1f;
aVCConfigurationBox.LengthSizeMinusOne = 0xff;
aVCConfigurationBox.SPSs = new List()
{
"6764001facd940881e684000f4240037b40883c60c6580".ToHexBytes()
};
aVCConfigurationBox.PPSs = new List()
{
"68efbcb000".ToHexBytes()
};
aVC1SampleEntry.AVCConfigurationBox = aVCConfigurationBox;
sampleDescriptionBox.SampleEntries = new List()
{
aVC1SampleEntry
};
sampleTableBox.SampleDescriptionBox = sampleDescriptionBox;
//stbl->stts
sampleTableBox.TimeToSampleBox = new TimeToSampleBox();
//stbl->stsc
sampleTableBox.SampleToChunkBox = new SampleToChunkBox();
//stbl->stsz
sampleTableBox.SampleSizeBox = new SampleSizeBox();
//stbl->stco
sampleTableBox.ChunkOffsetBox = new ChunkOffsetBox();
FMp4MessagePackWriter writer = new MessagePack.FMp4MessagePackWriter(new byte[0x000000e1]);
sampleTableBox.ToBuffer(ref writer);
var hex = writer.FlushAndGetArray().ToHexString();
Assert.Equal("000000e17374626c000000957374736400000000000000010000008561766331000000000000000100000000000000000000000000000000022003c0004800000048000000000000000100000000000000000000000000000000000000000000000000000000000000000018ffff0000002f617663430164001fffe100176764001facd940881e684000f4240037b40883c60c658001000568efbcb0000000001073747473000000000000000000000010737473630000000000000000000000147374737a000000000000000000000000000000107374636f0000000000000000".ToUpper(), hex);
}
///
/// 使用doc/video/fragmented_demo.mp4
///
[Fact(DisplayName = "moov_mvex")]
public void trak_mvex_test()
{
//todo:moov_mvex
}
}
}