diff --git a/zebra-report/zebra-spaces.html b/zebra-report/zebra-spaces.html index 310bb33..40771e9 100644 --- a/zebra-report/zebra-spaces.html +++ b/zebra-report/zebra-spaces.html @@ -2981,14 +2981,14 @@ function preferStereoOpus(sdp, maxAvgBps, opts){ return 'a=fmtp:' + pt + ' ' + parts.join(';'); }); if (!opusPT) return sdp; - /* Add NACK feedback for Opus if not already present — reactive packet - * recovery, near-zero overhead. Browsers that don't honor it will - * ignore the line. */ - const nackLine = 'a=rtcp-fb:' + opusPT + ' nack'; - if (sdp.indexOf(nackLine) === -1){ - sdp = sdp.replace(new RegExp('(a=rtpmap:' + opusPT + ' opus[^\\r\\n]*\\r?\\n)'), - '$1' + nackLine + '\r\n'); - } + /* Audio NACK was tried and rolled back: Chrome receivers will request + * retransmits if the sender advertises rtcp-fb:nack on the Opus PT, but + * Firefox senders never reply (Mozilla never shipped the responder + * side). Chrome's jitter buffer waits for recovery that never arrives + * and then skips — audibly choppy in mixed Firefox→Chrome rooms. + * useinbandfec + 700ms playoutDelayHint already cover the loss case + * without protocol churn. Do NOT re-add audio NACK without verifying + * both sides actually implement it for the negotiated PT. */ /* Tolerate larger frames from peers (up to 120ms). Bigger encode * windows give Opus more context per packet → cleaner music at the * same bitrate. We can't force OUR encoder's frame size from JS but @@ -4417,8 +4417,8 @@ logLine('', 'ready — pick a handle, type a rendezvous code, enter the space');