- From: jan-ivar via GitHub <sysbot+gh@w3.org>
- Date: Wed, 22 Mar 2017 20:01:02 +0000
- To: public-webrtc@w3.org
jan-ivar has just created a new issue for https://github.com/w3c/webrtc-stats: == Reuse of "inbound-rtp" and "outbound-rtp" for RTCP is confusing. == The `isRemote` overload of `"inbound-rtp"` and `"outbound-rtp"` is just confusing. It invites surprise and bugs to anyone trying to enumerate stats (scripts end up reading wrong data without knowing it!) I can't think of a single use-case where enumerating by type alone is not wrong. It's also false symmetry: both dictionaries have members which existence depend on `isRemote`: * [RTCOutboundRTPStreamStats](http://rawgit.com/w3c/webrtc-stats/master/webrtc-stats.html#outboundrtpstats-dict*) has `framesEncoded` (local-only), `remoteTimestamp` (remote-only), * [RTCInboundRTPStreamStats](http://rawgit.com/w3c/webrtc-stats/master/webrtc-stats.html#inboundrtpstats-dict*) has `framesDecoded` (local-only), `roundTripTime` (remote-only). These absences break down easily by type, i.e. *never* appear in subsequent calls where missing. ## Proposal Remove `isRemote`, and round out the two rtp types with two more for rtcp instead: * "outbound-rtp" * "inbound-rtp" * **"outbound-rtcp"** (formerly "inbound-rtp" with `isRemote == true`) * **"inbound-rtcp"** (formerly "outbound-rtp" with `isRemote == true`) Define discrete dictionaries for the four types (in inheritance rather than corrresponding order): ```js dictionary RTCSentRTPStreamStats : RTCRTPStreamStats { unsigned long packetsSent; unsigned long long bytesSent; }; dictionary RTCOutboundRTPStreamStats : RTCSentRTPStreamStats { double targetBitrate; unsigned long framesEncoded; }; dictionary RTCInboundRTCPStreamStats : RTCSentRTPStreamStats { DOMHighResTimeStamp remoteTimestamp; }; ``` ```js dictionary RTCReceivedRTPStreamStats : RTCRTPStreamStats { unsigned long packetsReceived; unsigned long long bytesReceived; unsigned long packetsLost; double jitter; double fractionLost; unsigned long packetsDiscarded; unsigned long packetsRepaired; unsigned long burstPacketsLost; unsigned long burstPacketsDiscarded; unsigned long burstLossCount; unsigned long burstDiscardCount; double burstLossRate; double burstDiscardRate; double gapLossRate; double gapDiscardRate; }; dictionary RTCInboundRTPStreamStats : RTCReceivedRTPStreamStats { unsigned long framesDecoded; }; dictionary RTCOutboundRTCPStreamStats : RTCReceivedRTPStreamStats { double roundTripTime; }; ``` ## Benefit: No need to read prose anymore to see what's where, and it simplifies [usage](https://blog.mozilla.org/webrtc/fiddle-of-the-week-await/) as well: ```js let html = "", stats = await pc.getStats(); for (let stat of stats.values()) { // if (stat.isRemote) continue; <--- don't need this line anymore! switch (stat.type) { case "outbound-rtp": { html += dumpOutbound(stat) + "<br>"; let rtcp = stats.get(stat.remoteId); if (rtcp) html += "RTCP " + dumpInbound(rtcp) + "<br>"; break; } ``` Thoughts? Please view or discuss this issue at https://github.com/w3c/webrtc-stats/issues/189 using your GitHub account
Received on Wednesday, 22 March 2017 20:01:08 UTC