PeerConnection and friends
Like many objects in WebRTC, the PeerConnection is used via a factory and an observer:
- PeerConnectionFactory, which is created via a static Create method and takes a PeerConnectionFactoryDependencies structure listing such things as non-default threads and factories for use by all PeerConnections using the same factory. (Using more than one factory should be avoided, since it takes more resources.)
- PeerConnection itself, which is created by the method called PeerConnectionFactory::CreatePeerConnectionOrError, and takes a PeerConnectionInterface::RTCConfiguration argument, as well as a PeerConnectionDependencies (even more factories, plus other stuff).
- PeerConnectionObserver (a member of PeerConnectionDependencies), which contains the functions that will be called on events in the PeerConnection
These types are visible in the API.
Internal structure of PeerConnection and friends
The PeerConnection is, to a large extent, a “God object” - most things that are done in WebRTC require a PeerConnection.
Internally, it is divided into several objects, each with its own responsibilities, all of which are owned by the PeerConnection and live as long as the PeerConnection:
- SdpOfferAnswerHandler takes care of negotiating configurations with a remote peer, using SDP-formatted descriptions.
- RtpTransmissionManager takes care of the lists of RtpSenders, RtpReceivers and RtpTransceivers that form the heart of the transmission service.
- DataChannelController takes care of managing the PeerConnection's DataChannels and its SctpTransport.
- JsepTransportController takes care of configuring the details of senders and receivers.
- Call does management of overall call state.
- RtcStatsCollector (and its obsolete sibling, StatsCollector) collects statistics from all the objects comprising the PeerConnection when requested.
There are a number of other smaller objects that are also owned by the PeerConnection, but it would take too much space to describe them all here; please consult the .h files.
PeerConnectionFactory owns an object called ConnectionContext, and a reference to this is passed to each PeerConnection. It is referenced via an rtc::scoped_refptr, which means that it is guaranteed to be alive as long as either the factory or one of the PeerConnections is using it.