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.

147 líneas
3.2KB

  1. #include "rtmp-chunk-header.h"
  2. #include "rtmp-util.h"
  3. // 5.3.1.1. Chunk Basic Header (p12)
  4. /*
  5. 0 1 2 3 4 5 6 7
  6. +-+-+-+-+-+-+-+-+
  7. |fmt| cs id |
  8. +-+-+-+-+-+-+-+-+
  9. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
  10. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  11. |fmt| 0 | cs id - 64 |
  12. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  13. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
  14. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  15. |fmt| 1 | cs id - 64 |
  16. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  17. */
  18. int rtmp_chunk_basic_header_read(const uint8_t* data, uint8_t* fmt, uint32_t* cid)
  19. {
  20. *fmt = data[0] >> 6;
  21. *cid = data[0] & 0x3F;
  22. if (0 == *cid)
  23. {
  24. *cid = 64 + (uint32_t)data[1];
  25. return 2;
  26. }
  27. else if (1 == *cid)
  28. {
  29. *cid = 64 + (uint32_t)data[1] + ((uint32_t)data[2] << 8) /* 256 */;
  30. return 3;
  31. }
  32. else
  33. {
  34. return 1;
  35. }
  36. }
  37. int rtmp_chunk_basic_header_write(uint8_t* out, uint8_t fmt, uint32_t id)
  38. {
  39. if (id >= 64 + 256)
  40. {
  41. *out++ = (fmt << 6) | 1;
  42. *out++ = (uint8_t)((id - 64) & 0xFF);
  43. *out++ = (uint8_t)(((id - 64) >> 8) & 0xFF);
  44. return 3;
  45. }
  46. else if (id >= 64)
  47. {
  48. *out++ = (fmt << 6) | 0;
  49. *out++ = (uint8_t)(id - 64);
  50. return 2;
  51. }
  52. else
  53. {
  54. *out++ = (fmt << 6) | (uint8_t)id;
  55. return 1;
  56. }
  57. }
  58. // 5.3.1.2. Chunk Message Header (p13)
  59. /*
  60. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  61. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  62. | timestamp |message length |
  63. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  64. | message length (cont) |message type id| msg stream id |
  65. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  66. | message stream id (cont) |
  67. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  68. */
  69. int rtmp_chunk_message_header_read(const uint8_t* data, struct rtmp_chunk_header_t* header)
  70. {
  71. int offset = 0;
  72. // timestamp / delta
  73. if (header->fmt <= RTMP_CHUNK_TYPE_2)
  74. {
  75. be_read_uint24(data + offset, &header->timestamp);
  76. offset += 3;
  77. }
  78. // message length + type
  79. if (header->fmt <= RTMP_CHUNK_TYPE_1)
  80. {
  81. be_read_uint24(data + offset, &header->length);
  82. header->type = data[offset + 3];
  83. offset += 4;
  84. }
  85. // message stream id
  86. if (header->fmt == RTMP_CHUNK_TYPE_0)
  87. {
  88. le_read_uint32(data + offset, &header->stream_id);
  89. offset += 4;
  90. }
  91. return offset;
  92. }
  93. int rtmp_chunk_message_header_write(uint8_t* out, const struct rtmp_chunk_header_t* header)
  94. {
  95. const static int s_header_size[] = { 11, 7, 3, 0 };
  96. // timestamp / delta
  97. if (header->fmt <= RTMP_CHUNK_TYPE_2)
  98. {
  99. be_write_uint24(out, header->timestamp >= 0xFFFFFF ? 0xFFFFFF : header->timestamp);
  100. out += 3;
  101. }
  102. // message length + type
  103. if (header->fmt <= RTMP_CHUNK_TYPE_1)
  104. {
  105. be_write_uint24(out, header->length);
  106. out[3] = header->type;
  107. out += 4;
  108. }
  109. // message stream id
  110. if (header->fmt == RTMP_CHUNK_TYPE_0)
  111. {
  112. le_write_uint32(out, header->stream_id);
  113. out += 4;
  114. }
  115. return s_header_size[header->fmt % 4];
  116. }
  117. // 5.3.1.3. Extended Timestamp (p16)
  118. int rtmp_chunk_extended_timestamp_read(const uint8_t* out, uint32_t* timestamp)
  119. {
  120. // extended timestamp
  121. be_read_uint32(out, timestamp);
  122. return 4;
  123. }
  124. int rtmp_chunk_extended_timestamp_write(uint8_t* out, uint32_t timestamp)
  125. {
  126. // extended timestamp
  127. be_write_uint32(out, timestamp);
  128. return 4;
  129. }