blob: e114de1b60f7b70c0c972cdbdf056642e8fd6005 [file] [view] [edit]
<!-- go/cmark -->
<!--* freshness: {owner: 'hbos' reviewed: '2026-06-17'} *-->
# 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, LegacyStatsCollector) 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
webrtc::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.