Index: remoting/protocol/webrtc_transport.h |
diff --git a/remoting/protocol/webrtc_transport.h b/remoting/protocol/webrtc_transport.h |
index df3d21e992eccf550674b8b9e22201b869a554e1..ad1cf0c270b0d5ea5b91a233f846b0182d24a508 100644 |
--- a/remoting/protocol/webrtc_transport.h |
+++ b/remoting/protocol/webrtc_transport.h |
@@ -21,18 +21,13 @@ |
#include "remoting/signaling/signal_strategy.h" |
#include "third_party/webrtc/api/peerconnectioninterface.h" |
-namespace webrtc { |
-class FakeAudioDeviceModule; |
-} // namespace webrtc |
- |
namespace remoting { |
namespace protocol { |
class TransportContext; |
class MessagePipe; |
-class WebrtcTransport : public Transport, |
- public webrtc::PeerConnectionObserver { |
+class WebrtcTransport : public Transport { |
public: |
class EventHandler { |
public: |
@@ -70,12 +65,8 @@ class WebrtcTransport : public Transport, |
EventHandler* event_handler); |
~WebrtcTransport() override; |
- webrtc::PeerConnectionInterface* peer_connection() { |
- return peer_connection_; |
- } |
- webrtc::PeerConnectionFactoryInterface* peer_connection_factory() { |
- return peer_connection_factory_; |
- } |
+ webrtc::PeerConnectionInterface* peer_connection(); |
+ webrtc::PeerConnectionFactoryInterface* peer_connection_factory(); |
remoting::WebrtcVideoEncoderFactory* video_encoder_factory() { |
return video_encoder_factory_; |
} |
@@ -92,6 +83,13 @@ class WebrtcTransport : public Transport, |
void Close(ErrorCode error); |
private: |
+ // PeerConnectionWrapper is responsible for PeerConnection creation, |
+ // ownership. It passes all events to the corresponding methods below. This is |
+ // necessary to make it possible to close and destroy PeerConnection |
+ // asynchronously, as it may be on stack when the transport is destroyed. |
+ class PeerConnectionWrapper; |
+ friend class PeerConnectionWrapper; |
+ |
void OnLocalSessionDescriptionCreated( |
std::unique_ptr<webrtc::SessionDescriptionInterface> description, |
const std::string& error); |
@@ -100,21 +98,21 @@ class WebrtcTransport : public Transport, |
bool success, |
const std::string& error); |
- // webrtc::PeerConnectionObserver interface. |
+ // PeerConnection event handlers, called by PeerConnectionWrapper. |
void OnSignalingChange( |
- webrtc::PeerConnectionInterface::SignalingState new_state) override; |
+ webrtc::PeerConnectionInterface::SignalingState new_state); |
void OnAddStream( |
- rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override; |
+ rtc::scoped_refptr<webrtc::MediaStreamInterface> stream); |
void OnRemoveStream( |
- rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override; |
+ rtc::scoped_refptr<webrtc::MediaStreamInterface> stream); |
void OnDataChannel( |
- rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) override; |
- void OnRenegotiationNeeded() override; |
+ rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel); |
+ void OnRenegotiationNeeded(); |
void OnIceConnectionChange( |
- webrtc::PeerConnectionInterface::IceConnectionState new_state) override; |
+ webrtc::PeerConnectionInterface::IceConnectionState new_state); |
void OnIceGatheringChange( |
- webrtc::PeerConnectionInterface::IceGatheringState new_state) override; |
- void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override; |
+ webrtc::PeerConnectionInterface::IceGatheringState new_state); |
+ void OnIceCandidate(const webrtc::IceCandidateInterface* candidate); |
void RequestNegotiation(); |
void SendOffer(); |
@@ -131,11 +129,7 @@ class WebrtcTransport : public Transport, |
crypto::HMAC handshake_hmac_; |
- std::unique_ptr<webrtc::FakeAudioDeviceModule> fake_audio_device_module_; |
- |
- rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> |
- peer_connection_factory_; |
- rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; |
+ std::unique_ptr<PeerConnectionWrapper> peer_connection_wrapper_; |
remoting::WebrtcVideoEncoderFactory* video_encoder_factory_; |