tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_peerConnection_simulcastOffer_oldSetParameters.html (4387B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <script type="application/javascript" src="pc.js"></script>
      5  <script type="application/javascript" src="parser_rtp.js"></script>
      6  <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
      7  <script type="application/javascript" src="helpers_from_wpt/sdp.js"></script>
      8  <script type="application/javascript" src="simulcast.js"></script>
      9  <script type="application/javascript" src="stats.js"></script>
     10 </head>
     11 <body>
     12 <pre id="test">
     13 <script type="application/javascript">
     14  createHTML({
     15    bug: "1231507",
     16    title: "Basic video-only peer connection with Simulcast offer",
     17    visible: true
     18  });
     19 
     20  runNetworkTest(async () => {
     21    await pushPrefs(
     22        // 180Kbps was determined empirically, set well-higher than
     23        // the 80Kbps+overhead needed for the two simulcast streams.
     24        // 100Kbps was apparently too low.
     25        ['media.peerconnection.video.min_bitrate_estimate', 180*1000]);
     26 
     27    // [TODO] re-enable HW decoder after bug 1526207 is fixed.
     28    if (navigator.userAgent.includes("Android")) {
     29      await pushPrefs(["media.navigator.mediadatadecoder_vpx_enabled", false]);
     30    }
     31 
     32 
     33    const offerer = new RTCPeerConnection();
     34    const answerer = new RTCPeerConnection();
     35 
     36    const add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed);
     37    offerer.onicecandidate = e => add(answerer, e.candidate, generateErrorCallback());
     38    answerer.onicecandidate = e => add(offerer, e.candidate, generateErrorCallback());
     39 
     40    const metadataToBeLoaded = [];
     41    answerer.ontrack = (e) => {
     42      metadataToBeLoaded.push(getPlaybackWithLoadedMetadata(e.track));
     43    };
     44 
     45    // One send transceiver, that will be used to send both simulcast streams
     46    const emitter = new VideoFrameEmitter();
     47    const videoStream = emitter.stream();
     48    offerer.addTrack(videoStream.getVideoTracks()[0], videoStream);
     49    emitter.start();
     50 
     51    const sender = offerer.getSenders()[0];
     52    sender.setParameters({
     53        encodings: [
     54            { rid: '0', maxBitrate: 40000 },
     55            { rid: '1', maxBitrate: 40000, scaleResolutionDownBy: 2 }
     56          ]
     57    });
     58 
     59    const offer = await offerer.createOffer();
     60 
     61    const mungedOffer = ridToMid(offer);
     62    info(`Transformed send simulcast offer to multiple m-sections: ${offer.sdp} to ${mungedOffer}`);
     63 
     64    await answerer.setRemoteDescription({type: "offer", sdp: mungedOffer});
     65    await offerer.setLocalDescription(offer);
     66 
     67    const rids = answerer.getTransceivers().map(t => t.mid);
     68    is(rids.length, 2, 'Should have 2 mids in offer');
     69    ok(rids[0] != '', 'First mid should be non-empty');
     70    ok(rids[1] != '', 'Second mid should be non-empty');
     71    info(`rids: ${JSON.stringify(rids)}`);
     72 
     73    const answer = await answerer.createAnswer();
     74 
     75    const mungedAnswer = midToRid(answer);
     76    info(`Transformed recv answer to simulcast: ${answer.sdp} to ${mungedAnswer}`);
     77    await offerer.setRemoteDescription({type: "answer", sdp: mungedAnswer});
     78    await answerer.setLocalDescription(answer);
     79 
     80    is(metadataToBeLoaded.length, 2, 'Offerer should have gotten 2 ontrack events');
     81    info('Waiting for 2 loadedmetadata events');
     82    const videoElems = await Promise.all(metadataToBeLoaded);
     83 
     84    const statsReady =
     85      Promise.all([waitForSyncedRtcp(offerer), waitForSyncedRtcp(answerer)]);
     86 
     87    const helper = new VideoStreamHelper();
     88    info('Waiting for first video element to start playing');
     89    await helper.checkVideoPlaying(videoElems[0]);
     90    info('Waiting for second video element to start playing');
     91    await helper.checkVideoPlaying(videoElems[1]);
     92 
     93    is(videoElems[0].videoWidth, 64,
     94       "sink is same width as source, modulo our cropping algorithm");
     95    is(videoElems[0].videoHeight, 64,
     96       "sink is same height as source, modulo our cropping algorithm");
     97    is(videoElems[1].videoWidth, 32,
     98       "sink is 1/2 width of source, modulo our cropping algorithm");
     99    is(videoElems[1].videoHeight, 32,
    100       "sink is 1/2 height of source, modulo our cropping algorithm");
    101 
    102    await statsReady;
    103    const senderStats = await sender.getStats();
    104    checkSenderStats(senderStats, 2);
    105    checkExpectedFields(senderStats);
    106    pedanticChecks(senderStats);
    107 
    108    emitter.stop();
    109    videoStream.getVideoTracks()[0].stop();
    110    offerer.close();
    111    answerer.close();
    112  });
    113 </script>
    114 </pre>
    115 </body>
    116 </html>