peerconnection.hpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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 GatheringState = rtc::PeerConnection::GatheringState;
  27. using SignalingState = rtc::PeerConnection::SignalingState;
  28. PeerConnection(Configuration config_);
  29. ~PeerConnection();
  30. void close();
  31. void remoteClose();
  32. optional<Description> localDescription() const;
  33. optional<Description> remoteDescription() const;
  34. size_t remoteMaxMessageSize() const;
  35. shared_ptr<IceTransport> initIceTransport();
  36. shared_ptr<DtlsTransport> initDtlsTransport();
  37. shared_ptr<SctpTransport> initSctpTransport();
  38. shared_ptr<IceTransport> getIceTransport() const;
  39. shared_ptr<DtlsTransport> getDtlsTransport() const;
  40. shared_ptr<SctpTransport> getSctpTransport() const;
  41. void closeTransports();
  42. void endLocalCandidates();
  43. void rollbackLocalDescription();
  44. bool checkFingerprint(const std::string &fingerprint) const;
  45. void forwardMessage(message_ptr message);
  46. void forwardMedia(message_ptr message);
  47. void forwardBufferedAmount(uint16_t stream, size_t amount);
  48. shared_ptr<DataChannel> emplaceDataChannel(string label, DataChannelInit init);
  49. shared_ptr<DataChannel> findDataChannel(uint16_t stream);
  50. uint16_t maxDataChannelStream() const;
  51. void assignDataChannels();
  52. void iterateDataChannels(std::function<void(shared_ptr<DataChannel> channel)> func);
  53. void cleanupDataChannels();
  54. void openDataChannels();
  55. void closeDataChannels();
  56. void remoteCloseDataChannels();
  57. shared_ptr<Track> emplaceTrack(Description::Media description);
  58. void iterateTracks(std::function<void(shared_ptr<Track> track)> func);
  59. void openTracks();
  60. void closeTracks();
  61. void validateRemoteDescription(const Description &description);
  62. void processLocalDescription(Description description);
  63. void processLocalCandidate(Candidate candidate);
  64. void processRemoteDescription(Description description);
  65. void processRemoteCandidate(Candidate candidate);
  66. string localBundleMid() const;
  67. void setMediaHandler(shared_ptr<MediaHandler> handler);
  68. shared_ptr<MediaHandler> getMediaHandler();
  69. void triggerDataChannel(weak_ptr<DataChannel> weakDataChannel);
  70. void triggerTrack(weak_ptr<Track> weakTrack);
  71. void triggerPendingDataChannels();
  72. void triggerPendingTracks();
  73. void flushPendingDataChannels();
  74. void flushPendingTracks();
  75. bool changeState(State newState);
  76. bool changeGatheringState(GatheringState newState);
  77. bool changeSignalingState(SignalingState newState);
  78. void resetCallbacks();
  79. // Helper method for asynchronous callback invocation
  80. template <typename... Args> void trigger(synchronized_callback<Args...> *cb, Args... args) {
  81. try {
  82. (*cb)(std::move(args...));
  83. } catch (const std::exception &e) {
  84. PLOG_WARNING << "Uncaught exception in callback: " << e.what();
  85. }
  86. }
  87. const Configuration config;
  88. std::atomic<State> state = State::New;
  89. std::atomic<GatheringState> gatheringState = GatheringState::New;
  90. std::atomic<SignalingState> signalingState = SignalingState::Stable;
  91. std::atomic<bool> negotiationNeeded = false;
  92. std::atomic<bool> closing = false;
  93. std::mutex signalingMutex;
  94. synchronized_callback<shared_ptr<rtc::DataChannel>> dataChannelCallback;
  95. synchronized_callback<Description> localDescriptionCallback;
  96. synchronized_callback<Candidate> localCandidateCallback;
  97. synchronized_callback<State> stateChangeCallback;
  98. synchronized_callback<GatheringState> gatheringStateChangeCallback;
  99. synchronized_callback<SignalingState> signalingStateChangeCallback;
  100. synchronized_callback<shared_ptr<rtc::Track>> trackCallback;
  101. private:
  102. void updateTrackSsrcCache(const Description &description);
  103. const init_token mInitToken = Init::Instance().token();
  104. const future_certificate_ptr mCertificate;
  105. Processor mProcessor;
  106. optional<Description> mLocalDescription, mRemoteDescription;
  107. optional<Description> mCurrentLocalDescription;
  108. mutable std::mutex mLocalDescriptionMutex, mRemoteDescriptionMutex;
  109. shared_ptr<MediaHandler> mMediaHandler;
  110. mutable std::shared_mutex mMediaHandlerMutex;
  111. shared_ptr<IceTransport> mIceTransport;
  112. shared_ptr<DtlsTransport> mDtlsTransport;
  113. shared_ptr<SctpTransport> mSctpTransport;
  114. std::unordered_map<uint16_t, weak_ptr<DataChannel>> mDataChannels; // by stream ID
  115. std::vector<weak_ptr<DataChannel>> mUnassignedDataChannels;
  116. std::shared_mutex mDataChannelsMutex;
  117. std::unordered_map<string, weak_ptr<Track>> mTracks; // by mid
  118. std::unordered_map<uint32_t, weak_ptr<Track>> mTracksBySsrc; // by SSRC
  119. std::vector<weak_ptr<Track>> mTrackLines; // by SDP order
  120. std::shared_mutex mTracksMutex;
  121. Queue<shared_ptr<DataChannel>> mPendingDataChannels;
  122. Queue<shared_ptr<Track>> mPendingTracks;
  123. };
  124. } // namespace rtc::impl
  125. #endif