I have a fix here: https://bugzilla.mozilla.org/show_bug.cgi?id=1165520

Best regards,
Byron Campen

On 5/15/15 7:21 AM, Randell Jesup wrote:
On 5/14/2015 2:23 PM, [email protected] wrote:
Hello,

I've been doing a lot of research into this, but I figured I'd post what I've discovered so far here to see if there's anybody who knows more.

I have a server that does not support rtcp pli (FreeSWITCH), that ends up between two browser endpoints. When this server sends its offer, the only rtcp-fb present is:

a=rtcp-fb:99 ccm fir

Firefox answers with:

a=rtcp-fb:99 nack
a=rtcp-fb:99 nack pli
a=rtcp-fb:99 ccm fir


When Firefox generates the offer, a similar situation occurs, except VP8 is listed under 120, instead of 99. In the case detailed above, I'm not sure if the server is supposed to reply with an updated offer to settle the disagreement, but even so, Firefox moves on as if the other side did agree to those 3 parameters.

Ok, if we're answering that way we're wrong:  RFC 4585 4.2

When used in conjunction with the offer/answer model [8 <http://tools.ietf.org/html/rfc4585#ref-8>], the offerer
   MAY present a set of these AVPF attributes to its peer.  The answerer
   MUST remove all attributes it does not understand as well as those it
   does not support in general or does not wish to use in this
   particular media session.  The answerer MUST NOT add feedback
   parameters to the media description and MUST NOT alter values of such
   parameters.  The answer is binding for the media session, and both
   offerer and answerer MUST only use feedback mechanisms negotiated in
   this way.  Both offerer and answerer MAY independently decide to send
   RTCP FB messages of only a subset of the negotiated feedback
   mechanisms, but they SHOULD react properly to all types of the
   negotiated FB messages when received.


I have not taken traces to identify if this occurs in the other direction as well (since the sdp is inconclusive about it), but it's possible.

Hmmm. We do look at the local SDP to set the recovery type, so if our answer has the wrong options, then we'll set up the channel using those. In WebrtcVideoConduit::ConfigureRecvMediaCodecs():

// Check for the keyframe request type: PLI is preferred over FIR, and FIR is preferred over none.
    if (codecConfigList[i]->RtcpFbNackIsSet("pli"))
    {
      kf_request = webrtc::kViEKeyFrameRequestPliRtcp;
    } else if(kf_request == webrtc::kViEKeyFrameRequestNone &&
              codecConfigList[i]->RtcpFbCcmIsSet("fir"))
    {
      kf_request = webrtc::kViEKeyFrameRequestFirRtcp;
    }
    // Check whether NACK is requested
    if(codecConfigList[i]->RtcpFbNackIsSet(""))
    {
      use_nack_basic = true;
    }


Once the call is established between browsers, video deteriorates until the keyframe refresh. This was not happening in Firefox 37, so it appears a change may have occurred to make Firefox more reliant upon the rtcp pli in version 38. In the same situation, Chrome only responds with 'ccm fir' and video keeps good quality throughout.

We did a major rewrite of the negotiation code in 37, and in 38 added multistream and bundle (and a lot of fixes for things); so it's certainly possible there was a regression in 38. Did 37 (or 36) answer in the same way to a "ccm fir"-only offer?


There is (untested) code in FreeSWITCH for rtcp plis, but it was commented out later when it caused other video issues (fast source switches, as seen in conferences, would not work well). That was also a Firefox only issue, because Firefox always sent rtcp pli requests, where as Chrome could negotiate without it. The plis were, and still are, just not responded to by FreeSWITCH, but I believe it is now causing the deterioration.

I'm not sure if rtcp pli is a necessity for all WebRTC endpoints at this point, and if so, I'll have to look into getting that working in FreeSWITCH. In terms of Firefox, shouldn't it take the rtcp-fb params of the offer into account when generating its answer?

draft-ietf-rtcweb-rtp-usage-23: (http://tools.ietf.org/html/draft-ietf-rtcweb-rtp-usage-23) says you really should support PLI:

5.1.1
   ... WebRTC Endpoints that are sending media
   MUST understand and react to FIR feedback messages they receive,
   since this greatly improves the user experience when using
   centralised mixer-based conferencing.  Support for sending FIR
   messages is OPTIONAL.

5.1.2
   ... WebRTC Endpoints that are sending media MUST understand
   and react to PLI feedback messages as a loss tolerance mechanism.
   Receivers MAY send PLI messages.

Note: those are separate from the issue of SDP & negotiation, but it implies you should not reject PLI and clearly must process them if received. It also implies you should agree to PLI in the SDP.


_______________________________________________
dev-media mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-media

Reply via email to