zebra-report: drop audio NACK — Firefox→Chrome listener choppy/skipping

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.
This commit is contained in:
russell@unturf.com 2026-06-03 17:58:19 -04:00
parent c2c2183012
commit 01bdd802f2
No known key found for this signature in database

View file

@ -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');
<footer style="margin:2.2rem auto 0;font-size:0.65rem;color:#999;line-height:1.7;word-break:break-all;font-family:monospace">
<span id="pi-seal" style="color:#777;cursor:default;user-select:none" title="">page integrity</span> &nbsp;·&nbsp; built <span class="stamp-date">2026-06-03</span><br>
md5 <span class="stamp-md5">45650495593e448837687d642021f48c</span><br>
sha256 <span class="stamp-sha">0a00722851d1749740821391946ccf77e8172ae5c024f564b8897fb05e020bc6</span><br>
md5 <span class="stamp-md5">daa6375c3e46c8a13c287745467f105f</span><br>
sha256 <span class="stamp-sha">534f2a0afe7da5319071f94519988c2f752a8f9919398d5a728582d540b07e46</span><br>
<span style="color:#bbb">hashes are of this page with these two fields zeroed — to verify, blank them and re-hash</span><br>
<span style="color:#bbb">one self-contained file — <strong>save a copy</strong> and verify against these hashes; point at your own servers with ?signal= and ?turncred=, or <a href="host-your-own.html" style="color:#999">host your own community</a></span>
</footer>