1 /* 2 * libjingle 3 * Copyright 2012 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 // This file contains the PeerConnection interface as defined in 29 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#peer-to-peer-connections. 30 // Applications must use this interface to implement peerconnection. 31 // PeerConnectionFactory class provides factory methods to create 32 // peerconnection, mediastream and media tracks objects. 33 // 34 // The Following steps are needed to setup a typical call using Jsep. 35 // 1. Create a PeerConnectionFactoryInterface. Check constructors for more 36 // information about input parameters. 37 // 2. Create a PeerConnection object. Provide a configuration string which 38 // points either to stun or turn server to generate ICE candidates and provide 39 // an object that implements the PeerConnectionObserver interface. 40 // 3. Create local MediaStream and MediaTracks using the PeerConnectionFactory 41 // and add it to PeerConnection by calling AddStream. 42 // 4. Create an offer and serialize it and send it to the remote peer. 43 // 5. Once an ice candidate have been found PeerConnection will call the 44 // observer function OnIceCandidate. The candidates must also be serialized and 45 // sent to the remote peer. 46 // 6. Once an answer is received from the remote peer, call 47 // SetLocalSessionDescription with the offer and SetRemoteSessionDescription 48 // with the remote answer. 49 // 7. Once a remote candidate is received from the remote peer, provide it to 50 // the peerconnection by calling AddIceCandidate. 51 52 53 // The Receiver of a call can decide to accept or reject the call. 54 // This decision will be taken by the application not peerconnection. 55 // If application decides to accept the call 56 // 1. Create PeerConnectionFactoryInterface if it doesn't exist. 57 // 2. Create a new PeerConnection. 58 // 3. Provide the remote offer to the new PeerConnection object by calling 59 // SetRemoteSessionDescription. 60 // 4. Generate an answer to the remote offer by calling CreateAnswer and send it 61 // back to the remote peer. 62 // 5. Provide the local answer to the new PeerConnection by calling 63 // SetLocalSessionDescription with the answer. 64 // 6. Provide the remote ice candidates by calling AddIceCandidate. 65 // 7. Once a candidate have been found PeerConnection will call the observer 66 // function OnIceCandidate. Send these candidates to the remote peer. 67 68 #ifndef TALK_APP_WEBRTC_PEERCONNECTIONINTERFACE_H_ 69 #define TALK_APP_WEBRTC_PEERCONNECTIONINTERFACE_H_ 70 71 #include <string> 72 #include <utility> 73 #include <vector> 74 75 #include "talk/app/webrtc/datachannelinterface.h" 76 #include "talk/app/webrtc/dtlsidentitystore.h" 77 #include "talk/app/webrtc/dtmfsenderinterface.h" 78 #include "talk/app/webrtc/dtlsidentitystore.h" 79 #include "talk/app/webrtc/jsep.h" 80 #include "talk/app/webrtc/mediastreaminterface.h" 81 #include "talk/app/webrtc/rtpreceiverinterface.h" 82 #include "talk/app/webrtc/rtpsenderinterface.h" 83 #include "talk/app/webrtc/statstypes.h" 84 #include "talk/app/webrtc/umametrics.h" 85 #include "webrtc/base/fileutils.h" 86 #include "webrtc/base/network.h" 87 #include "webrtc/base/rtccertificate.h" 88 #include "webrtc/base/sslstreamadapter.h" 89 #include "webrtc/base/socketaddress.h" 90 #include "webrtc/p2p/base/portallocator.h" 91 92 namespace rtc { 93 class SSLIdentity; 94 class Thread; 95 } 96 97 namespace cricket { 98 class WebRtcVideoDecoderFactory; 99 class WebRtcVideoEncoderFactory; 100 } 101 102 namespace webrtc { 103 class AudioDeviceModule; 104 class MediaConstraintsInterface; 105 106 // MediaStream container interface. 107 class StreamCollectionInterface : public rtc::RefCountInterface { 108 public: 109 // TODO(ronghuawu): Update the function names to c++ style, e.g. find -> Find. 110 virtual size_t count() = 0; 111 virtual MediaStreamInterface* at(size_t index) = 0; 112 virtual MediaStreamInterface* find(const std::string& label) = 0; 113 virtual MediaStreamTrackInterface* FindAudioTrack( 114 const std::string& id) = 0; 115 virtual MediaStreamTrackInterface* FindVideoTrack( 116 const std::string& id) = 0; 117 118 protected: 119 // Dtor protected as objects shouldn't be deleted via this interface. 120 ~StreamCollectionInterface() {} 121 }; 122 123 class StatsObserver : public rtc::RefCountInterface { 124 public: 125 virtual void OnComplete(const StatsReports& reports) = 0; 126 127 protected: 128 virtual ~StatsObserver() {} 129 }; 130 131 class MetricsObserverInterface : public rtc::RefCountInterface { 132 public: 133 134 // |type| is the type of the enum counter to be incremented. |counter| 135 // is the particular counter in that type. |counter_max| is the next sequence 136 // number after the highest counter. 137 virtual void IncrementEnumCounter(PeerConnectionEnumCounterType type, 138 int counter, 139 int counter_max) {} 140 141 // This is used to handle sparse counters like SSL cipher suites. 142 // TODO(guoweis): Remove the implementation once the dependency's interface 143 // definition is updated. 144 virtual void IncrementSparseEnumCounter(PeerConnectionEnumCounterType type, 145 int counter) { 146 IncrementEnumCounter(type, counter, 0 /* Ignored */); 147 } 148 149 virtual void AddHistogramSample(PeerConnectionMetricsName type, 150 int value) = 0; 151 152 protected: 153 virtual ~MetricsObserverInterface() {} 154 }; 155 156 typedef MetricsObserverInterface UMAObserver; 157 158 class PeerConnectionInterface : public rtc::RefCountInterface { 159 public: 160 // See http://dev.w3.org/2011/webrtc/editor/webrtc.html#state-definitions . 161 enum SignalingState { 162 kStable, 163 kHaveLocalOffer, 164 kHaveLocalPrAnswer, 165 kHaveRemoteOffer, 166 kHaveRemotePrAnswer, 167 kClosed, 168 }; 169 170 // TODO(bemasc): Remove IceState when callers are changed to 171 // IceConnection/GatheringState. 172 enum IceState { 173 kIceNew, 174 kIceGathering, 175 kIceWaiting, 176 kIceChecking, 177 kIceConnected, 178 kIceCompleted, 179 kIceFailed, 180 kIceClosed, 181 }; 182 183 enum IceGatheringState { 184 kIceGatheringNew, 185 kIceGatheringGathering, 186 kIceGatheringComplete 187 }; 188 189 enum IceConnectionState { 190 kIceConnectionNew, 191 kIceConnectionChecking, 192 kIceConnectionConnected, 193 kIceConnectionCompleted, 194 kIceConnectionFailed, 195 kIceConnectionDisconnected, 196 kIceConnectionClosed, 197 kIceConnectionMax, 198 }; 199 200 struct IceServer { 201 // TODO(jbauch): Remove uri when all code using it has switched to urls. 202 std::string uri; 203 std::vector<std::string> urls; 204 std::string username; 205 std::string password; 206 }; 207 typedef std::vector<IceServer> IceServers; 208 209 enum IceTransportsType { 210 // TODO(pthatcher): Rename these kTransporTypeXXX, but update 211 // Chromium at the same time. 212 kNone, 213 kRelay, 214 kNoHost, 215 kAll 216 }; 217 218 // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-08#section-4.1.1 219 enum BundlePolicy { 220 kBundlePolicyBalanced, 221 kBundlePolicyMaxBundle, 222 kBundlePolicyMaxCompat 223 }; 224 225 // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-09#section-4.1.1 226 enum RtcpMuxPolicy { 227 kRtcpMuxPolicyNegotiate, 228 kRtcpMuxPolicyRequire, 229 }; 230 231 enum TcpCandidatePolicy { 232 kTcpCandidatePolicyEnabled, 233 kTcpCandidatePolicyDisabled 234 }; 235 236 enum ContinualGatheringPolicy { 237 GATHER_ONCE, 238 GATHER_CONTINUALLY 239 }; 240 241 // TODO(hbos): Change into class with private data and public getters. 242 struct RTCConfiguration { 243 static const int kUndefined = -1; 244 // Default maximum number of packets in the audio jitter buffer. 245 static const int kAudioJitterBufferMaxPackets = 50; 246 // TODO(pthatcher): Rename this ice_transport_type, but update 247 // Chromium at the same time. 248 IceTransportsType type; 249 // TODO(pthatcher): Rename this ice_servers, but update Chromium 250 // at the same time. 251 IceServers servers; 252 BundlePolicy bundle_policy; 253 RtcpMuxPolicy rtcp_mux_policy; 254 TcpCandidatePolicy tcp_candidate_policy; 255 int audio_jitter_buffer_max_packets; 256 bool audio_jitter_buffer_fast_accelerate; 257 int ice_connection_receiving_timeout; // ms 258 int ice_backup_candidate_pair_ping_interval; // ms 259 ContinualGatheringPolicy continual_gathering_policy; 260 std::vector<rtc::scoped_refptr<rtc::RTCCertificate>> certificates; 261 bool disable_prerenderer_smoothing; 262 RTCConfiguration() 263 : type(kAll), 264 bundle_policy(kBundlePolicyBalanced), 265 rtcp_mux_policy(kRtcpMuxPolicyNegotiate), 266 tcp_candidate_policy(kTcpCandidatePolicyEnabled), 267 audio_jitter_buffer_max_packets(kAudioJitterBufferMaxPackets), 268 audio_jitter_buffer_fast_accelerate(false), 269 ice_connection_receiving_timeout(kUndefined), 270 ice_backup_candidate_pair_ping_interval(kUndefined), 271 continual_gathering_policy(GATHER_ONCE), 272 disable_prerenderer_smoothing(false) {} 273 }; 274 275 struct RTCOfferAnswerOptions { 276 static const int kUndefined = -1; 277 static const int kMaxOfferToReceiveMedia = 1; 278 279 // The default value for constraint offerToReceiveX:true. 280 static const int kOfferToReceiveMediaTrue = 1; 281 282 int offer_to_receive_video; 283 int offer_to_receive_audio; 284 bool voice_activity_detection; 285 bool ice_restart; 286 bool use_rtp_mux; 287 288 RTCOfferAnswerOptions() 289 : offer_to_receive_video(kUndefined), 290 offer_to_receive_audio(kUndefined), 291 voice_activity_detection(true), 292 ice_restart(false), 293 use_rtp_mux(true) {} 294 295 RTCOfferAnswerOptions(int offer_to_receive_video, 296 int offer_to_receive_audio, 297 bool voice_activity_detection, 298 bool ice_restart, 299 bool use_rtp_mux) 300 : offer_to_receive_video(offer_to_receive_video), 301 offer_to_receive_audio(offer_to_receive_audio), 302 voice_activity_detection(voice_activity_detection), 303 ice_restart(ice_restart), 304 use_rtp_mux(use_rtp_mux) {} 305 }; 306 307 // Used by GetStats to decide which stats to include in the stats reports. 308 // |kStatsOutputLevelStandard| includes the standard stats for Javascript API; 309 // |kStatsOutputLevelDebug| includes both the standard stats and additional 310 // stats for debugging purposes. 311 enum StatsOutputLevel { 312 kStatsOutputLevelStandard, 313 kStatsOutputLevelDebug, 314 }; 315 316 // Accessor methods to active local streams. 317 virtual rtc::scoped_refptr<StreamCollectionInterface> 318 local_streams() = 0; 319 320 // Accessor methods to remote streams. 321 virtual rtc::scoped_refptr<StreamCollectionInterface> 322 remote_streams() = 0; 323 324 // Add a new MediaStream to be sent on this PeerConnection. 325 // Note that a SessionDescription negotiation is needed before the 326 // remote peer can receive the stream. 327 virtual bool AddStream(MediaStreamInterface* stream) = 0; 328 329 // Remove a MediaStream from this PeerConnection. 330 // Note that a SessionDescription negotiation is need before the 331 // remote peer is notified. 332 virtual void RemoveStream(MediaStreamInterface* stream) = 0; 333 334 // Returns pointer to the created DtmfSender on success. 335 // Otherwise returns NULL. 336 virtual rtc::scoped_refptr<DtmfSenderInterface> CreateDtmfSender( 337 AudioTrackInterface* track) = 0; 338 339 // TODO(deadbeef): Make these pure virtual once all subclasses implement them. 340 // |kind| must be "audio" or "video". 341 // |stream_id| is used to populate the msid attribute; if empty, one will 342 // be generated automatically. 343 virtual rtc::scoped_refptr<RtpSenderInterface> CreateSender( 344 const std::string& kind, 345 const std::string& stream_id) { 346 return rtc::scoped_refptr<RtpSenderInterface>(); 347 } 348 349 virtual std::vector<rtc::scoped_refptr<RtpSenderInterface>> GetSenders() 350 const { 351 return std::vector<rtc::scoped_refptr<RtpSenderInterface>>(); 352 } 353 354 virtual std::vector<rtc::scoped_refptr<RtpReceiverInterface>> GetReceivers() 355 const { 356 return std::vector<rtc::scoped_refptr<RtpReceiverInterface>>(); 357 } 358 359 virtual bool GetStats(StatsObserver* observer, 360 MediaStreamTrackInterface* track, 361 StatsOutputLevel level) = 0; 362 363 virtual rtc::scoped_refptr<DataChannelInterface> CreateDataChannel( 364 const std::string& label, 365 const DataChannelInit* config) = 0; 366 367 virtual const SessionDescriptionInterface* local_description() const = 0; 368 virtual const SessionDescriptionInterface* remote_description() const = 0; 369 370 // Create a new offer. 371 // The CreateSessionDescriptionObserver callback will be called when done. 372 virtual void CreateOffer(CreateSessionDescriptionObserver* observer, 373 const MediaConstraintsInterface* constraints) {} 374 375 // TODO(jiayl): remove the default impl and the old interface when chromium 376 // code is updated. 377 virtual void CreateOffer(CreateSessionDescriptionObserver* observer, 378 const RTCOfferAnswerOptions& options) {} 379 380 // Create an answer to an offer. 381 // The CreateSessionDescriptionObserver callback will be called when done. 382 virtual void CreateAnswer(CreateSessionDescriptionObserver* observer, 383 const MediaConstraintsInterface* constraints) = 0; 384 // Sets the local session description. 385 // JsepInterface takes the ownership of |desc| even if it fails. 386 // The |observer| callback will be called when done. 387 virtual void SetLocalDescription(SetSessionDescriptionObserver* observer, 388 SessionDescriptionInterface* desc) = 0; 389 // Sets the remote session description. 390 // JsepInterface takes the ownership of |desc| even if it fails. 391 // The |observer| callback will be called when done. 392 virtual void SetRemoteDescription(SetSessionDescriptionObserver* observer, 393 SessionDescriptionInterface* desc) = 0; 394 // Restarts or updates the ICE Agent process of gathering local candidates 395 // and pinging remote candidates. 396 // TODO(deadbeef): Remove once Chrome is moved over to SetConfiguration. 397 virtual bool UpdateIce(const IceServers& configuration, 398 const MediaConstraintsInterface* constraints) { 399 return false; 400 } 401 // Sets the PeerConnection's global configuration to |config|. 402 // Any changes to STUN/TURN servers or ICE candidate policy will affect the 403 // next gathering phase, and cause the next call to createOffer to generate 404 // new ICE credentials. Note that the BUNDLE and RTCP-multiplexing policies 405 // cannot be changed with this method. 406 // TODO(deadbeef): Make this pure virtual once all Chrome subclasses of 407 // PeerConnectionInterface implement it. 408 virtual bool SetConfiguration( 409 const PeerConnectionInterface::RTCConfiguration& config) { 410 return false; 411 } 412 // Provides a remote candidate to the ICE Agent. 413 // A copy of the |candidate| will be created and added to the remote 414 // description. So the caller of this method still has the ownership of the 415 // |candidate|. 416 // TODO(ronghuawu): Consider to change this so that the AddIceCandidate will 417 // take the ownership of the |candidate|. 418 virtual bool AddIceCandidate(const IceCandidateInterface* candidate) = 0; 419 420 virtual void RegisterUMAObserver(UMAObserver* observer) = 0; 421 422 // Returns the current SignalingState. 423 virtual SignalingState signaling_state() = 0; 424 425 // TODO(bemasc): Remove ice_state when callers are changed to 426 // IceConnection/GatheringState. 427 // Returns the current IceState. 428 virtual IceState ice_state() = 0; 429 virtual IceConnectionState ice_connection_state() = 0; 430 virtual IceGatheringState ice_gathering_state() = 0; 431 432 // Terminates all media and closes the transport. 433 virtual void Close() = 0; 434 435 protected: 436 // Dtor protected as objects shouldn't be deleted via this interface. 437 ~PeerConnectionInterface() {} 438 }; 439 440 // PeerConnection callback interface. Application should implement these 441 // methods. 442 class PeerConnectionObserver { 443 public: 444 enum StateType { 445 kSignalingState, 446 kIceState, 447 }; 448 449 // Triggered when the SignalingState changed. 450 virtual void OnSignalingChange( 451 PeerConnectionInterface::SignalingState new_state) {} 452 453 // Triggered when SignalingState or IceState have changed. 454 // TODO(bemasc): Remove once callers transition to OnSignalingChange. 455 virtual void OnStateChange(StateType state_changed) {} 456 457 // Triggered when media is received on a new stream from remote peer. 458 virtual void OnAddStream(MediaStreamInterface* stream) = 0; 459 460 // Triggered when a remote peer close a stream. 461 virtual void OnRemoveStream(MediaStreamInterface* stream) = 0; 462 463 // Triggered when a remote peer open a data channel. 464 virtual void OnDataChannel(DataChannelInterface* data_channel) = 0; 465 466 // Triggered when renegotiation is needed, for example the ICE has restarted. 467 virtual void OnRenegotiationNeeded() = 0; 468 469 // Called any time the IceConnectionState changes 470 virtual void OnIceConnectionChange( 471 PeerConnectionInterface::IceConnectionState new_state) {} 472 473 // Called any time the IceGatheringState changes 474 virtual void OnIceGatheringChange( 475 PeerConnectionInterface::IceGatheringState new_state) {} 476 477 // New Ice candidate have been found. 478 virtual void OnIceCandidate(const IceCandidateInterface* candidate) = 0; 479 480 // TODO(bemasc): Remove this once callers transition to OnIceGatheringChange. 481 // All Ice candidates have been found. 482 virtual void OnIceComplete() {} 483 484 // Called when the ICE connection receiving status changes. 485 virtual void OnIceConnectionReceivingChange(bool receiving) {} 486 487 protected: 488 // Dtor protected as objects shouldn't be deleted via this interface. 489 ~PeerConnectionObserver() {} 490 }; 491 492 // PeerConnectionFactoryInterface is the factory interface use for creating 493 // PeerConnection, MediaStream and media tracks. 494 // PeerConnectionFactoryInterface will create required libjingle threads, 495 // socket and network manager factory classes for networking. 496 // If an application decides to provide its own threads and network 497 // implementation of these classes it should use the alternate 498 // CreatePeerConnectionFactory method which accepts threads as input and use the 499 // CreatePeerConnection version that takes a PortAllocator as an 500 // argument. 501 class PeerConnectionFactoryInterface : public rtc::RefCountInterface { 502 public: 503 class Options { 504 public: 505 Options() 506 : disable_encryption(false), 507 disable_sctp_data_channels(false), 508 disable_network_monitor(false), 509 network_ignore_mask(rtc::kDefaultNetworkIgnoreMask), 510 ssl_max_version(rtc::SSL_PROTOCOL_DTLS_12) {} 511 bool disable_encryption; 512 bool disable_sctp_data_channels; 513 bool disable_network_monitor; 514 515 // Sets the network types to ignore. For instance, calling this with 516 // ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK will ignore Ethernet and 517 // loopback interfaces. 518 int network_ignore_mask; 519 520 // Sets the maximum supported protocol version. The highest version 521 // supported by both ends will be used for the connection, i.e. if one 522 // party supports DTLS 1.0 and the other DTLS 1.2, DTLS 1.0 will be used. 523 rtc::SSLProtocolVersion ssl_max_version; 524 }; 525 526 virtual void SetOptions(const Options& options) = 0; 527 528 virtual rtc::scoped_refptr<PeerConnectionInterface> CreatePeerConnection( 529 const PeerConnectionInterface::RTCConfiguration& configuration, 530 const MediaConstraintsInterface* constraints, 531 rtc::scoped_ptr<cricket::PortAllocator> allocator, 532 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store, 533 PeerConnectionObserver* observer) = 0; 534 535 virtual rtc::scoped_refptr<MediaStreamInterface> 536 CreateLocalMediaStream(const std::string& label) = 0; 537 538 // Creates a AudioSourceInterface. 539 // |constraints| decides audio processing settings but can be NULL. 540 virtual rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource( 541 const MediaConstraintsInterface* constraints) = 0; 542 543 // Creates a VideoSourceInterface. The new source take ownership of 544 // |capturer|. |constraints| decides video resolution and frame rate but can 545 // be NULL. 546 virtual rtc::scoped_refptr<VideoSourceInterface> CreateVideoSource( 547 cricket::VideoCapturer* capturer, 548 const MediaConstraintsInterface* constraints) = 0; 549 550 // Creates a new local VideoTrack. The same |source| can be used in several 551 // tracks. 552 virtual rtc::scoped_refptr<VideoTrackInterface> 553 CreateVideoTrack(const std::string& label, 554 VideoSourceInterface* source) = 0; 555 556 // Creates an new AudioTrack. At the moment |source| can be NULL. 557 virtual rtc::scoped_refptr<AudioTrackInterface> 558 CreateAudioTrack(const std::string& label, 559 AudioSourceInterface* source) = 0; 560 561 // Starts AEC dump using existing file. Takes ownership of |file| and passes 562 // it on to VoiceEngine (via other objects) immediately, which will take 563 // the ownerhip. If the operation fails, the file will be closed. 564 // TODO(grunell): Remove when Chromium has started to use AEC in each source. 565 // http://crbug.com/264611. 566 virtual bool StartAecDump(rtc::PlatformFile file) = 0; 567 568 // Stops logging the AEC dump. 569 virtual void StopAecDump() = 0; 570 571 // Starts RtcEventLog using existing file. Takes ownership of |file| and 572 // passes it on to VoiceEngine, which will take the ownership. If the 573 // operation fails the file will be closed. The logging will stop 574 // automatically after 10 minutes have passed, or when the StopRtcEventLog 575 // function is called. 576 // This function as well as the StopRtcEventLog don't really belong on this 577 // interface, this is a temporary solution until we move the logging object 578 // from inside voice engine to webrtc::Call, which will happen when the VoE 579 // restructuring effort is further along. 580 // TODO(ivoc): Move this into being: 581 // PeerConnection => MediaController => webrtc::Call. 582 virtual bool StartRtcEventLog(rtc::PlatformFile file) = 0; 583 584 // Stops logging the RtcEventLog. 585 virtual void StopRtcEventLog() = 0; 586 587 protected: 588 // Dtor and ctor protected as objects shouldn't be created or deleted via 589 // this interface. 590 PeerConnectionFactoryInterface() {} 591 ~PeerConnectionFactoryInterface() {} // NOLINT 592 }; 593 594 // Create a new instance of PeerConnectionFactoryInterface. 595 rtc::scoped_refptr<PeerConnectionFactoryInterface> 596 CreatePeerConnectionFactory(); 597 598 // Create a new instance of PeerConnectionFactoryInterface. 599 // Ownership of |factory|, |default_adm|, and optionally |encoder_factory| and 600 // |decoder_factory| transferred to the returned factory. 601 rtc::scoped_refptr<PeerConnectionFactoryInterface> 602 CreatePeerConnectionFactory( 603 rtc::Thread* worker_thread, 604 rtc::Thread* signaling_thread, 605 AudioDeviceModule* default_adm, 606 cricket::WebRtcVideoEncoderFactory* encoder_factory, 607 cricket::WebRtcVideoDecoderFactory* decoder_factory); 608 609 } // namespace webrtc 610 611 #endif // TALK_APP_WEBRTC_PEERCONNECTIONINTERFACE_H_ 612