From 560ffeaef0ef042231a770acfa35ec1a79959790 Mon Sep 17 00:00:00 2001
From: "SmallChi(Koike)" <564952747@qq.com>
Date: Sun, 27 Sep 2020 18:16:45 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0fmp4=E6=89=80=E9=9C=80?=
=?UTF-8?q?=E8=A6=81=E7=9A=84=E7=9B=92=E5=AD=90=E7=BC=96=E7=A0=81=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Boxs/SampleDependencyTypeBox.cs | 1 -
.../Boxs/TrackFragmentHeaderBox.cs | 1 -
.../Boxs/TrackFragmentRandomAccessBox.cs | 65 ++++++++++++++++---
src/JT1078.FMp4/Boxs/TrackRunBox.cs | 6 +-
src/JT1078.FMp4/JT1078.FMp4.xml | 14 ++--
5 files changed, 70 insertions(+), 17 deletions(-)
diff --git a/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs b/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs
index 5b67d2b..8b02c52 100644
--- a/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs
+++ b/src/JT1078.FMp4/Boxs/SampleDependencyTypeBox.cs
@@ -30,7 +30,6 @@ namespace JT1078.FMp4
WriterFullBoxToBuffer(ref writer);
if(SampleDependencyTypes!=null && SampleDependencyTypes.Count > 0)
{
- //todo: wait ref doc
foreach(var item in SampleDependencyTypes)
{
writer.WriteByte(item.IsLeading);
diff --git a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs
index 091906e..83d5573 100644
--- a/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs
+++ b/src/JT1078.FMp4/Boxs/TrackFragmentHeaderBox.cs
@@ -41,7 +41,6 @@ namespace JT1078.FMp4
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 8a3ba3c..2ef2dbc 100644
--- a/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs
+++ b/src/JT1078.FMp4/Boxs/TrackFragmentRandomAccessBox.cs
@@ -21,21 +21,21 @@ namespace JT1078.FMp4
}
public uint TrackID { get; set; }
///
- /// 4byte 32-26
+ /// 26bit
///
- public uint Reserved { get; set; } = 26;
+ private uint Reserved { get; set; } = 0;
///
- /// 4byte 32-28
+ /// 2bit
///
- public uint LengthSizeOfTrafNum { get; set; }
+ public byte LengthSizeOfTrafNum { get; set; }
///
- /// 4byte 32-30
+ /// 2bit
///
- public uint LengthSizeOfTrunNum { get; set; }
+ public byte LengthSizeOfTrunNum { get; set; }
///
- /// 4byte 32-32
+ /// 2bit
///
- public uint LengthSizeOfSampleNum { get; set; }
+ public byte LengthSizeOfSampleNum { get; set; }
public uint NumberOfEntry { get; set; }
public List TrackFragmentRandomAccessInfos { get; set; }
@@ -43,11 +43,56 @@ namespace JT1078.FMp4
{
Start(ref writer);
WriterFullBoxToBuffer(ref writer);
-
- //todo:tfra
+ writer.WriteUInt32(TrackID);
+ writer.WriteUInt32((uint)(LengthSizeOfSampleNum | (LengthSizeOfTrunNum << 2) | (LengthSizeOfTrafNum << 4)));
+ if(TrackFragmentRandomAccessInfos!=null && TrackFragmentRandomAccessInfos.Count > 0)
+ {
+ foreach (var item in TrackFragmentRandomAccessInfos)
+ {
+ if (Version == 1)
+ {
+ writer.WriteUInt64(item.Time);
+ writer.WriteUInt64(item.MoofOffset);
+ }
+ else
+ {
+ writer.WriteUInt32((uint)item.Time);
+ writer.WriteUInt32((uint)item.MoofOffset);
+ }
+ var length_size_of_traf_num = LengthSizeOfTrafNum + 1;
+ ControlSizeOf(ref writer, item.TrafNumber, length_size_of_traf_num);
+ var length_size_of_trun_num = LengthSizeOfTrunNum + 1;
+ ControlSizeOf(ref writer, item.TrunNumber, length_size_of_trun_num);
+ var length_size_of_sample_num = LengthSizeOfSampleNum + 1;
+ ControlSizeOf(ref writer, item.SampleNumber, length_size_of_sample_num);
+ }
+ }
+ else
+ {
+ writer.WriteUInt32(0);
+ }
End(ref writer);
}
+ private void ControlSizeOf(ref FMp4MessagePackWriter writer,uint value,int length)
+ {
+ switch (length)
+ {
+ case 1:
+ writer.WriteByte((byte)value);
+ break;
+ case 2:
+ writer.WriteUInt16((ushort)value);
+ break;
+ case 3:
+ writer.WriteUInt24(value);
+ break;
+ case 4:
+ writer.WriteUInt32(value);
+ break;
+ }
+ }
+
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 0947a76..5ec6575 100644
--- a/src/JT1078.FMp4/Boxs/TrackRunBox.cs
+++ b/src/JT1078.FMp4/Boxs/TrackRunBox.cs
@@ -25,8 +25,12 @@ namespace JT1078.FMp4
/// 可选的
///
public int DataOffset { get; set; }
+ ///
+ /// 可选的
+ ///
public uint FirstSampleFlags { get; set; }
///
+ /// 可选的
/// length:SampleCount
///
public List TrackRunInfos { get; set; }
@@ -35,7 +39,7 @@ namespace JT1078.FMp4
{
Start(ref writer);
WriterFullBoxToBuffer(ref writer);
- //todo: TrackRunBox
+ writer.WriteUInt32(SampleCount);
End(ref writer);
}
diff --git a/src/JT1078.FMp4/JT1078.FMp4.xml b/src/JT1078.FMp4/JT1078.FMp4.xml
index ce55626..fad6173 100644
--- a/src/JT1078.FMp4/JT1078.FMp4.xml
+++ b/src/JT1078.FMp4/JT1078.FMp4.xml
@@ -824,22 +824,22 @@
- 4byte 32-26
+ 26bit
- 4byte 32-28
+ 2bit
- 4byte 32-30
+ 2bit
- 4byte 32-32
+ 2bit
@@ -871,8 +871,14 @@
可选的
+
+
+ 可选的
+
+
+ 可选的
length:SampleCount