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