peerconnection.hpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /**
  2. * Copyright (c) 2019-2021 Paul-Louis Ageneau
  3. *
  4. * This Source Code Form is subject to the terms of the Mozilla Public
  5. * License, v. 2.0. If a copy of the MPL was not distributed with this
  6. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
  7. */
  8. #ifndef RTC_IMPL_PEER_CONNECTION_H
  9. #define RTC_IMPL_PEER_CONNECTION_H
  10. #include "common.hpp"
  11. #include "datachannel.hpp"
  12. #include "dtlstransport.hpp"
  13. #include "icetransport.hpp"
  14. #include "init.hpp"
  15. #include "processor.hpp"
  16. #include "sctptransport.hpp"
  17. #include "track.hpp"
  18. #include "rtc/peerconnection.hpp"
  19. #include <mutex>
  20. #include <shared_mutex>
  21. #include <unordered_map>
  22. #include <vector>
  23. namespace rtc::impl {
  24. struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
  25. using State = rtc::PeerConnection::State;
  26. using IceState = rtc::PeerConnection::IceState;
  27. using GatheringState = rtc::PeerConnection::GatheringState;
  28. using SignalingState = rtc::PeerConnection::SignalingState;
  29. PeerConnection(Configuration config_);
  30. ~PeerConnection();
  31. void close();
  32. void remoteClose();
  33. optional<Description> localDescription() const;
  34. optional<Description> remoteDescription() const;
  35. size_t remoteMaxMessageSize() const;
  36. shared_ptr<IceTransport> initIceTransport();
  37. shared_ptr<DtlsTransport> initDtlsTransport();
  38. shared_ptr<SctpTransport> initSctpTransport();
  39. shared_ptr<IceTransport> getIceTransport() const;
  40. shared_ptr<DtlsTransport> getDtlsTransport() const;
  41. shared_ptr<SctpTransport> getSctpTransport() const;
  42. void closeTransports();
  43. void endLocalCandidates();
  44. void rollbackLocalDescription();
  45. bool checkFingerprint(const std::string &fingerprint) const;
  46. void forwardMessage(message_ptr message);
  47. void forwardMedia(message_ptr message);
  48. void forwardBufferedAmount(uint16_t stream, size_t amount);
  49. shared_ptr<DataChannel> emplaceDataChannel(string label, DataChannelInit init);
  50. std::pair<shared_ptr<DataChannel>, bool> findDataChannel(uint16_t stream);
  51. bool removeDataChannel(uint16_t stream);
  52. uint16_t maxDataChannelStream() const;
  53. void assignDataChannels();
  54. void iterateDataChannels(std::function<void(shared_ptr<DataChannel> channel)> func);
  55. void openDataChannels();
  56. void closeDataChannels();
  57. void remoteCloseDataChannels();
  58. shared_ptr<Track> emplaceTrack(Description::Media description);
  59. void iterateTracks(std::function<void(shared_ptr<Track> track)> func);
  60. void openTracks();
  61. void closeTracks();
  62. void validateRemoteDescription(const Description &description);
  63. void processLocalDescription(Description description);
  64. void processLocalCandidate(Candidate candidate);
  65. void processRemoteDescription(Description description);
  66. void processRemoteCandidate(Candidate candidate);
  67. string localBundleMid() const;
  68. void setMediaHandler(shared_ptr<MediaHandler> handler);
  69. shared_ptr<MediaHandler> getMediaHandler();
  70. void triggerDataChannel(weak_ptr<DataChannel> weakDataChannel);
  71. void triggerTrack(weak_ptr<Track> weakTrack);
  72. void triggerPendingDataChannels();
  73. void triggerPendingTracks();
  74. void flushPendingDataChannels();
  75. void flushPendingTracks();
  76. bool changeState(State newState);
  77. bool changeIceState(IceState newState);
  78. bool changeGatheringState(GatheringState newState);
  79. bool changeSignalingState(SignalingState newState);
  80. void resetCallbacks();
  81. // Helper method for asynchronous callback invocation
  82. template <typename... Args> void trigger(synchronized_callback<Args...> *cb, Args... args) {
  83. try {
  84. (*cb)(std::move(args...));
  85. } catch (const std::exception &e) {
  86. PLOG_WARNING << "Uncaught exception in callback: " << e.what();
  87. }
  88. }
  89. const Configuration config;
  90. std::atomic<State> state = State::New;
  91. std::atomic<IceState> iceState = IceState::New;
  92. std::atomic<GatheringState> gatheringState = GatheringState::New;
  93. std::atomic<SignalingState> signalingState = SignalingState::Stable;
  94. std::atomic<bool> negotiationNeeded = false;
  95. std::atomic<bool> closing = false;
  96. std::mutex signalingMutex;
  97. synchronized_callback<shared_ptr<rtc::DataChannel>> dataChannelCallback;
  98. synchronized_callback<Description> localDescriptionCallback;
  99. synchronized_callback<Candidate> localCandidateCallback;
  100. synchronized_callback<State> stateChangeCallback;
  101. synchronized_callback<IceState> iceStateChangeCallback;
  102. synchronized_callback<GatheringState> gatheringStateChangeCallback;
  103. synchronized_callback<SignalingState> signalingStateChangeCallback;
  104. synchronized_callback<shared_ptr<rtc::Track>> trackCallback;
  105. private:
  106. void updateTrackSsrcCache(const Description &description);
  107. const init_token mInitToken = Init::Instance().token();
  108. const future_certificate_ptr mCertificate;
  109. Processor mProcessor;
  110. optional<Description> mLocalDescription, mRemoteDescription;
  111. optional<Description> mCurrentLocalDescription;
  112. mutable std::mutex mLocalDescriptionMutex, mRemoteDescriptionMutex;
  113. shared_ptr<MediaHandler> mMediaHandler;
  114. mutable std::shared_mutex mMediaHandlerMutex;
  115. shared_ptr<IceTransport> mIceTransport;
  116. shared_ptr<DtlsTransport> mDtlsTransport;
  117. shared_ptr<SctpTransport> mSctpTransport;
  118. std::unordered_map<uint16_t, weak_ptr<DataChannel>> mDataChannels; // by stream ID
  119. std::vector<weak_ptr<DataChannel>> mUnassignedDataChannels;
  120. std::shared_mutex mDataChannelsMutex;
  121. std::unordered_map<string, weak_ptr<Track>> mTracks; // by mid
  122. std::unordered_map<uint32_t, weak_ptr<Track>> mTracksBySsrc; // by SSRC
  123. std::vector<weak_ptr<Track>> mTrackLines; // by SDP order
  124. std::shared_mutex mTracksMutex;
  125. Queue<shared_ptr<DataChannel>> mPendingDataChannels;
  126. Queue<shared_ptr<Track>> mPendingTracks;
  127. };
  128. } // namespace rtc::impl
  129. #endif