您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

188 行
6.0KB

  1. #ifndef ZLMEDIAKIT_SRT_TRANSPORT_H
  2. #define ZLMEDIAKIT_SRT_TRANSPORT_H
  3. #include <atomic>
  4. #include <chrono>
  5. #include <memory>
  6. #include <mutex>
  7. #include "Network/Session.h"
  8. #include "Poller/EventPoller.h"
  9. #include "Poller/Timer.h"
  10. #include "Common/Stamp.h"
  11. #include "Common.hpp"
  12. #include "NackContext.hpp"
  13. #include "Packet.hpp"
  14. #include "PacketQueue.hpp"
  15. #include "PacketSendQueue.hpp"
  16. #include "Statistic.hpp"
  17. namespace SRT {
  18. using namespace toolkit;
  19. extern const std::string kPort;
  20. extern const std::string kTimeOutSec;
  21. extern const std::string kLatencyMul;
  22. extern const std::string kPktBufSize;
  23. class SrtTransport : public std::enable_shared_from_this<SrtTransport> {
  24. public:
  25. friend class SrtSession;
  26. using Ptr = std::shared_ptr<SrtTransport>;
  27. SrtTransport(const EventPoller::Ptr &poller);
  28. virtual ~SrtTransport();
  29. const EventPoller::Ptr &getPoller() const;
  30. void setSession(Session::Ptr session);
  31. const Session::Ptr &getSession() const;
  32. /**
  33. * socket收到udp数据
  34. * @param buf 数据指针
  35. * @param len 数据长度
  36. * @param addr 数据来源地址
  37. */
  38. virtual void inputSockData(uint8_t *buf, int len, struct sockaddr_storage *addr);
  39. virtual void onSendTSData(const Buffer::Ptr &buffer, bool flush);
  40. std::string getIdentifier();
  41. void unregisterSelf();
  42. void unregisterSelfHandshake();
  43. protected:
  44. virtual bool isPusher() { return true; };
  45. virtual void onSRTData(DataPacket::Ptr pkt) {};
  46. virtual void onShutdown(const SockException &ex);
  47. virtual void onHandShakeFinished(std::string &streamid, struct sockaddr_storage *addr) {
  48. _is_handleshake_finished = true;
  49. };
  50. virtual void sendPacket(Buffer::Ptr pkt, bool flush = true);
  51. virtual int getLatencyMul() { return 4; };
  52. virtual int getPktBufSize() { return 8192; };
  53. virtual float getTimeOutSec(){return 5.0;};
  54. private:
  55. void registerSelf();
  56. void registerSelfHandshake();
  57. void switchToOtherTransport(uint8_t *buf, int len, uint32_t socketid, struct sockaddr_storage *addr);
  58. void handleHandshake(uint8_t *buf, int len, struct sockaddr_storage *addr);
  59. void handleHandshakeInduction(HandshakePacket &pkt, struct sockaddr_storage *addr);
  60. void handleHandshakeConclusion(HandshakePacket &pkt, struct sockaddr_storage *addr);
  61. void handleKeeplive(uint8_t *buf, int len, struct sockaddr_storage *addr);
  62. void handleACK(uint8_t *buf, int len, struct sockaddr_storage *addr);
  63. void handleACKACK(uint8_t *buf, int len, struct sockaddr_storage *addr);
  64. void handleNAK(uint8_t *buf, int len, struct sockaddr_storage *addr);
  65. void handleCongestionWarning(uint8_t *buf, int len, struct sockaddr_storage *addr);
  66. void handleShutDown(uint8_t *buf, int len, struct sockaddr_storage *addr);
  67. void handleDropReq(uint8_t *buf, int len, struct sockaddr_storage *addr);
  68. void handleUserDefinedType(uint8_t *buf, int len, struct sockaddr_storage *addr);
  69. void handlePeerError(uint8_t *buf, int len, struct sockaddr_storage *addr);
  70. void handleDataPacket(uint8_t *buf, int len, struct sockaddr_storage *addr);
  71. void sendNAKPacket(std::list<PacketQueue::LostPair> &lost_list);
  72. void sendACKPacket();
  73. void sendLightACKPacket();
  74. void sendKeepLivePacket();
  75. void sendShutDown();
  76. void sendMsgDropReq(uint32_t first, uint32_t last);
  77. size_t getPayloadSize();
  78. void createTimerForCheckAlive();
  79. void checkAndSendAckNak();
  80. protected:
  81. void sendDataPacket(DataPacket::Ptr pkt, char *buf, int len, bool flush = false);
  82. void sendControlPacket(ControlPacket::Ptr pkt, bool flush = true);
  83. private:
  84. // 当前选中的udp链接
  85. Session::Ptr _selected_session;
  86. // 链接迁移前后使用过的udp链接
  87. std::unordered_map<Session *, std::weak_ptr<Session>> _history_sessions;
  88. EventPoller::Ptr _poller;
  89. uint32_t _peer_socket_id;
  90. uint32_t _socket_id = 0;
  91. TimePoint _now;
  92. TimePoint _start_timestamp;
  93. // for calculate rtt for delay
  94. TimePoint _induction_ts;
  95. uint32_t _mtu = 1500;
  96. uint32_t _max_window_size = 8192;
  97. uint32_t _init_seq_number = 0;
  98. std::string _stream_id;
  99. uint32_t _sync_cookie = 0;
  100. uint32_t _send_packet_seq_number = 0;
  101. uint32_t _send_msg_number = 1;
  102. PacketSendQueue::Ptr _send_buf;
  103. uint32_t _buf_delay = 120;
  104. PacketQueueInterface::Ptr _recv_buf;
  105. // NackContext _recv_nack;
  106. uint32_t _rtt = 100 * 1000;
  107. uint32_t _rtt_variance = 50 * 1000;
  108. uint32_t _light_ack_pkt_count = 0;
  109. uint32_t _ack_number_count = 0;
  110. uint32_t _last_ack_pkt_seq = 0;
  111. uint32_t _last_recv_ackack_seq_num = 0;
  112. uint32_t _last_pkt_seq = 0;
  113. UTicker _ack_ticker;
  114. std::map<uint32_t, TimePoint> _ack_send_timestamp;
  115. std::shared_ptr<PacketRecvRateContext> _pkt_recv_rate_context;
  116. std::shared_ptr<EstimatedLinkCapacityContext> _estimated_link_capacity_context;
  117. //std::shared_ptr<RecvRateContext> _recv_rate_context;
  118. UTicker _nak_ticker;
  119. // 保持发送的握手消息,防止丢失重发
  120. HandshakePacket::Ptr _handleshake_res;
  121. Timer::Ptr _handleshake_timer;
  122. ResourcePool<BufferRaw> _packet_pool;
  123. //检测超时的定时器
  124. Timer::Ptr _timer;
  125. //刷新计时器
  126. Ticker _alive_ticker;
  127. bool _is_handleshake_finished = false;
  128. };
  129. class SrtTransportManager {
  130. public:
  131. static SrtTransportManager &Instance();
  132. SrtTransport::Ptr getItem(const std::string &key);
  133. void addItem(const std::string &key, const SrtTransport::Ptr &ptr);
  134. void removeItem(const std::string &key);
  135. void addHandshakeItem(const std::string &key, const SrtTransport::Ptr &ptr);
  136. void removeHandshakeItem(const std::string &key);
  137. SrtTransport::Ptr getHandshakeItem(const std::string &key);
  138. private:
  139. SrtTransportManager() = default;
  140. private:
  141. std::mutex _mtx;
  142. std::unordered_map<std::string, std::weak_ptr<SrtTransport>> _map;
  143. std::mutex _handshake_mtx;
  144. std::unordered_map<std::string, std::weak_ptr<SrtTransport>> _handshake_map;
  145. };
  146. } // namespace SRT
  147. #endif // ZLMEDIAKIT_SRT_TRANSPORT_H