tor-browser

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

videoFrame-metadata-rtpTimestamp.https.html (3287B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8">
      3 <title>VideoFrame.metadata.rtpTimestamp exposed via MediaStreamTrackProcessor over WebRTC</title>
      4 
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src="/webrtc/RTCPeerConnection-helper.js"></script>
      8 
      9 <script>
     10    promise_test(async t => {
     11        if (!("MediaStreamTrackProcessor" in self) ||
     12            !("VideoFrame" in self)) {
     13            assert_implements_optional(true, "MediaStreamTrackProcessor/VideoFrame APIs not supported. Skipping test.");
     14            return;
     15        }
     16 
     17        const stream = await getNoiseStream({ video: true });
     18        const track = stream.getVideoTracks()[0];
     19 
     20        // This test validates the RTP timestamps on the encoded video frames
     21        // sent by a WebRTC peer (sender) are preserved when received by the
     22        // WebRTC receiver which in turn uses the MediaStreamTrackProcessor
     23        // API to render the video frames. We expect the RTP timestamps to
     24        // be available in the metadata() object exposed by the VideoFrame
     25        // in MediaStreamTrackProcessor if the VideoFrameMetadataRtpTimestamp
     26        // feature is enabled.
     27 
     28        const senderPc = new RTCPeerConnection();
     29        const receiverPc = new RTCPeerConnection();
     30 
     31        senderPc.onicecandidate = e => e.candidate && receiverPc.addIceCandidate(e.candidate);
     32        receiverPc.onicecandidate = e => e.candidate && senderPc.addIceCandidate(e.candidate);
     33 
     34        const receiverTrackPromise = new Promise(resolve => {
     35            receiverPc.ontrack = e => resolve(e.track);
     36        });
     37 
     38        const sender = senderPc.addTrack(track, stream);
     39 
     40        // Offer/Answer exchange
     41        const offer = await senderPc.createOffer();
     42        await senderPc.setLocalDescription(offer);
     43        await receiverPc.setRemoteDescription(offer);
     44 
     45        const answer = await receiverPc.createAnswer();
     46        await receiverPc.setLocalDescription(answer);
     47        await senderPc.setRemoteDescription(answer);
     48 
     49        let receiverTrack = await receiverTrackPromise;
     50 
     51        // Send the received track to MediaStreamTrackProcessor for rendering.
     52        const processor = new MediaStreamTrackProcessor({ track: receiverTrack });
     53        const reader = processor.readable.getReader();
     54 
     55        const result = await reader.read();
     56        const frame = result.value;
     57        const metadata = frame.metadata?.();
     58 
     59        // If the VideoFrameMetadataRtpTimestamp feature is enabled we expect that
     60        // the rtpTimestamp will be available in the metadata.
     61        if (metadata && 'rtpTimestamp' in metadata) {
     62            assert_equals(typeof metadata.rtpTimestamp, "number", "rtpTimestamp should be a number");
     63            assert_greater_than(metadata.rtpTimestamp, 0, "rtpTimestamp should be non-zero");
     64            assert_true(true, "rtpTimestamp present in VideoFrame metadata")
     65        } else {
     66            assert_true(true, "rtpTimestamp not present in VideoFrame metadata. Skipping validation because feature may be disabled.");
     67        }
     68 
     69        frame.close();
     70        receiverTrack.stop();
     71        track.stop();
     72        senderPc.close();
     73        receiverPc.close();
     74    }, "Check VideoFrame.metadata.rtpTimestamp only when feature is enabled");
     75 </script>