blob: b2264fdfdfdbcdc620e724b29ca6f43afcbd798e [file] [view]
<!-- go/cmark -->
<!--* freshness: {owner: 'perkj' reviewed: '2026-06-17'} *-->
# RTP in WebRTC
WebRTC uses the RTP protocol described in
[RFC3550](https://datatracker.ietf.org/doc/html/rfc3550) for transporting audio
and video. Media is encrypted using [SRTP](./srtp.md).
## Allocation of payload types
RTP packets have a payload type field that describes which media codec can be
used to handle a packet. For some (older) codecs like PCMU the payload type is
assigned statically as described in
[RFC3551](https://datatracker.ietf.org/doc/html/rfc3551). For others, it is
assigned dynamically through the SDP. **Note:** there are no guarantees on the
stability of a payload type assignment.
For this allocation, the range from 96 to 127 is used. When this range is
exhausted, the allocation falls back to the range from 35 to 63 as permitted by
[section 5.1 of RFC3550][1]. Note that older versions of WebRTC failed to
recognize payload types in the lower range. Newer codecs (such as flexfec-03 and
AV1) will by default be allocated in that range.
Payload types in the range 64 to 95 are not used to avoid confusion with RTCP as
described in [RFC5761](https://datatracker.ietf.org/doc/html/rfc5761).
## Allocation of audio payload types
Audio payload types are assigned from a table by the [PayloadTypePicker][2]
class. Audio codecs generally prefer the upper dynamic range [96,127] to
maintain compatibility with older WebRTC versions. Redundancy formats like RED
are allocated in the lower dynamic range [35,63], starting at 63, to reduce
collisions with video payload types.
## Allocation of video payload types
Video payload types are allocated by the
[GetPayloadTypesAndDefaultCodecs method][3]. The set of codecs depends on the
platform, in particular for H264 codecs and their different profiles. Payload
numbers are assigned ascending from 96 for video codecs and their
[associated retransmission format](https://datatracker.ietf.org/doc/html/rfc4588).
Some codecs like flexfec-03 and AV1 are assigned to the lower range [35,63] for
reasons explained above. When the upper range [96,127] is exhausted, payload
types are assigned to the lower range [35,63], starting at 35.
## Handling of payload type collisions
Due to the requirement that payload types must be uniquely identifiable when
using [BUNDLE](https://datatracker.ietf.org/doc/html/rfc8829) collisions between
the assignments of the audio and video payload types may arise. These are
resolved by the [PayloadTypeSuggester][4] interface which will reassign payload
type numbers descending from 127.
# Bitrate probing
Bandwidth estimation sometimes requires sending RTP packets to ramp up the
estimate above a certain treshold. WebRTC uses two techniques for that:
- Packets that only consist of RTP padding
- RTX packets
At the receiving end, both types of probing packets do not interfere with media
processing. After being taken into account for bandwidth estimation, probing
packets only consisting of padding can be dropped and RTX packets act as
redundancy.
Using RTX for probing is generally preferred as padding probes are limited to
256 bytes of RTP payload which results in a larger number of packets being used
for probing which is a disadvantage from a congestion control point of view.
## Padding probes
Padding probes consist of RTP packets with header extensions (either abs-send
time or the transport-wide-cc sequence number) and set the RTP "P" bit. The last
byte of the RTP payload which specifies the amount of padding is set to 255 and
preceeded by 255 bytes of all zeroes. See [section 5.1 of RFC3550][1]. Padding
probes use the RTX RTP stream (i.e. payload type, sequence number and timestamp)
when RTX is negotiated or share the same RTP stream as the media packets
otherwise.
Padding probes are used either when
- RTX is not negotiated (such as for audio, less commonly for video) or
- no suitable original packet is found for RTX probing.
Padding probes should not be interleaved with packets of a video frame.
## RTX probes
RTX probes are resends of previous packets that use RTX retransmissions
specified in [RFC4588](https://www.rfc-editor.org/rfc/rfc4588) as payload format
when negotiated with the peer. These packets will have a different abs-send-time
or transport-wide-cc sequence number and use the RTX RTP stream (i.e. RTX
payload type, sequence number and timestamp) associated with the media RTP
stream.
RTX probing uses recently sent RTP packets that have not yet been acknowledged
by the remote side. Sending these packets again has a small chance of being
useful when the original packet is lost and will not affect RTP processing at
the receiver otherwise.
[1]: https://datatracker.ietf.org/doc/html/rfc3550#section-5.1
[2]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/call/payload_type_picker.h;l=35;drc=031d798a20cc5d9c867598a38632accb20c6effe
[3]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/media/engine/webrtc_video_engine.cc;l=206;drc=031d798a20cc5d9c867598a38632accb20c6effe
[4]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/call/payload_type.h;l=26;drc=031d798a20cc5d9c867598a38632accb20c6effe