File: RTCRtpScriptTransform-sender-worker-single-frame.https.html

package info (click to toggle)
firefox 143.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,617,328 kB
  • sloc: cpp: 7,478,492; javascript: 6,417,157; ansic: 3,720,058; python: 1,396,372; xml: 627,523; asm: 438,677; java: 186,156; sh: 63,477; makefile: 19,171; objc: 13,059; perl: 12,983; yacc: 4,583; cs: 3,846; pascal: 3,405; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (133 lines) | stat: -rw-r--r-- 5,219 bytes parent folder | download | duplicates (10)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<!DOCTYPE html>
<html>
<head>
<title>RTCRtpScriptTransform Insertable Streams - Worker</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src='../../mediacapture-streams/permission-helper.js'></script>
<script src="../../webrtc/RTCPeerConnection-helper.js"></script>
</head>
<body>
<script>

function areArrayBuffersEqual(buffer1, buffer2)
{
  if (buffer1.byteLength !== buffer2.byteLength) {
    return false;
  }
  let array1 = new Int8Array(buffer1);
  var array2 = new Int8Array(buffer2);
  for (let i = 0 ; i < buffer1.byteLength ; ++i) {
    if (array1[i] !== array2[i]) {
      return false;
    }
  }
  return true;
}


promise_test(async t => {
  const caller = new RTCPeerConnection();
  t.add_cleanup(() => caller.close());
  const callee = new RTCPeerConnection();
  t.add_cleanup(() => callee.close());

  // Video is used in a later test, so we ask for both permissions
  await setMediaPermission();
  const stream = await navigator.mediaDevices.getUserMedia({audio:true});
  const track = stream.getTracks()[0];
  t.add_cleanup(() => track.stop());

  const audioSender = caller.addTrack(track);

  const senderWorker = new Worker('RTCRtpScriptTransform-sender-worker-single-frame.js');
  audioSender.transform = new RTCRtpScriptTransform(senderWorker);
  t.add_cleanup(() => senderWorker.terminate());
  let expectedFrameInfo = null;
  let numVerifiedFrames = 0;
  const onmessagePromise = new Promise(resolve => {
    senderWorker.onmessage = t.step_func(message => {
      if (!(message.data instanceof RTCEncodedAudioFrame)) {
        // This is the first message sent from the Worker to the test.
        // It contains an object (not an RTCEncodedAudioFrame) with the same
        // fields as the RTCEncodedAudioFrame to be sent in follow-up messages.
        // These serve as expected values to validate that the
        // RTCEncodedAudioFrame is sent correctly back to the test in the next
        // message.
        expectedFrameInfo = message.data;
      } else {
        // This is the frame sent by the Worker after reading it from the
        // readable stream. The Worker sends it twice after sending the
        // verification message.
        const frame = message.data;
        assert_equals(frame.type, expectedFrameInfo.type);
        assert_true(areArrayBuffersEqual(frame.data, expectedFrameInfo.data));
        assert_equals(frame.getMetadata().synchronizationSource, expectedFrameInfo.metadata.synchronizationSource);
        assert_equals(frame.getMetadata().rtpTimestamp, expectedFrameInfo.metadata.rtpTimestamp);

        if (++numVerifiedFrames == 2)
          resolve();
      }
    });
  });

  exchangeIceCandidates(caller, callee);
  await exchangeOfferAnswer(caller, callee);

  return onmessagePromise;
}, 'RTCRtpSender initializes its transform attribute and the Worker sends an RTCEncodedAudioFrame back');

promise_test(async t => {
  const caller = new RTCPeerConnection();
  t.add_cleanup(() => caller.close());
  const callee = new RTCPeerConnection();
  t.add_cleanup(() => callee.close());

  const stream = await navigator.mediaDevices.getUserMedia({video:true});
  const videoTrack = stream.getVideoTracks()[0];
  t.add_cleanup(() => videoTrack.stop());

  const videoSender = caller.addTrack(videoTrack)

  const senderWorker = new Worker('RTCRtpScriptTransform-sender-worker-single-frame.js');
  videoSender.transform = new RTCRtpScriptTransform(senderWorker);
  t.add_cleanup(() => senderWorker.terminate());

  let expectedFrameInfo = null;
  let numVerifiedFrames = 0;
  const onmessagePromise = new Promise(resolve => {
    senderWorker.onmessage = t.step_func(message => {
      if (!(message.data instanceof RTCEncodedVideoFrame)) {
        // This is the first message sent from the Worker to the test.
        // It contains an object (not an RTCEncodedVideoFrame) with the same
        // fields as the RTCEncodedVideoFrame to be sent in follow-up messages.
        // These serve as expected values to validate that the
        // RTCEncodedVideoFrame is sent correctly back to the test in the next
        // message.
        expectedFrameInfo = message.data;
      } else {
        // This is the frame sent by the Worker after reading it from the
        // readable stream. The Worker sends it twice after sending the
        // verification message.
        const frame = message.data;
        assert_equals(frame.type, expectedFrameInfo.type);
        assert_true(areArrayBuffersEqual(frame.data, expectedFrameInfo.data));
        assert_equals(frame.getMetadata().synchronizationSource, expectedFrameInfo.metadata.synchronizationSource);
        assert_equals(frame.getMetadata().rtpTimestamp, expectedFrameInfo.metadata.rtpTimestamp);
        if (++numVerifiedFrames == 2)
          resolve();
      }
    });
  });

  exchangeIceCandidates(caller, callee);
  await exchangeOfferAnswer(caller, callee);

  return onmessagePromise;
}, 'RTCRtpSender initializes its transform attribute and the Worker sends an RTCEncodedVideoFrame back');

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