Summary - November 2nd, 2020
Every feature not marked at risk of the WebRTC 1.0 specification has been demonstrably and independently implemented in two browsers, except for:
- A few mandatory-to-implement stats which have not been implemented, but are not critical to real-world interoperability and which implementors are committed to provide in the upcoming weeks.
- The
RTCSctpTransport
andRTCIceTransport
interfaces have been implemented in only one current browser; other browser vendors have indicated their intent to eventually ship these, and these interfaces have also received implementation experience outside of current browsers (in the old Edge Spartan, in orclib, in the Medooze server). RTCRtpSender.setStreams()
is implemented in a single browser, but is expected to land in more browsers in the near future.- The
closing
event forRTCDataChannel
is implemented in only one browser, but is expected to land in more browsers in the near future. - The way browsers report errors occuring during WebRTC operations is not yet fully conformant with the specification.
Given the implementors commitment for these features and given their relative low real-world interoperability impact, the Working Group is confident that these implementation gaps are unlikely to require substantive changes to the specification as implementations catch up. Should this prove necessary, the Working Group will take advantage of the 2020 W3C Process for normative correction of bugs.
As a result of this implementation analysis, the WebRTC Working Group estimates that the implementations of the current WebRTC 1.0 are sufficient to proceed with publication as a W3C Recommendation under the 2020 W3C Process.
Detailed Implementation issues
Gaps
No implementation
- voiceActivityFlag in SSRC (marked "at risk")
- No implementation (CR, FF)
- MTI Stats (CR, full support planned in Safari)
- No implementation of
Only one implementation
- RTCDataChannel.onclosing
- Missing in FF (low difficulty) & planned in Safari (webkit)
RTCRtpSender.setStreams()
- Not implemented in FF (low difficulty), planned in Safari
RTCDtlsTransport.getRemoteCertificates
- Missing from FF impl of RTCDtlsTransport; Safari doesn't implement RTCDtlsTransport
RTCIceTransport
interface- Missing in FF; Available in SecureContext only in Chromium? missing component attribute in Chromium; missing most attributes/methods in Safari
- onicecandidateerror
- Not available in Firefox, Safari
- sctp transport
- Missing in FF, Safari
- RTCError, RTCErrorEvent
- Not implemented in Firefox, No plan for Safari (OperationError fallback test?); bug in RTCErrorEvent constructor (cf idlharness test)
- RTCPeerConnectionIceEvent url attribute
- Missing in FF, Chromium
- validation of
rid
values in addTransceiver - Missing in FF, planned in Safari
- RTCPeerConnectionIceErrorEvent
- Missing in FF, Safari; address, port missing in Chromium
- MTI Stats (single impl)
- Full support planned in Safari, Currently only one implementation of RTCReceivedRtpStreamStats's framesDropped, RTCInboundRtpStreamStats's remoteId, RTCInboundRtpStreamStats's framesReceived, RTCInboundRtpStreamStats's totalAudioEnergy,RTCInboundRtpStreamStats's totalSamplesDuration,RTCOutboundRtpStreamStats's framesSent, RTCRemoteOutboundRtpStreamStats's localId, RTCRemoteOutboundRtpStreamStats's remoteTimestamp, RTCPeerConnectionStats's dataChannelsOpened, RTCPeerConnectionStats's dataChannelsClosed, RTCAudioSourceStats's totalAudioEnergy, RTCAudioSourceStats's totalSamplesDuration, RTCVideoSourceStats's width, RTCVideoSourceStats's height, RTCVideoSourceStats's framesPerSecond, RTCTransportStats's bytesSent, RTCTransportStats's bytesReceived, RTCTransportStats's selectedCandidatePairId, RTCTransportStats's localCertificateId, RTCTransportStats's remoteCertificateId, RTCIceCandidateStats's address
Gap in single browser that affect test suite because of dependencies
blob
argument forRTCDataChannel.send()
- Missing in Chromium (CR2276)
setConfiguration
- Missing in Firefox
Bugs
- Stats lifecycle
-
Chromium lifecyle for presence of RTCInboundRtpStreamStats, RTCRemoteInboundRtpStreamStats, RTCOutboundRtpStreamStats, RTCRemoteOutboundRtpStreamStats, RTCDataChannelStats?
FF lifecycle for presence of RTCIceCandidatePairStats.state, currentRoundTripTime. RTCCodecStats, RTCInboundRtpStreamStats, RTCRemoteInboundRtpStreamStats, RTCOutboundRtpStreamStats, RTCRemoteOutboundRtpStreamStats, RTCDataChannelStats, RTCMediaHandlerStats, RTCTransportStats, RTCCertificateStats? RTCPeerConnection.addIceCandidate()
- Supports for zero-argument in Safari
RTCPeerConnection.setLocalDescription()
- Supports for zero-argument in Safari
- readonly attributes in RTCSessionDescription (type, sdp)
- writable in FF, Chromium
restartIce
survives remote offer containing partial restart- Not implemented in FF, Chromium
createOffer
- Chromium Safari fails "When media stream is added when createOffer() is running in parallel, the result offer should contain the new media stream"
- setLocalDescription() with offer not created by own createOffer() should reject with InvalidModificationError
- Fails in Chromium, Safari
- getSynchronizationSources
- returns empty array on audio track in Chromium (?); misses rtpTimestamp, voiceActivityFlag in Safari; doesn't work on video track in FF, which also lacks voiceActivityFlag
- mute/unmute timing
- Buggy in Chrome, Safari
Test suite issues
Bugs
- In general, some tests are https-only, but not clear if this is always justified
- test for
bufferedAmount
depends onblob
sending (but not implemented in Chromium yet)
Annotated WPT results
Tests | Chrome | Edge | FireFox | Safari | Notes |
---|
MTI Stats
Static results as of 15 March 2021 (based on mandatory stats test)
Subtest | Chromium | FF | Safari |
---|---|---|---|
getStats succeeds |
|||
Validating stats |
❌
|
||
RTCRtpStreamStats's ssrc |
|||
RTCRtpStreamStats's kind |
|||
RTCRtpStreamStats's transportId |
❌
|
||
RTCRtpStreamStats's codecId |
❌
|
||
RTCReceivedRtpStreamStats's packetsReceived |
|||
RTCReceivedRtpStreamStats's packetsLost |
|||
RTCReceivedRtpStreamStats's jitter |
|||
RTCReceivedRtpStreamStats's packetsDiscarded |
❌
|
❌
|
❌
|
RTCReceivedRtpStreamStats's framesDropped |
❌
|
❌
|
|
RTCInboundRtpStreamStats's receiverId |
❌
|
❌
|
❌
|
RTCInboundRtpStreamStats's remoteId |
❌
|
❌
|
|
RTCInboundRtpStreamStats's framesDecoded |
|||
RTCInboundRtpStreamStats's nackCount |
|||
RTCInboundRtpStreamStats's framesReceived |
❌
|
||
RTCInboundRtpStreamStats's bytesReceived |
|||
RTCInboundRtpStreamStats's totalAudioEnergy |
❌
|
||
RTCInboundRtpStreamStats's totalSamplesDuration |
❌
|
||
RTCRemoteInboundRtpStreamStats's localId |
❌
|
||
RTCRemoteInboundRtpStreamStats's roundTripTime |
❌
|
||
RTCSentRtpStreamStats's packetsSent |
❌
|
||
RTCSentRtpStreamStats's bytesSent |
❌
|
||
RTCOutboundRtpStreamStats's senderId |
❌
|
❌
|
❌
|
RTCOutboundRtpStreamStats's remoteId |
❌
|
||
RTCOutboundRtpStreamStats's framesEncoded |
❌
|
||
RTCOutboundRtpStreamStats's nackCount |
❌
|
||
RTCOutboundRtpStreamStats's framesSent |
❌
|
❌
|
|
RTCRemoteOutboundRtpStreamStats's localId |
❌
|
❌
|
|
RTCRemoteOutboundRtpStreamStats's remoteTimestamp |
❌
|
❌
|
|
RTCPeerConnectionStats's dataChannelsOpened |
❌
|
❌
|
|
RTCPeerConnectionStats's dataChannelsClosed |
❌
|
❌
|
|
RTCDataChannelStats's label |
|||
RTCDataChannelStats's protocol |
|||
RTCDataChannelStats's dataChannelIdentifier |
❌
|
||
RTCDataChannelStats's state |
|||
RTCDataChannelStats's messagesSent |
|||
RTCDataChannelStats's bytesSent |
|||
RTCDataChannelStats's messagesReceived |
|||
RTCDataChannelStats's bytesReceived |
|||
RTCMediaSourceStats's trackIdentifier |
❌
|
||
RTCMediaSourceStats's kind |
❌
|
||
RTCAudioSourceStats's totalAudioEnergy |
❌
|
❌
|
|
RTCAudioSourceStats's totalSamplesDuration |
❌
|
❌
|
|
RTCVideoSourceStats's width |
❌
|
❌
|
|
RTCVideoSourceStats's height |
❌
|
❌
|
|
RTCVideoSourceStats's framesPerSecond |
❌
|
❌
|
|
RTCMediaHandlerStats's trackIdentifier |
❌
|
❌
|
❌
|
RTCCodecStats's payloadType |
❌
|
||
RTCCodecStats's codecType |
?
|
?
|
?
|
RTCCodecStats's mimeType |
❌
|
||
RTCCodecStats's clockRate |
❌
|
||
RTCCodecStats's channels |
❌
|
||
RTCCodecStats's sdpFmtpLine |
❌
|
||
RTCTransportStats's bytesSent |
❌
|
❌
|
|
RTCTransportStats's bytesReceived |
❌
|
❌
|
|
RTCTransportStats's selectedCandidatePairId |
❌
|
❌
|
|
RTCTransportStats's localCertificateId |
❌
|
❌
|
|
RTCTransportStats's remoteCertificateId |
❌
|
❌
|
|
RTCIceCandidatePairStats's transportId |
|||
RTCIceCandidatePairStats's localCandidateId |
|||
RTCIceCandidatePairStats's remoteCandidateId |
|||
RTCIceCandidatePairStats's state |
|||
RTCIceCandidatePairStats's nominated |
|||
RTCIceCandidatePairStats's bytesSent |
|||
RTCIceCandidatePairStats's bytesReceived |
|||
RTCIceCandidatePairStats's totalRoundTripTime |
❌
|
||
RTCIceCandidatePairStats's currentRoundTripTime |
❌
|
||
RTCIceCandidateStats's address |
❌
|
❌
|
|
RTCIceCandidateStats's port |
|||
RTCIceCandidateStats's protocol |
|||
RTCIceCandidateStats's candidateType |
|||
RTCIceCandidateStats's url |
❌
|
❌
|
❌
|
RTCCertificateStats's fingerprint |
❌
|
||
RTCCertificateStats's fingerprintAlgorithm |
❌
|
||
RTCCertificateStats's base64Certificate |
❌
|
||
RTCCertificateStats's issuerCertificateId |
?
|
?
|
?
|