blob: b76918a34b232b5160aa55cc7d7760b43b4bdbd5 [file] [view]
<!-- go/cmark -->
<!--* freshness: {owner: 'tommi' reviewed: '2026-09-03'} *-->
# WebRTC incoming RTP packet flow
This document details the flow of incoming (receive) RTP packets across the
WebRTC codebase, tracing the path from the network socket to the video receive
stream.
## Threading Model
- **Network Thread**: The entire receive, demuxing, and packet delivery flow
occurs synchronously on the network thread to minimize delays (webrtc:11993).
- **Worker / Decoder Threads**: Frame decoding, media processing, and playback
dispatch.
______________________________________________________________________
## Call Stack and Component Flow
### 1. Network / Socket Layer 🌐 *(Network Thread)*
Packets arrive from the network via UDP or TCP sockets. Platform-specific socket
implementations trigger an event when bytes are ready to be read.
- **`AsyncUDPSocket` / `PhysicalSocket`**
- `OnReadEvent`
### 2. Transport Routing 🛤️ *(Network Thread)*
The bytes move up through the ICE/STUN/TURN connection channels and DTLS layer.
- **`P2PTransportChannel`** -> `OnReadPacket`
- Routes via **`Connection::OnReadPacket`**
- **`DtlsTransport`** -> `OnReadPacket`
- Decrypts SRTP packets into cleartext bytes if necessary.
### 3. RTP Transport & Parsing 📦 *(Network Thread)*
The raw bytes reach the RTP core structures where they are parsed into proper
C++ WebRTC objects.
- **`RtpTransport::OnRtpPacketReceived(const ReceivedIpPacket&)`**
- Converts the byte buffer string into a `RtpPacketReceived`.
- Extracts header extensions based on the active `RtpHeaderExtensionMap`.
- **`RtpTransport::DemuxPacket`**
- Passes the parsed object down to the demuxer tree.
### 4. RTP Demuxer (Level 1) 🔀 *(Network Thread)*
- **`RtpDemuxer::OnRtpPacket(const RtpPacketReceived&)`**
- **Demuxing Happens Here**: This demuxer maps the packet using rules like
**MID**, **RSID**, or **SSRC**.
- Routes the packet to the matched `RtpPacketSinkInterface` (usually a
`BaseChannel`).
### 5. BaseChannel & Media Layer 📺 *(Network Thread)*
- **`BaseChannel::OnRtpPacket(const RtpPacketReceived&)`**
- Implements `RtpPacketSinkInterface`. Serves as the base conduit for specific
Media Channels (audio or video).
- **`WebRtcVideoReceiveChannel::OnPacketReceived(RtpPacketReceived)`**
- Delegates the received packet directly up to the `Call` interface:
`call_->Receiver()->DeliverRtpPacket(...)`
### 6. Call Interface & Demuxer (Level 2) 📞 *(Network Thread)*
- **`Call::DeliverRtpPacket`**
- Executes inline on the Network Thread without a thread hop.
- Employs `RtpStreamReceiverController` to resolve the sink for the SSRC.
- Passes the packet directly to the appropriate video or audio receive stream.
### 7. Stream Receiver 📥 *(Network Thread)*
- **`RtpVideoStreamReceiver2::OnRtpPacket(const RtpPacketReceived&)`**
- Executes on the Network Thread.
- Extracts metadata, processes NACKs/RTCP feedback based on the incoming
sequence numbers.
- Inserts the payload into the `PacketBuffer` (Jitter Buffer) to wait for
frame completion.
- Once a complete video frame is assembled, it is handed off for decoding.
______________________________________________________________________
## RTP Receive Packet Flow Diagram
```text
[Network]
|
v
+-----------------------+
| AsyncUDPSocket / | (Network Thread)
| PhysicalSocket |
+-----------------------+
|
v
+-----------------------+
| P2PTransportChannel | (Network Thread)
| / DtlsTransport |
+-----------------------+
|
v
+-----------------------+
| RtpTransport | (Network Thread)
+-----------------------+
|
v
+-----------------------+
| RtpDemuxer | (Network Thread)
+-----------------------+
|
v
+-----------------------+
| BaseChannel | (Network Thread)
| & MediaReceiveChannel|
+-----------------------+
|
v
+-----------------------+
| Call::DeliverRtpPacket| (Network Thread)
+-----------------------+
|
v
+-----------------------+
| Stream Receiver | (Network Thread)
| (e.g., RtpVideo- |
| StreamReceiver2) |
+-----------------------+
|
v
[Decoder]
```