• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_RENDERER_MEDIA_RTC_PEER_CONNECTION_HANDLER_H_
6 #define CONTENT_RENDERER_MEDIA_RTC_PEER_CONNECTION_HANDLER_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/ref_counted.h"
14 #include "content/common/content_export.h"
15 #include "content/renderer/media/webrtc/media_stream_track_metrics.h"
16 #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandler.h"
17 #include "third_party/WebKit/public/platform/WebRTCStatsRequest.h"
18 #include "third_party/WebKit/public/platform/WebRTCStatsResponse.h"
19 
20 namespace blink {
21 class WebFrame;
22 class WebRTCDataChannelHandler;
23 }
24 
25 namespace content {
26 
27 class PeerConnectionDependencyFactory;
28 class PeerConnectionTracker;
29 class RemoteMediaStreamImpl;
30 class WebRtcMediaStreamAdapter;
31 
32 // Mockable wrapper for blink::WebRTCStatsResponse
33 class CONTENT_EXPORT LocalRTCStatsResponse
NON_EXPORTED_BASE(talk_base::RefCountInterface)34     : public NON_EXPORTED_BASE(talk_base::RefCountInterface) {
35  public:
36   explicit LocalRTCStatsResponse(const blink::WebRTCStatsResponse& impl)
37       : impl_(impl) {
38   }
39 
40   virtual blink::WebRTCStatsResponse webKitStatsResponse() const;
41   virtual size_t addReport(blink::WebString type, blink::WebString id,
42                            double timestamp);
43   virtual void addStatistic(size_t report,
44                             blink::WebString name, blink::WebString value);
45 
46  protected:
47   virtual ~LocalRTCStatsResponse() {}
48   // Constructor for creating mocks.
49   LocalRTCStatsResponse() {}
50 
51  private:
52   blink::WebRTCStatsResponse impl_;
53 };
54 
55 // Mockable wrapper for blink::WebRTCStatsRequest
56 class CONTENT_EXPORT LocalRTCStatsRequest
NON_EXPORTED_BASE(talk_base::RefCountInterface)57     : public NON_EXPORTED_BASE(talk_base::RefCountInterface) {
58  public:
59   explicit LocalRTCStatsRequest(blink::WebRTCStatsRequest impl);
60   // Constructor for testing.
61   LocalRTCStatsRequest();
62 
63   virtual bool hasSelector() const;
64   virtual blink::WebMediaStreamTrack component() const;
65   virtual void requestSucceeded(const LocalRTCStatsResponse* response);
66   virtual scoped_refptr<LocalRTCStatsResponse> createResponse();
67 
68  protected:
69   virtual ~LocalRTCStatsRequest();
70 
71  private:
72   blink::WebRTCStatsRequest impl_;
73   talk_base::scoped_refptr<LocalRTCStatsResponse> response_;
74 };
75 
76 // RTCPeerConnectionHandler is a delegate for the RTC PeerConnection API
77 // messages going between WebKit and native PeerConnection in libjingle. It's
78 // owned by WebKit.
79 // WebKit calls all of these methods on the main render thread.
80 // Callbacks to the webrtc::PeerConnectionObserver implementation also occur on
81 // the main render thread.
82 class CONTENT_EXPORT RTCPeerConnectionHandler
NON_EXPORTED_BASE(public blink::WebRTCPeerConnectionHandler)83     : NON_EXPORTED_BASE(public blink::WebRTCPeerConnectionHandler),
84       NON_EXPORTED_BASE(public webrtc::PeerConnectionObserver) {
85  public:
86   RTCPeerConnectionHandler(
87       blink::WebRTCPeerConnectionHandlerClient* client,
88       PeerConnectionDependencyFactory* dependency_factory);
89   virtual ~RTCPeerConnectionHandler();
90 
91   // Destroy all existing RTCPeerConnectionHandler objects.
92   static void DestructAllHandlers();
93 
94   void associateWithFrame(blink::WebFrame* frame);
95 
96   // Initialize method only used for unit test.
97   bool InitializeForTest(
98       const blink::WebRTCConfiguration& server_configuration,
99       const blink::WebMediaConstraints& options,
100       PeerConnectionTracker* peer_connection_tracker);
101 
102   // blink::WebRTCPeerConnectionHandler implementation
103   virtual bool initialize(
104       const blink::WebRTCConfiguration& server_configuration,
105       const blink::WebMediaConstraints& options) OVERRIDE;
106 
107   virtual void createOffer(
108       const blink::WebRTCSessionDescriptionRequest& request,
109       const blink::WebMediaConstraints& options) OVERRIDE;
110   virtual void createAnswer(
111       const blink::WebRTCSessionDescriptionRequest& request,
112       const blink::WebMediaConstraints& options) OVERRIDE;
113 
114   virtual void setLocalDescription(
115       const blink::WebRTCVoidRequest& request,
116       const blink::WebRTCSessionDescription& description) OVERRIDE;
117   virtual void setRemoteDescription(
118         const blink::WebRTCVoidRequest& request,
119         const blink::WebRTCSessionDescription& description) OVERRIDE;
120 
121   virtual blink::WebRTCSessionDescription localDescription()
122       OVERRIDE;
123   virtual blink::WebRTCSessionDescription remoteDescription()
124       OVERRIDE;
125 
126   virtual bool updateICE(
127       const blink::WebRTCConfiguration& server_configuration,
128       const blink::WebMediaConstraints& options) OVERRIDE;
129   virtual bool addICECandidate(
130       const blink::WebRTCICECandidate& candidate) OVERRIDE;
131   virtual bool addICECandidate(
132       const blink::WebRTCVoidRequest& request,
133       const blink::WebRTCICECandidate& candidate) OVERRIDE;
134   virtual void OnaddICECandidateResult(const blink::WebRTCVoidRequest& request,
135                                        bool result);
136 
137   virtual bool addStream(
138       const blink::WebMediaStream& stream,
139       const blink::WebMediaConstraints& options) OVERRIDE;
140   virtual void removeStream(
141       const blink::WebMediaStream& stream) OVERRIDE;
142   virtual void getStats(
143       const blink::WebRTCStatsRequest& request) OVERRIDE;
144   virtual blink::WebRTCDataChannelHandler* createDataChannel(
145       const blink::WebString& label,
146       const blink::WebRTCDataChannelInit& init) OVERRIDE;
147   virtual blink::WebRTCDTMFSenderHandler* createDTMFSender(
148       const blink::WebMediaStreamTrack& track) OVERRIDE;
149   virtual void stop() OVERRIDE;
150 
151   // webrtc::PeerConnectionObserver implementation
152   virtual void OnError() OVERRIDE;
153   // Triggered when the SignalingState changed.
154   virtual void OnSignalingChange(
155       webrtc::PeerConnectionInterface::SignalingState new_state) OVERRIDE;
156   virtual void OnAddStream(webrtc::MediaStreamInterface* stream) OVERRIDE;
157   virtual void OnRemoveStream(webrtc::MediaStreamInterface* stream) OVERRIDE;
158   virtual void OnIceCandidate(
159       const webrtc::IceCandidateInterface* candidate) OVERRIDE;
160   virtual void OnIceConnectionChange(
161       webrtc::PeerConnectionInterface::IceConnectionState new_state) OVERRIDE;
162   virtual void OnIceGatheringChange(
163       webrtc::PeerConnectionInterface::IceGatheringState new_state) OVERRIDE;
164 
165   virtual void OnDataChannel(
166       webrtc::DataChannelInterface* data_channel) OVERRIDE;
167   virtual void OnRenegotiationNeeded() OVERRIDE;
168 
169   // Delegate functions to allow for mocking of WebKit interfaces.
170   // getStats takes ownership of request parameter.
171   virtual void getStats(LocalRTCStatsRequest* request);
172 
173   // Calls GetStats on |native_peer_connection_|.
174   void GetStats(webrtc::StatsObserver* observer,
175                 webrtc::MediaStreamTrackInterface* track,
176                 webrtc::PeerConnectionInterface::StatsOutputLevel level);
177 
178   PeerConnectionTracker* peer_connection_tracker();
179 
180  protected:
181   webrtc::PeerConnectionInterface* native_peer_connection() {
182     return native_peer_connection_.get();
183   }
184 
185  private:
186   webrtc::SessionDescriptionInterface* CreateNativeSessionDescription(
187       const blink::WebRTCSessionDescription& description,
188       webrtc::SdpParseError* error);
189 
190   // |client_| is a weak pointer, and is valid until stop() has returned.
191   blink::WebRTCPeerConnectionHandlerClient* client_;
192 
193   // |dependency_factory_| is a raw pointer, and is valid for the lifetime of
194   // RenderThreadImpl.
195   PeerConnectionDependencyFactory* dependency_factory_;
196 
197   blink::WebFrame* frame_;
198 
199   ScopedVector<WebRtcMediaStreamAdapter> local_streams_;
200 
201   PeerConnectionTracker* peer_connection_tracker_;
202 
203   MediaStreamTrackMetrics track_metrics_;
204 
205   // Counter for a UMA stat reported at destruction time.
206   int num_data_channels_created_;
207 
208   // |native_peer_connection_| is the libjingle native PeerConnection object.
209   scoped_refptr<webrtc::PeerConnectionInterface> native_peer_connection_;
210 
211   typedef std::map<webrtc::MediaStreamInterface*,
212       content::RemoteMediaStreamImpl*> RemoteStreamMap;
213   RemoteStreamMap remote_streams_;
214   scoped_refptr<webrtc::UMAObserver> uma_observer_;
215 
216   DISALLOW_COPY_AND_ASSIGN(RTCPeerConnectionHandler);
217 };
218 
219 }  // namespace content
220 
221 #endif  // CONTENT_RENDERER_MEDIA_RTC_PEER_CONNECTION_HANDLER_H_
222