WebRTC 1.0 Interoperability Tests Results

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:

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
  • RTCReceivedRtpStreamStats's packetsDiscarded (CR, FF),
  • RTCInboundRtpStreamStats's receiverId,
  • RTCOutboundRtpStreamStats's senderId,
  • RTCMediaHandlerStats's trackIdentifier,
  • RTCIceCandidateStats's url (CR, FF),

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 for RTCDataChannel.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

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 ? ? ?