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>