RTP Payload Format for Essential Video Coding (EVC)
Extracted elements (28)
EVC's toolset syntax elements (toolset_idc_h and toolset_idc_l), bitmasks in the SPS signaling which coding tools are active, exist to allow walled-garden deployments to restrict tool use for intellectual property risk mitigation without establishing a formal MPEG conformance point, avoiding the interoperability problems that such conformance points would create.
The EVC RTP payload format deliberately shares its basic design with the NAL unit-based formats for H.264 (RFC 6184), SVC (RFC 6190), HEVC (RFC 7798), and VVC (RFC 9328). This is a conscious choice to leverage the wide deployment and community familiarity of RFC 6184, keeping implementation complexity and learning curve low for practitioners who already know those formats.
The forbidden_zero_bit (F bit) in the NAL unit header, originally required to be zero in EVC for MPEG-2 transport start-code avoidance, is repurposed in this RTP payload format: a value of 1 signals a syntax violation, such as a reassembled NAL unit whose final fragment was lost, allowing downstream components to identify and discard corrupt units.
Implementations SHOULD be able to parse all optional media type parameters even when the related functionality is not supported, enabling graceful SDP Offer/Answer downgrade. Prior H.26x payload format implementations that silently rejected offers containing unrecognized optional parameters caused negotiation to fall back to lowest-common-denominator baseline configurations, degrading user experience.
A 90 kHz clock rate MUST be used for the RTP timestamp. NAL units lacking their own timing (e.g., parameter sets) MUST use the RTP timestamp of the coded picture of their containing access unit. Receivers MUST use the RTP timestamp for display, even when picture timing SEI messages are present.
A non-fragmented NAL unit MUST NOT be transmitted in a single FU; the S bit and E bit MUST NOT both be set to 1 in the same FU header. FuType in the FU header MUST equal the Type field of the fragmented NAL unit.
An AP MUST NOT contain NAL units from more than one access unit, MUST carry at least two aggregation units, MUST NOT contain FUs, and APs MUST NOT be nested. The AP payload header Type MUST equal 56, and the TID value MUST equal the smallest TID among all aggregated NAL units.
FU fragments of the same NAL unit MUST be sent in consecutive order with ascending RTP sequence numbers, with no other packets from the same RTP stream interspersed. APs MUST NOT be fragmented. FUs MUST NOT be nested. FU payloads MUST NOT be empty.
In SDP Offer/Answer, profile-id MUST be used symmetrically. The answerer MUST either keep all configuration parameters identical to the offer (with level-id allowed to be lower) or remove the media format entirely. The answer MUST NOT contain a payload type from the offer with a configuration differing in any parameter except level-id.
In SDP, the encoding name in a=rtpmap MUST be 'evc', the clock rate MUST be 90000, and optional parameters profile-id, level-id, toolset-id, max-recv-level-id, sprop-max-don-diff, sprop-depack-buf-bytes, and depack-buf-cap MUST be included in the a=fmtp line when present.
NAL-unit-like structures with NAL unit type values 56 through 62 inclusive (AP and FU type identifiers and reserved values) MUST NOT be passed to the decoder. Only NAL units with type values 0 through 55 may be passed.
The field nal_unit_type_plus1 in the NAL unit header MUST NOT be zero.
The RTP marker bit MUST be set for the last packet of the access unit carried in the current RTP stream, enabling efficient playout buffer handling.
When an offerer proposes an interleaved stream (sprop-max-don-diff > 0), it MUST include sprop-depack-buf-bytes in the offer. sprop-depack-buf-bytes MUST be greater than or equal to the actual maximum de-packetization buffer occupancy, and MUST be greater than 0 when sprop-max-don-diff is present and greater than 0.
When sprop-max-don-diff equals 0, the transmission order of NAL units MUST be identical to NAL unit decoding order. When sprop-max-don-diff is greater than 0, transmission order MAY differ from decoding order.
When sprop-max-don-diff is greater than 0, the DONL field MUST be present in single NAL unit packets and in the first aggregation unit of an AP; in FUs it MUST be present only when the S bit equals 1. When sprop-max-don-diff equals 0, the DONL field MUST NOT be present in any of these structures.
When sprop-sps and/or sprop-pps are conveyed via the RFC 5576 'fmtp' source attribute, the receiver MUST associate those parameter sets with the specific source and MUST use them only to decode NAL units from that same source. SSRC collision detection and resolution MUST be performed per RFC 5576.
The absolute decoding order number AbsDon is computed from 16-bit modular DON values using five case-based rules that handle wraparound and gaps. AbsDon values determine NAL unit decoding sequence: larger AbsDon means later in decoding order; equal AbsDon means either order is acceptable.
The parameter sprop-max-don-diff (integer 0–32767) specifies the maximum AbsDon difference between any two NAL units where one precedes in decoding order but follows in transmission order. sprop-depack-buf-bytes signals the required de-packetization buffer size in bytes (0–4294967295). depack-buf-cap signals the receiver's available de-packetization buffer capacity.
The parameters sprop-sps, sprop-pps, and sprop-sei allow out-of-band conveyance of SPS, PPS, and SEI NAL units as comma-separated base64-encoded values in SDP a=fmtp or via the RFC 5576 fmtp source attribute. SEI messages conveyed in sprop-sei apply for the entire session duration regardless of their in-bitstream persistence scope.
Three RTP payload structure types are defined: (1) Single NAL Unit Packet for exactly one NAL unit, (2) Aggregation Packet (AP, Type=56) combining multiple NAL units from one access unit, and (3) Fragmentation Unit (FU, Type=57) carrying a contiguous fragment of a single NAL unit. The payload type is identified by the Type field in the payload header.
This document registers the IANA media type 'video/evc' for the EVC RTP payload format. Optional parameters include profile-id, level-id, toolset-id, max-recv-level-id, sprop-sps, sprop-pps, sprop-sei, sprop-max-don-diff, sprop-depack-buf-bytes, and depack-buf-cap. The change controller is IETF ([email protected]).
The EVC RTP payload format inherits RTP security considerations (RFC 3550). Implementers should apply SRTP for confidentiality and integrity. Malformed or crafted RTP packets and NAL unit structures could exploit decoder vulnerabilities; receiver implementations must validate packet structure, payload header type values, and aggregation/fragmentation fields before processing.
De-packetization with sprop-max-don-diff > 0 operates in two states: 'initial buffering' (accumulates NAL units in the de-packetization buffer until the range of AbsDon values reaches sprop-max-don-diff) and 'buffering while playing' (continuously removes the NAL unit with the smallest AbsDon whenever the AbsDon range meets or exceeds sprop-max-don-diff). When sprop-max-don-diff equals 0, buffer size is zero and NAL units pass directly to the decoder in transmission order.
A Fragmentation Unit (FU) consists of a 2-byte PayloadHdr (Type=57), a 1-byte FU header containing S bit (start flag), E bit (end flag), and FuType (6 bits, equals the fragmented NAL unit's Type), a conditional 16-bit DONL field (present only in the first fragment when sprop-max-don-diff > 0), and the FU payload bytes.
A Single NAL Unit Packet contains a 2-byte PayloadHdr, a conditional 16-bit DONL field in network byte order (present only when sprop-max-don-diff > 0), and the NAL unit payload data (the NAL unit body excluding its header).
An Aggregation Packet (AP) begins with a 2-byte PayloadHdr with Type=56, followed by two or more aggregation units. The first aggregation unit optionally carries a 16-bit DONL field (conditional on sprop-max-don-diff), followed by a 16-bit unsigned NALU size in network byte order, then the full NAL unit including its header. Subsequent aggregation units omit DONL and begin with the 16-bit NALU size.
The EVC NAL unit header is exactly two bytes: F (1 bit, forbidden_zero_bit), Type (6 bits, nal_unit_type_plus1), TID (3 bits, temporal identifier nuh_temporal_id), Reserve (5 bits, version indicator), and E (1 bit, extension flag). The NAL Unit Type equals nal_unit_type_plus1 minus 1.