12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_RENDERER_MEDIA_PEERCONNECTION_TRACKER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_RENDERER_MEDIA_PEERCONNECTION_TRACKER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/render_process_observer.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStream.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebFrame; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebRTCICECandidate; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebString; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebRTCSessionDescription; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebUserMediaRequest; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace blink 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace webrtc { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DataChannelInterface; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace webrtc 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RTCMediaConstraints; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RTCPeerConnectionHandler; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class collects data about each peer connection, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sends it to the browser process, and handles messages 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from the browser process. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CONTENT_EXPORT PeerConnectionTracker : public RenderProcessObserver { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PeerConnectionTracker(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Source { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SOURCE_LOCAL, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SOURCE_REMOTE 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Action { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_SET_LOCAL_DESCRIPTION, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_SET_REMOTE_DESCRIPTION, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_CREATE_OFFER, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ACTION_CREATE_ANSWER 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RenderProcessObserver implementation. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The following methods send an update to the browser process when a 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PeerConnection update happens. The caller should call the Track* methods 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // after calling RegisterPeerConnection and before calling 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // UnregisterPeerConnection, otherwise the Track* call has no effect. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when a PeerConnection has been created in Javascript. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should be called once and only once for each PeerConnection. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The |pc_handler| is the handler object associated with the PeerConnection, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the |servers| are the server configurations used to establish the 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // connection, the |constraints| are the media constraints used to initialize 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the PeerConnection, the |frame| is the WebFrame object representing the 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // page in which the PeerConnection is created. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RegisterPeerConnection( 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const webrtc::PeerConnectionInterface::RTCConfiguration& config, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RTCMediaConstraints& constraints, 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebFrame* frame); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when a PeerConnection has been destroyed. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UnregisterPeerConnection(RTCPeerConnectionHandler* pc_handler); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when createOffer/createAnswer has been called. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The |pc_handler| is the handler object associated with the PeerConnection, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the |constraints| is the media constraints used to create the offer/answer. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackCreateOffer(RTCPeerConnectionHandler* pc_handler, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RTCMediaConstraints& constraints); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackCreateAnswer(RTCPeerConnectionHandler* pc_handler, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RTCMediaConstraints& constraints); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when setLocalDescription or setRemoteDescription is called. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackSetSessionDescription( 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRTCSessionDescription& desc, Source source); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when Ice candidates are updated. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackUpdateIce( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const webrtc::PeerConnectionInterface::RTCConfiguration& config, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RTCMediaConstraints& options); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when an Ice candidate is added. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackAddIceCandidate( 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebRTCICECandidate& candidate, 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Source source, 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool succeeded); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when a media stream is added. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackAddStream( 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& stream, Source source); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when a media stream is removed. 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackRemoveStream( 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& stream, Source source); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when a DataChannel is created. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackCreateDataChannel( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const webrtc::DataChannelInterface* data_channel, Source source); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when a PeerConnection has been stopped. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackStop(RTCPeerConnectionHandler* pc_handler); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when the signaling state of a PeerConnection has changed. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackSignalingStateChange( 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCPeerConnectionHandlerClient::SignalingState state); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when the Ice connection state 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of a PeerConnection has changed. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackIceConnectionStateChange( 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState state); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when the Ice gathering state 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of a PeerConnection has changed. 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackIceGatheringStateChange( 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCPeerConnectionHandlerClient::ICEGatheringState state); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when the SetSessionDescription or CreateOffer or 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CreateAnswer callbacks are called. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackSessionDescriptionCallback( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, Action action, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& type, const std::string& value); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when onRenegotiationNeeded is called. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackOnRenegotiationNeeded(RTCPeerConnectionHandler* pc_handler); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends an update when a DTMFSender is created. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackCreateDTMFSender( 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RTCPeerConnectionHandler* pc_handler, 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStreamTrack& track); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Sends an update when getUserMedia is called. 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void TrackGetUserMedia( 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebUserMediaRequest& user_media_request); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Assign a local ID to a peer connection so that the browser process can 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // uniquely identify a peer connection in the renderer process. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int GetNextLocalID(); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IPC Message handler for getting all stats. 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetAllStats(); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Called when the browser process reports a suspend event from the OS. 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void OnSuspend(); 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendPeerConnectionUpdate(RTCPeerConnectionHandler* pc_handler, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& callback_type, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& value); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This map stores the local ID assigned to each RTCPeerConnectionHandler. 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<RTCPeerConnectionHandler*, int> PeerConnectionIdMap; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionIdMap peer_connection_id_map_; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This keeps track of the next available local ID. 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_lid_; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PeerConnectionTracker); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_RENDERER_MEDIA_PEERCONNECTION_TRACKER_H_ 186