No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

106 líneas
3.2 KiB

  1. using JT1078.FMp4.Buffers;
  2. using System;
  3. using System.Buffers.Binary;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. namespace JT1078.FMp4.MessagePack
  7. {
  8. public ref struct FMp4MessagePackWriter
  9. {
  10. private FMp4BufferWriter writer;
  11. public FMp4MessagePackWriter(Span<byte> buffer)
  12. {
  13. this.writer = new FMp4BufferWriter(buffer);
  14. }
  15. public byte[] FlushAndGetArray()
  16. {
  17. return writer.Written.ToArray();
  18. }
  19. public void WriteByte(byte value)
  20. {
  21. var span = writer.Free;
  22. span[0] = value;
  23. writer.Advance(1);
  24. }
  25. public void WriteUInt16(ushort value)
  26. {
  27. BinaryPrimitives.WriteUInt16BigEndian(writer.Free, value);
  28. writer.Advance(2);
  29. }
  30. public void WriteInt32(int value)
  31. {
  32. BinaryPrimitives.WriteInt32BigEndian(writer.Free, value);
  33. writer.Advance(4);
  34. }
  35. public void WriteUInt64(ulong value)
  36. {
  37. BinaryPrimitives.WriteUInt64BigEndian(writer.Free, value);
  38. writer.Advance(8);
  39. }
  40. public void WriteUInt32(uint value)
  41. {
  42. BinaryPrimitives.WriteUInt32BigEndian(writer.Free, value);
  43. writer.Advance(4);
  44. }
  45. public void WriteASCII(string value)
  46. {
  47. var data = Encoding.ASCII.GetBytes(value);
  48. data.CopyTo(writer.Free);
  49. writer.Advance(data.Length);
  50. }
  51. public void WriteArray(ReadOnlySpan<byte> src)
  52. {
  53. src.CopyTo(writer.Free);
  54. writer.Advance(src.Length);
  55. }
  56. public void Skip(int count, out int position)
  57. {
  58. position = writer.WrittenCount;
  59. byte[] tmp = new byte[count];
  60. tmp.CopyTo(writer.Free);
  61. writer.Advance(count);
  62. }
  63. public void WriteUInt16Return(ushort value, int position)
  64. {
  65. BinaryPrimitives.WriteUInt16BigEndian(writer.Written.Slice(position, 2), value);
  66. }
  67. public void WriteInt32Return(int value, int position)
  68. {
  69. BinaryPrimitives.WriteInt32BigEndian(writer.Written.Slice(position, 4), value);
  70. }
  71. public void WriteUInt32Return(uint value, int position)
  72. {
  73. BinaryPrimitives.WriteUInt32BigEndian(writer.Written.Slice(position, 4), value);
  74. }
  75. public void WriteByteReturn(byte value, int position)
  76. {
  77. writer.Written[position] = value;
  78. }
  79. public int GetCurrentPosition()
  80. {
  81. return writer.WrittenCount;
  82. }
  83. /// <summary>
  84. /// ref
  85. /// <see cref="https://github.com/sannies/JT1078.FMp4/blob/master/isoparser/src/main/java/org/JT1078.FMp4/tools/IsoTypeWriter.java"/>
  86. /// </summary>
  87. /// <param name="language"></param>
  88. public void WriteIso639(string language)
  89. {
  90. byte[] bytes= Encoding.UTF8.GetBytes(language);
  91. int bits = 0;
  92. for (int i = 0; i < 3; i++)
  93. {
  94. bits += (bytes[i] - 0x60) << (2 - i) * 5;
  95. }
  96. WriteUInt16((ushort)bits);
  97. }
  98. }
  99. }