From 01bdd802f2e494728443083420f92ae52d4c890a Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Wed, 3 Jun 2026 17:58:19 -0400 Subject: [PATCH] =?UTF-8?q?zebra-report:=20drop=20audio=20NACK=20=E2=80=94?= =?UTF-8?q?=20Firefox=E2=86=92Chrome=20listener=20choppy/skipping?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chrome listeners requested NACK retransmits that Firefox publishers never replied to (Firefox never implemented the audio NACK responder). Chrome's jitter buffer waited for recovery that never arrived, then skipped. useinbandfec + 700ms playout buffer remain. --- zebra-report/zebra-spaces.html | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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');