RTCRtpReceiver-jitterBufferTarget-stats-helper.js (2423B)
1 async function measureDelayFromStats(t, receiver, cycles, targetDelay, tolerance) { 2 let oldInboundStats; 3 4 for (let i = 0; i < cycles; i++) { 5 const statsReport = await receiver.getStats(); 6 const inboundStats = [...statsReport.values()].find(({type}) => type == "inbound-rtp"); 7 8 if (inboundStats) { 9 if (oldInboundStats) { 10 const emittedCount = inboundStats.jitterBufferEmittedCount - oldInboundStats.jitterBufferEmittedCount; 11 12 if (emittedCount) { 13 const delay = 1000 * (inboundStats.jitterBufferDelay - oldInboundStats.jitterBufferDelay) / emittedCount; 14 15 if (Math.abs(delay - targetDelay) < tolerance) { 16 return true; 17 } 18 } 19 } 20 oldInboundStats = inboundStats; 21 } 22 await new Promise(r => t.step_timeout(r, 1000)); 23 } 24 25 return false; 26 } 27 28 async function applyJitterBufferTarget(t, kind, target) { 29 const caller = new RTCPeerConnection(); 30 t.add_cleanup(() => caller.close()); 31 const callee = new RTCPeerConnection(); 32 t.add_cleanup(() => callee.close()); 33 34 const stream = await getNoiseStream({[kind]:true}); 35 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 36 caller.addTransceiver(stream.getTracks()[0], {streams: [stream]}); 37 38 exchangeIceCandidates(caller, callee); 39 await exchangeOffer(caller, callee); 40 await exchangeAnswer(caller, callee); 41 42 const receiver = callee.getReceivers()[0]; 43 44 // Workaround for Chromium to pull audio from jitter buffer. 45 if (kind === "audio") { 46 const audio = document.createElement("audio"); 47 48 audio.srcObject = new MediaStream([receiver.track]); 49 audio.play(); 50 } 51 assert_equals(receiver.jitterBufferTarget, null, 52 `jitterBufferTarget supported for ${kind}`); 53 54 let result = await measureDelayFromStats(t, receiver, 5, 0, 100); 55 assert_true(result, 'jitter buffer is not stabilised'); 56 57 receiver.jitterBufferTarget = target; 58 assert_equals(receiver.jitterBufferTarget, target, 59 `jitterBufferTarget increase target for ${kind}`); 60 61 result = await measureDelayFromStats(t, receiver, 10, target, 20); 62 assert_true(result, 'jitterBuffer does not reach target'); 63 64 receiver.jitterBufferTarget = 0; 65 assert_equals(receiver.jitterBufferTarget, 0, 66 `jitterBufferTarget decrease target for ${kind}`); 67 68 result = await measureDelayFromStats(t, receiver, 10, 0, 100); 69 assert_true(result, 'jitter buffer delay is not back to normal'); 70 }