| <!-- go/cmark --> |
| <!--* freshness: {owner: 'hta' reviewed: '2021-05-07'} *--> |
| |
| # PeerConnection and friends |
| |
| The PeerConnection is the C++-level implementation of the Javascript |
| object "RTCPeerConnection" from the |
| [WEBRTC specification](https://w3c.github.io/webrtc-pc/). |
| |
| 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. |
| |