tor-browser

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

rtp-demuxing.html (4085B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <meta name="timeout" content="long">
      4 <title>RTCPeerConnection payload type demuxing</title>
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src="../RTCPeerConnection-helper.js"></script>
      8 <script>
      9 'use strict';
     10 promise_test(async t => {
     11  const caller = new RTCPeerConnection();
     12  t.add_cleanup(() => caller.close());
     13  const callee = new RTCPeerConnection();
     14  t.add_cleanup(() => callee.close());
     15  exchangeIceCandidates(caller, callee);
     16 
     17  const stream = await getNoiseStream({video: true});
     18  t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
     19  stream.getTracks().forEach(track => caller.addTrack(track, stream));
     20  stream.getTracks().forEach(track => caller.addTrack(track.clone(), stream.clone()));
     21 
     22  let callCount = 0;
     23  let metadataToBeLoaded = new Promise(resolve => {
     24    callee.ontrack = (e) => {
     25      const stream = e.streams[0];
     26      const v = document.createElement('video');
     27      v.autoplay = true;
     28      v.srcObject = stream;
     29      v.id = stream.id
     30      v.addEventListener('loadedmetadata', () => {
     31        if (++callCount === 2) {
     32          resolve();
     33        }
     34      });
     35    };
     36  });
     37 
     38  // Restrict first transceiver to VP8, second to H264.
     39  const {codecs} = RTCRtpSender.getCapabilities('video');
     40  const vp8 = codecs.find(c => c.mimeType === 'video/VP8');
     41  const h264 = codecs.find(c => c.mimeType === 'video/H264');
     42  caller.getTransceivers()[0].setCodecPreferences([vp8]);
     43  caller.getTransceivers()[1].setCodecPreferences([h264]);
     44 
     45  const offer = await caller.createOffer();
     46  // Replace the mid header extension and all ssrc lines
     47  // with bogus. The receiver will be forced to do payload type demuxing.
     48  const sdp = offer.sdp
     49    .replace(/rtp-hdrext:sdes/g, 'rtp-hdrext:something')
     50    .replace(/a=ssrc:/g, 'a=notssrc');
     51 
     52  await callee.setRemoteDescription({type: 'offer', sdp});
     53  await caller.setLocalDescription(offer);
     54 
     55  const answer = await callee.createAnswer();
     56  await caller.setRemoteDescription(answer);
     57  await callee.setLocalDescription(answer);
     58 
     59  assert_equals(callee.getReceivers().length, 2);
     60 
     61  await metadataToBeLoaded;
     62 }, 'Can demux two video tracks with different payload types on a bundled connection');
     63 
     64 promise_test(async t => {
     65  const caller = new RTCPeerConnection({bundlePolicy: 'max-compat'});
     66  t.add_cleanup(() => caller.close());
     67  const callee = new RTCPeerConnection();
     68  t.add_cleanup(() => callee.close());
     69  exchangeIceCandidates(caller, callee);
     70 
     71  const stream = await getNoiseStream({video: true});
     72  t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
     73  stream.getTracks().forEach(track => caller.addTrack(track, stream));
     74  stream.getTracks().forEach(track => caller.addTrack(track.clone(), stream.clone()));
     75 
     76  let callCount = 0;
     77  let metadataToBeLoaded = new Promise(resolve => {
     78    callee.ontrack = (e) => {
     79      const stream = e.streams[0];
     80      const v = document.createElement('video');
     81      v.autoplay = true;
     82      v.srcObject = stream;
     83      v.id = stream.id
     84      v.addEventListener('loadedmetadata', () => {
     85        if (++callCount === 2) {
     86          resolve();
     87        }
     88      });
     89    };
     90  });
     91 
     92  const offer = await caller.createOffer();
     93  // Replace BUNDLE, the mid header extension and all ssrc lines
     94  // with bogus. The receiver will be forced to do payload type demuxing
     95  // which is still possible because the different m-lines arrive on
     96  // different ports/sockets.
     97  const sdp = offer.sdp.replace('BUNDLE', 'SOMETHING')
     98    .replace(/rtp-hdrext:sdes/g, 'rtp-hdrext:something')
     99    .replace(/a=ssrc:/g, 'a=notssrc');
    100 
    101  await callee.setRemoteDescription({type: 'offer', sdp});
    102  await caller.setLocalDescription(offer);
    103 
    104  const answer = await callee.createAnswer();
    105  await caller.setRemoteDescription(answer);
    106  await callee.setLocalDescription(answer);
    107 
    108  assert_equals(callee.getReceivers().length, 2);
    109 
    110  await metadataToBeLoaded;
    111 }, 'Can demux two video tracks with the same payload type on an unbundled connection');
    112 
    113 </script>