WebRTC Metrics
A comprehensive overview of WebRTC statistics, derived calculations, extracted features, and observable signals, to better understand call quality, connectivity, and user experience in rtcStats
Advanced signals (feature)
Advanced and experimental track-level features: L4S ECN packet marking, objective PSNR quality sums, and null video decoder detection.
Description
Track-level features, extracted per track into features_track. These are advanced and experimental signals; availability varies by browser and build.
L4S and ECN (explicit congestion notification) marking:
- packetsSentWithEct1 - packets sent marked ECT(1), opting into L4S congestion signaling.
- packetsReceivedWithEct1 - packets received still carrying the ECT(1) mark.
- packetsReceivedWithCe - packets received marked CE (congestion experienced) by a router on the path.
- packetsWithBleachedEct1Marking - packets whose ECT(1) mark was cleared (bleached) in transit.
Objective quality (PSNR):
psnrMeasurements- number of frames measured for PSNR.psnrSumY- cumulative PSNR sum for the luma (Y) plane.psnrSumU- cumulative PSNR sum for the U chroma plane.psnrSumV- cumulative PSNR sum for the V chroma plane.
Decoder health:
hasNullVideoDecoder- boolean, whether a null video decoder was used at any point (no real decoding happened).
Extracted by the open-source rtcstats-features package.
Why it matters
These are frontier signals, useful when you are validating new stack behavior rather than running everyday dashboards. L4S is a low-latency congestion scheme: comparing packetsSentWithEct1 against packetsReceivedWithCe and packetsWithBleachedEct1Marking tells you whether the network path honored the ECN marks or stripped them, which decides whether L4S is actually doing anything for your users.
PSNR gives an objective, reference-based quality number. Divide a plane sum such as psnrSumY by psnrMeasurements for a mean PSNR, mostly interesting in lab or test-call conditions where you control the source. hasNullVideoDecoder is a correctness flag: if it is true, video was not really being decoded, which usually points at a test harness or a broken configuration rather than a live user experience.
Treat everything here as advanced. Confirm the field is populated in your browser mix before building on it.
SQL example
Check L4S mark survival and mean luma PSNR for inbound video, where present:
SELECT
SUM(track.packets_received_with_ect1) AS ect1_received,
SUM(track.packets_received_with_ce) AS ce_received,
SUM(track.packets_with_bleached_ect1_marking) AS ect1_bleached,
SUM(track.psnr_sum_y) / NULLIF(SUM(track.psnr_measurements), 0) AS mean_psnr_y
FROM "rtcstats-server" AS server
JOIN features_metadata AS metadata ON metadata.dump_id = server.id
JOIN features_connection AS connection ON connection.dump_id = metadata.id
JOIN features_track AS track ON track.connection_id = connection.id
WHERE connection.connected -- only connections that reached 'connected'
AND track.kind = 'video' -- 'audio' or 'video'
AND track.direction = 'inbound'; -- 'inbound' or 'outbound'
See also
- rtcstats-server feature extraction - the full feature reference. These features are extracted by rtcstats-server and live in the open-source
rtcstats-featurespackage.