WebRtcTransport.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. /*
  2. * Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
  3. *
  4. * This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
  5. *
  6. * Use of this source code is governed by MIT-like license that can be found in the
  7. * LICENSE file in the root of the source tree. All contributing project authors
  8. * may be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #pragma once
  11. #include <memory>
  12. #include <string>
  13. #include "DtlsTransport.hpp"
  14. #include "IceServer.hpp"
  15. #include "SrtpSession.hpp"
  16. #include "StunPacket.hpp"
  17. #include "Sdp.h"
  18. #include "Util/mini.h"
  19. #include "Poller/EventPoller.h"
  20. #include "Network/Socket.h"
  21. #include "Network/Session.h"
  22. #include "Nack.h"
  23. #include "TwccContext.h"
  24. #include "SctpAssociation.hpp"
  25. #include "Rtcp/RtcpContext.h"
  26. namespace mediakit {
  27. // RTC配置项目 [AUTO-TRANSLATED:65784416]
  28. // RTC configuration project
  29. namespace Rtc {
  30. extern const std::string kPort;
  31. extern const std::string kTcpPort;
  32. extern const std::string kTimeOutSec;
  33. }//namespace RTC
  34. class WebRtcInterface {
  35. public:
  36. virtual ~WebRtcInterface() = default;
  37. virtual std::string getAnswerSdp(const std::string &offer) = 0;
  38. virtual const std::string& getIdentifier() const = 0;
  39. virtual const std::string& deleteRandStr() const { static std::string s_null; return s_null; }
  40. virtual void setIceCandidate(std::vector<SdpAttrCandidate> cands) {}
  41. virtual void setLocalIp(std::string localIp) {}
  42. virtual void setPreferredTcp(bool flag) {}
  43. };
  44. class WebRtcException : public WebRtcInterface {
  45. public:
  46. WebRtcException(const SockException &ex) : _ex(ex) {};
  47. std::string getAnswerSdp(const std::string &offer) override {
  48. throw _ex;
  49. }
  50. const std::string &getIdentifier() const override {
  51. static std::string s_null;
  52. return s_null;
  53. }
  54. private:
  55. SockException _ex;
  56. };
  57. class WebRtcTransport : public WebRtcInterface, public RTC::DtlsTransport::Listener, public RTC::IceServer::Listener, public std::enable_shared_from_this<WebRtcTransport>
  58. #ifdef ENABLE_SCTP
  59. , public RTC::SctpAssociation::Listener
  60. #endif
  61. {
  62. public:
  63. using Ptr = std::shared_ptr<WebRtcTransport>;
  64. WebRtcTransport(const EventPoller::Ptr &poller);
  65. /**
  66. * 创建对象
  67. * Create object
  68. * [AUTO-TRANSLATED:830344e4]
  69. */
  70. virtual void onCreate();
  71. /**
  72. * 销毁对象
  73. * Destroy object
  74. * [AUTO-TRANSLATED:1016b97b]
  75. */
  76. virtual void onDestory();
  77. /**
  78. * 创建webrtc answer sdp
  79. * @param offer offer sdp
  80. * @return answer sdp
  81. * Create webrtc answer sdp
  82. * @param offer offer sdp
  83. * @return answer sdp
  84. * [AUTO-TRANSLATED:d9b027d7]
  85. */
  86. std::string getAnswerSdp(const std::string &offer) override final;
  87. /**
  88. * 获取对象唯一id
  89. * Get object unique id
  90. * [AUTO-TRANSLATED:9ad519c6]
  91. */
  92. const std::string& getIdentifier() const override;
  93. const std::string& deleteRandStr() const override;
  94. /**
  95. * socket收到udp数据
  96. * @param buf 数据指针
  97. * @param len 数据长度
  98. * @param tuple 数据来源
  99. * Socket receives udp data
  100. * @param buf data pointer
  101. * @param len data length
  102. * @param tuple data source
  103. * [AUTO-TRANSLATED:1ee86069]
  104. */
  105. void inputSockData(char *buf, int len, RTC::TransportTuple *tuple);
  106. /**
  107. * 发送rtp
  108. * @param buf rtcp内容
  109. * @param len rtcp长度
  110. * @param flush 是否flush socket
  111. * @param ctx 用户指针
  112. * Send rtp
  113. * @param buf rtcp content
  114. * @param len rtcp length
  115. * @param flush whether to flush socket
  116. * @param ctx user pointer
  117. * [AUTO-TRANSLATED:aa833695]
  118. */
  119. void sendRtpPacket(const char *buf, int len, bool flush, void *ctx = nullptr);
  120. void sendRtcpPacket(const char *buf, int len, bool flush, void *ctx = nullptr);
  121. void sendDatachannel(uint16_t streamId, uint32_t ppid, const char *msg, size_t len);
  122. const EventPoller::Ptr& getPoller() const;
  123. Session::Ptr getSession() const;
  124. protected:
  125. // // dtls相关的回调 //// [AUTO-TRANSLATED:31a1f32c]
  126. // // dtls related callbacks ////
  127. void OnDtlsTransportConnecting(const RTC::DtlsTransport *dtlsTransport) override;
  128. void OnDtlsTransportConnected(const RTC::DtlsTransport *dtlsTransport,
  129. RTC::SrtpSession::CryptoSuite srtpCryptoSuite,
  130. uint8_t *srtpLocalKey,
  131. size_t srtpLocalKeyLen,
  132. uint8_t *srtpRemoteKey,
  133. size_t srtpRemoteKeyLen,
  134. std::string &remoteCert) override;
  135. void OnDtlsTransportFailed(const RTC::DtlsTransport *dtlsTransport) override;
  136. void OnDtlsTransportClosed(const RTC::DtlsTransport *dtlsTransport) override;
  137. void OnDtlsTransportSendData(const RTC::DtlsTransport *dtlsTransport, const uint8_t *data, size_t len) override;
  138. void OnDtlsTransportApplicationDataReceived(const RTC::DtlsTransport *dtlsTransport, const uint8_t *data, size_t len) override;
  139. protected:
  140. // // ice相关的回调 /// [AUTO-TRANSLATED:30abf693]
  141. // // ice related callbacks ///
  142. void OnIceServerSendStunPacket(const RTC::IceServer *iceServer, const RTC::StunPacket *packet, RTC::TransportTuple *tuple) override;
  143. void OnIceServerConnected(const RTC::IceServer *iceServer) override;
  144. void OnIceServerCompleted(const RTC::IceServer *iceServer) override;
  145. void OnIceServerDisconnected(const RTC::IceServer *iceServer) override;
  146. #ifdef ENABLE_SCTP
  147. void OnSctpAssociationConnecting(RTC::SctpAssociation* sctpAssociation) override;
  148. void OnSctpAssociationConnected(RTC::SctpAssociation* sctpAssociation) override;
  149. void OnSctpAssociationFailed(RTC::SctpAssociation* sctpAssociation) override;
  150. void OnSctpAssociationClosed(RTC::SctpAssociation* sctpAssociation) override;
  151. void OnSctpAssociationSendData(RTC::SctpAssociation* sctpAssociation, const uint8_t* data, size_t len) override;
  152. void OnSctpAssociationMessageReceived(RTC::SctpAssociation *sctpAssociation, uint16_t streamId, uint32_t ppid,
  153. const uint8_t *msg, size_t len) override;
  154. #endif
  155. protected:
  156. virtual void onStartWebRTC() = 0;
  157. virtual void onRtcConfigure(RtcConfigure &configure) const;
  158. virtual void onCheckSdp(SdpType type, RtcSession &sdp) = 0;
  159. virtual void onSendSockData(Buffer::Ptr buf, bool flush = true, RTC::TransportTuple *tuple = nullptr) = 0;
  160. virtual void onRtp(const char *buf, size_t len, uint64_t stamp_ms) = 0;
  161. virtual void onRtcp(const char *buf, size_t len) = 0;
  162. virtual void onShutdown(const SockException &ex) = 0;
  163. virtual void onBeforeEncryptRtp(const char *buf, int &len, void *ctx) = 0;
  164. virtual void onBeforeEncryptRtcp(const char *buf, int &len, void *ctx) = 0;
  165. virtual void onRtcpBye() = 0;
  166. protected:
  167. void sendRtcpRemb(uint32_t ssrc, size_t bit_rate);
  168. void sendRtcpPli(uint32_t ssrc);
  169. private:
  170. void sendSockData(const char *buf, size_t len, RTC::TransportTuple *tuple);
  171. void setRemoteDtlsFingerprint(const RtcSession &remote);
  172. protected:
  173. RtcSession::Ptr _offer_sdp;
  174. RtcSession::Ptr _answer_sdp;
  175. std::shared_ptr<RTC::IceServer> _ice_server;
  176. private:
  177. mutable std::string _delete_rand_str;
  178. std::string _identifier;
  179. EventPoller::Ptr _poller;
  180. std::shared_ptr<RTC::DtlsTransport> _dtls_transport;
  181. std::shared_ptr<RTC::SrtpSession> _srtp_session_send;
  182. std::shared_ptr<RTC::SrtpSession> _srtp_session_recv;
  183. Ticker _ticker;
  184. // 循环池 [AUTO-TRANSLATED:b7059f37]
  185. // Cycle pool
  186. ResourcePool<BufferRaw> _packet_pool;
  187. #ifdef ENABLE_SCTP
  188. RTC::SctpAssociationImp::Ptr _sctp;
  189. #endif
  190. };
  191. class RtpChannel;
  192. class MediaTrack {
  193. public:
  194. using Ptr = std::shared_ptr<MediaTrack>;
  195. const RtcCodecPlan *plan_rtp;
  196. const RtcCodecPlan *plan_rtx;
  197. uint32_t offer_ssrc_rtp = 0;
  198. uint32_t offer_ssrc_rtx = 0;
  199. uint32_t answer_ssrc_rtp = 0;
  200. uint32_t answer_ssrc_rtx = 0;
  201. const RtcMedia *media;
  202. RtpExtContext::Ptr rtp_ext_ctx;
  203. //for send rtp
  204. NackList nack_list;
  205. RtcpContext::Ptr rtcp_context_send;
  206. //for recv rtp
  207. std::unordered_map<std::string/*rid*/, std::shared_ptr<RtpChannel> > rtp_channel;
  208. std::shared_ptr<RtpChannel> getRtpChannel(uint32_t ssrc) const;
  209. };
  210. struct WrappedMediaTrack {
  211. MediaTrack::Ptr track;
  212. explicit WrappedMediaTrack(MediaTrack::Ptr ptr): track(ptr) {}
  213. virtual ~WrappedMediaTrack() {}
  214. virtual void inputRtp(const char *buf, size_t len, uint64_t stamp_ms, RtpHeader *rtp) = 0;
  215. };
  216. struct WrappedRtxTrack: public WrappedMediaTrack {
  217. explicit WrappedRtxTrack(MediaTrack::Ptr ptr)
  218. : WrappedMediaTrack(std::move(ptr)) {}
  219. void inputRtp(const char *buf, size_t len, uint64_t stamp_ms, RtpHeader *rtp) override;
  220. };
  221. class WebRtcTransportImp;
  222. struct WrappedRtpTrack : public WrappedMediaTrack {
  223. explicit WrappedRtpTrack(MediaTrack::Ptr ptr, TwccContext& twcc, WebRtcTransportImp& t)
  224. : WrappedMediaTrack(std::move(ptr))
  225. , _twcc_ctx(twcc)
  226. , _transport(t) {}
  227. TwccContext& _twcc_ctx;
  228. WebRtcTransportImp& _transport;
  229. void inputRtp(const char *buf, size_t len, uint64_t stamp_ms, RtpHeader *rtp) override;
  230. };
  231. class WebRtcTransportImp : public WebRtcTransport {
  232. public:
  233. using Ptr = std::shared_ptr<WebRtcTransportImp>;
  234. ~WebRtcTransportImp() override;
  235. uint64_t getBytesUsage() const;
  236. uint64_t getDuration() const;
  237. bool canSendRtp() const;
  238. bool canRecvRtp() const;
  239. void onSendRtp(const RtpPacket::Ptr &rtp, bool flush, bool rtx = false);
  240. void createRtpChannel(const std::string &rid, uint32_t ssrc, MediaTrack &track);
  241. void removeTuple(RTC::TransportTuple* tuple);
  242. void safeShutdown(const SockException &ex);
  243. void setPreferredTcp(bool flag) override;
  244. void setLocalIp(std::string local_ip) override;
  245. void setIceCandidate(std::vector<SdpAttrCandidate> cands) override;
  246. protected:
  247. void OnIceServerSelectedTuple(const RTC::IceServer *iceServer, RTC::TransportTuple *tuple) override;
  248. WebRtcTransportImp(const EventPoller::Ptr &poller);
  249. void OnDtlsTransportApplicationDataReceived(const RTC::DtlsTransport *dtlsTransport, const uint8_t *data, size_t len) override;
  250. void onStartWebRTC() override;
  251. void onSendSockData(Buffer::Ptr buf, bool flush = true, RTC::TransportTuple *tuple = nullptr) override;
  252. void onCheckSdp(SdpType type, RtcSession &sdp) override;
  253. void onRtcConfigure(RtcConfigure &configure) const override;
  254. void onRtp(const char *buf, size_t len, uint64_t stamp_ms) override;
  255. void onRtcp(const char *buf, size_t len) override;
  256. void onBeforeEncryptRtp(const char *buf, int &len, void *ctx) override;
  257. void onBeforeEncryptRtcp(const char *buf, int &len, void *ctx) override {};
  258. void onCreate() override;
  259. void onDestory() override;
  260. void onShutdown(const SockException &ex) override;
  261. virtual void onRecvRtp(MediaTrack &track, const std::string &rid, RtpPacket::Ptr rtp) {}
  262. void updateTicker();
  263. float getLossRate(TrackType type);
  264. void onRtcpBye() override;
  265. private:
  266. void onSortedRtp(MediaTrack &track, const std::string &rid, RtpPacket::Ptr rtp);
  267. void onSendNack(MediaTrack &track, const FCI_NACK &nack, uint32_t ssrc);
  268. void onSendTwcc(uint32_t ssrc, const std::string &twcc_fci);
  269. void registerSelf();
  270. void unregisterSelf();
  271. void unrefSelf();
  272. void onCheckAnswer(RtcSession &sdp);
  273. private:
  274. bool _preferred_tcp = false;
  275. uint16_t _rtx_seq[2] = {0, 0};
  276. // 用掉的总流量 [AUTO-TRANSLATED:713b61c9]
  277. // Total traffic used
  278. uint64_t _bytes_usage = 0;
  279. // 保持自我强引用 [AUTO-TRANSLATED:c2dc228f]
  280. // Keep self strong reference
  281. Ptr _self;
  282. // 检测超时的定时器 [AUTO-TRANSLATED:a58e1388]
  283. // Timeout detection timer
  284. Timer::Ptr _timer;
  285. // 刷新计时器 [AUTO-TRANSLATED:61eb11e5]
  286. // Refresh timer
  287. Ticker _alive_ticker;
  288. // pli rtcp计时器 [AUTO-TRANSLATED:a1a5fd18]
  289. // pli rtcp timer
  290. Ticker _pli_ticker;
  291. // twcc rtcp发送上下文对象 [AUTO-TRANSLATED:aef6476a]
  292. // twcc rtcp send context object
  293. TwccContext _twcc_ctx;
  294. // 根据发送rtp的track类型获取相关信息 [AUTO-TRANSLATED:ff31c272]
  295. // Get relevant information based on the track type of the sent rtp
  296. MediaTrack::Ptr _type_to_track[2];
  297. // 根据rtcp的ssrc获取相关信息,收发rtp和rtx的ssrc都会记录 [AUTO-TRANSLATED:6c57cd48]
  298. // Get relevant information based on the ssrc of the rtcp, the ssrc of sending and receiving rtp and rtx will be recorded
  299. std::unordered_map<uint32_t/*ssrc*/, MediaTrack::Ptr> _ssrc_to_track;
  300. // 根据接收rtp的pt获取相关信息 [AUTO-TRANSLATED:39e56d7d]
  301. // Get relevant information based on the pt of the received rtp
  302. std::unordered_map<uint8_t/*pt*/, std::unique_ptr<WrappedMediaTrack>> _pt_to_track;
  303. std::vector<SdpAttrCandidate> _cands;
  304. // http访问时的host ip [AUTO-TRANSLATED:e8fe6957]
  305. // Host ip for http access
  306. std::string _local_ip;
  307. };
  308. class WebRtcTransportManager {
  309. public:
  310. friend class WebRtcTransportImp;
  311. static WebRtcTransportManager &Instance();
  312. WebRtcTransportImp::Ptr getItem(const std::string &key);
  313. private:
  314. WebRtcTransportManager() = default;
  315. void addItem(const std::string &key, const WebRtcTransportImp::Ptr &ptr);
  316. void removeItem(const std::string &key);
  317. private:
  318. mutable std::mutex _mtx;
  319. std::unordered_map<std::string, std::weak_ptr<WebRtcTransportImp> > _map;
  320. };
  321. class WebRtcArgs : public std::enable_shared_from_this<WebRtcArgs> {
  322. public:
  323. virtual ~WebRtcArgs() = default;
  324. virtual variant operator[](const std::string &key) const = 0;
  325. };
  326. using onCreateWebRtc = std::function<void(const WebRtcInterface &rtc)>;
  327. class WebRtcPluginManager {
  328. public:
  329. using Plugin = std::function<void(Session &sender, const WebRtcArgs &args, const onCreateWebRtc &cb)>;
  330. using Listener = std::function<void(Session &sender, const std::string &type, const WebRtcArgs &args, const WebRtcInterface &rtc)>;
  331. static WebRtcPluginManager &Instance();
  332. void registerPlugin(const std::string &type, Plugin cb);
  333. void setListener(Listener cb);
  334. void negotiateSdp(Session &sender, const std::string &type, const WebRtcArgs &args, const onCreateWebRtc &cb);
  335. private:
  336. WebRtcPluginManager() = default;
  337. private:
  338. mutable std::mutex _mtx_creator;
  339. Listener _listener;
  340. std::unordered_map<std::string, Plugin> _map_creator;
  341. };
  342. }// namespace mediakit