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