Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

134 строки
3.2KB

  1. #include "HSExt.hpp"
  2. namespace SRT {
  3. bool HSExtMessage::loadFromData(uint8_t *buf, size_t len) {
  4. if (buf == NULL || len != HSEXT_MSG_SIZE) {
  5. return false;
  6. }
  7. _data = BufferRaw::create();
  8. _data->assign((char *)buf, len);
  9. extension_length = 3;
  10. HSExt::loadHeader();
  11. assert(extension_type == SRT_CMD_HSREQ || extension_type == SRT_CMD_HSRSP);
  12. uint8_t *ptr = (uint8_t *)_data->data() + 4;
  13. srt_version = loadUint32(ptr);
  14. ptr += 4;
  15. srt_flag = loadUint32(ptr);
  16. ptr += 4;
  17. recv_tsbpd_delay = loadUint16(ptr);
  18. ptr += 2;
  19. send_tsbpd_delay = loadUint16(ptr);
  20. ptr += 2;
  21. return true;
  22. }
  23. std::string HSExtMessage::dump() {
  24. _StrPrinter printer;
  25. printer << "srt version : " << std::hex << srt_version << " srt flag : " << std::hex << srt_flag
  26. << " recv_tsbpd_delay=" << recv_tsbpd_delay << " send_tsbpd_delay = " << send_tsbpd_delay;
  27. return std::move(printer);
  28. }
  29. bool HSExtMessage::storeToData() {
  30. _data = BufferRaw::create();
  31. _data->setCapacity(HSEXT_MSG_SIZE);
  32. _data->setSize(HSEXT_MSG_SIZE);
  33. extension_length = 3;
  34. HSExt::storeHeader();
  35. uint8_t *ptr = (uint8_t *)_data->data() + 4;
  36. storeUint32(ptr, srt_version);
  37. ptr += 4;
  38. storeUint32(ptr, srt_flag);
  39. ptr += 4;
  40. storeUint16(ptr, recv_tsbpd_delay);
  41. ptr += 2;
  42. storeUint16(ptr, send_tsbpd_delay);
  43. ptr += 2;
  44. return true;
  45. }
  46. bool HSExtStreamID::loadFromData(uint8_t *buf, size_t len) {
  47. if (buf == NULL || len < 4) {
  48. return false;
  49. }
  50. _data = BufferRaw::create();
  51. _data->assign((char *)buf, len);
  52. HSExt::loadHeader();
  53. size_t content_size = extension_length * 4;
  54. if (len < content_size + 4) {
  55. return false;
  56. }
  57. streamid.clear();
  58. char *ptr = _data->data() + 4;
  59. for (size_t i = 0; i < extension_length; ++i) {
  60. streamid.push_back(*(ptr + 3));
  61. streamid.push_back(*(ptr + 2));
  62. streamid.push_back(*(ptr + 1));
  63. streamid.push_back(*(ptr));
  64. ptr += 4;
  65. }
  66. char zero = 0x00;
  67. if (streamid.back() == zero) {
  68. streamid.erase(streamid.find_first_of(zero), streamid.size());
  69. }
  70. return true;
  71. }
  72. bool HSExtStreamID::storeToData() {
  73. size_t content_size = ((streamid.length() + 4) + 3) / 4 * 4;
  74. _data = BufferRaw::create();
  75. _data->setCapacity(content_size);
  76. _data->setSize(content_size);
  77. extension_length = (content_size - 4) / 4;
  78. extension_type = SRT_CMD_SID;
  79. HSExt::storeHeader();
  80. auto ptr = _data->data() + 4;
  81. memset(ptr, 0, extension_length * 4);
  82. const char *src = streamid.c_str();
  83. for (size_t i = 0; i < streamid.length() / 4; ++i) {
  84. *ptr = *(src + 3 + i * 4);
  85. ptr++;
  86. *ptr = *(src + 2 + i * 4);
  87. ptr++;
  88. *ptr = *(src + 1 + i * 4);
  89. ptr++;
  90. *ptr = *(src + 0 + i * 4);
  91. ptr++;
  92. }
  93. ptr += 3;
  94. size_t offset = streamid.length() / 4 * 4;
  95. for (size_t i = 0; i < streamid.length() % 4; ++i) {
  96. *ptr = *(src + offset + i);
  97. ptr -= 1;
  98. }
  99. return true;
  100. }
  101. std::string HSExtStreamID::dump() {
  102. _StrPrinter printer;
  103. printer << " streamid : " << streamid;
  104. return std::move(printer);
  105. }
  106. } // namespace SRT