#include #include namespace rtcutil { class ConductorObserver { public: enum class ErrorType { WARNING, RECEIVE_OFFER, RECEIVE_ICE_CANDIDATE, CREATE_ANSWER, }; virtual void onError(ErrorType type, std::string err); virtual void onIceCandidate(std::string mid, int index, std::string sdp) = 0; virtual void onAnswer(std::string sdp) = 0; virtual void onRemoteTrack(rtc::scoped_refptr track) = 0; virtual void removeRemoteTrack(rtc::scoped_refptr track) = 0; }; class Conductor: public webrtc::PeerConnectionObserver, public webrtc::CreateSessionDescriptionObserver { public: Conductor(ConductorObserver &observer): observer_(observer) {} void receiveOffer(const std::string &sdp); void receiveOffer(std::unique_ptr offer); void receiveIceCandidate(std::string mid, int index, std::string sdp); void ensurePeerConnection(); protected: // PeerConnectionObserver void OnAddTrack( rtc::scoped_refptr receiver, const std::vector> &streams) override; void OnRemoveTrack( rtc::scoped_refptr receiver) override; void OnIceCandidate(const webrtc::IceCandidateInterface *candidate) override; void OnSignalingChange( webrtc::PeerConnectionInterface::SignalingState new_state) override {} void OnDataChannel( rtc::scoped_refptr channel) override {} void OnRenegotiationNeeded() override {} void OnIceConnectionChange( webrtc::PeerConnectionInterface::IceConnectionState new_state) override {} void OnIceGatheringChange( webrtc::PeerConnectionInterface::IceGatheringState new_state) override {} void OnIceConnectionReceivingChange(bool receiving) override {} // CreateSessionDescriptionObserver void OnSuccess(webrtc::SessionDescriptionInterface* desc) override; void OnFailure(webrtc::RTCError error) override; // Overridables for consumers virtual rtc::scoped_refptr doCreatePeerConnectionFactory(); virtual rtc::scoped_refptr doCreatePeerConnection(webrtc::PeerConnectionFactoryInterface &factory); virtual void doAddTracks(webrtc::PeerConnectionInterface &conn) {}; ConductorObserver &observer_; rtc::scoped_refptr peer_conn_factory_; rtc::scoped_refptr peer_conn_; }; }