summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/tests/mochitests/test_peerConnection_replaceNullTrackThenRenegotiateVideo.html
blob: d7bd6d8a373f543b3ceb3dee4f3200a5ec9efc4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<!DOCTYPE HTML>
<html>
<head>
  <script type="application/javascript" src="pc.js"></script>
  <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
  <script type="application/javascript" src="simulcast.js"></script></head>
<body>
<pre id="test">
<script type="application/javascript">
  createHTML({
    bug: "1763832",
    title: "Renegotiation (video): Start with no track and recvonly, then replace and set direction to sendrecv, then renegotiate"
  });

  runNetworkTest(async () => {
    await pushPrefs(
      ['media.video_loopback_dev', ''],
      ['media.navigator.streams.fake', true]);
    // [TODO] re-enable HW decoder after bug 1526207 is fixed.
    if (navigator.userAgent.includes("Android")) {
      await pushPrefs(["media.navigator.mediadatadecoder_vpx_enabled", false],
                      ["media.webrtc.hw.h264.enabled", false]);
    }

    const offerer = new RTCPeerConnection();
    const answerer = new RTCPeerConnection();
    const transceiverSend = offerer.addTransceiver('video', {direction: 'recvonly'});

    const add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed);
    offerer.onicecandidate = e => add(answerer, e.candidate, generateErrorCallback());
    answerer.onicecandidate = e => add(offerer, e.candidate, generateErrorCallback());

    await offerer.setLocalDescription();
    await answerer.setRemoteDescription(offerer.localDescription);
    await answerer.setLocalDescription();
    await offerer.setRemoteDescription(answerer.localDescription);

    // add video with replaceTrack, set send bit, and renegotiate
    const stream = await navigator.mediaDevices.getUserMedia({video: true});
    const [track] = stream.getVideoTracks();
    transceiverSend.sender.replaceTrack(track);
    transceiverSend.direction = "sendrecv";
    const metadataToBeLoaded = [];
    answerer.ontrack = (e) => {
      metadataToBeLoaded.push(getPlaybackWithLoadedMetadata(e.track));
    };

    await offerer.setLocalDescription();
    await answerer.setRemoteDescription(offerer.localDescription);
    await answerer.setLocalDescription();
    await offerer.setRemoteDescription(answerer.localDescription);

    const elems = await Promise.all(metadataToBeLoaded);
    is(elems.length, 1, "Should have one video element");

    const helper = new VideoStreamHelper();
    await helper.checkVideoPlaying(elems[0]);
  });

</script>
</pre>
</body>
</html>