106 řádky
3.6 KiB

  1. using JT1078.FMp4.Interfaces;
  2. using JT1078.FMp4.MessagePack;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. namespace JT1078.FMp4
  7. {
  8. /// <summary>
  9. /// tfra
  10. /// </summary>
  11. public class TrackFragmentRandomAccessBox : FullBox, IFMp4MessagePackFormatter
  12. {
  13. /// <summary>
  14. /// tfra
  15. /// </summary>
  16. /// <param name="version"></param>
  17. /// <param name="flags"></param>
  18. public TrackFragmentRandomAccessBox(byte version, uint flags=0) : base("tfra", version, flags)
  19. {
  20. }
  21. public uint TrackID { get; set; }
  22. /// <summary>
  23. /// 26bit
  24. /// </summary>
  25. private uint Reserved { get; set; } = 0;
  26. /// <summary>
  27. /// 2bit
  28. /// </summary>
  29. public byte LengthSizeOfTrafNum { get; set; }
  30. /// <summary>
  31. /// 2bit
  32. /// </summary>
  33. public byte LengthSizeOfTrunNum { get; set; }
  34. /// <summary>
  35. /// 2bit
  36. /// </summary>
  37. public byte LengthSizeOfSampleNum { get; set; }
  38. public uint NumberOfEntry { get; set; }
  39. public List<TrackFragmentRandomAccessInfo> TrackFragmentRandomAccessInfos { get; set; }
  40. public void ToBuffer(ref FMp4MessagePackWriter writer)
  41. {
  42. Start(ref writer);
  43. WriterFullBoxToBuffer(ref writer);
  44. writer.WriteUInt32(TrackID);
  45. writer.WriteUInt32((uint)(LengthSizeOfSampleNum | (LengthSizeOfTrunNum << 2) | (LengthSizeOfTrafNum << 4)));
  46. if(TrackFragmentRandomAccessInfos!=null && TrackFragmentRandomAccessInfos.Count > 0)
  47. {
  48. foreach (var item in TrackFragmentRandomAccessInfos)
  49. {
  50. if (Version == 1)
  51. {
  52. writer.WriteUInt64(item.Time);
  53. writer.WriteUInt64(item.MoofOffset);
  54. }
  55. else
  56. {
  57. writer.WriteUInt32((uint)item.Time);
  58. writer.WriteUInt32((uint)item.MoofOffset);
  59. }
  60. var length_size_of_traf_num = LengthSizeOfTrafNum + 1;
  61. ControlSizeOf(ref writer, item.TrafNumber, length_size_of_traf_num);
  62. var length_size_of_trun_num = LengthSizeOfTrunNum + 1;
  63. ControlSizeOf(ref writer, item.TrunNumber, length_size_of_trun_num);
  64. var length_size_of_sample_num = LengthSizeOfSampleNum + 1;
  65. ControlSizeOf(ref writer, item.SampleNumber, length_size_of_sample_num);
  66. }
  67. }
  68. else
  69. {
  70. writer.WriteUInt32(0);
  71. }
  72. End(ref writer);
  73. }
  74. private void ControlSizeOf(ref FMp4MessagePackWriter writer,uint value,int length)
  75. {
  76. switch (length)
  77. {
  78. case 1:
  79. writer.WriteByte((byte)value);
  80. break;
  81. case 2:
  82. writer.WriteUInt16((ushort)value);
  83. break;
  84. case 3:
  85. writer.WriteUInt24(value);
  86. break;
  87. case 4:
  88. writer.WriteUInt32(value);
  89. break;
  90. }
  91. }
  92. public class TrackFragmentRandomAccessInfo
  93. {
  94. public ulong Time { get; set; }
  95. public ulong MoofOffset { get; set; }
  96. public uint TrafNumber { get; set; }
  97. public uint TrunNumber { get; set; }
  98. public uint SampleNumber { get; set; }
  99. }
  100. }
  101. }