| <!doctype html> | |
| <html> | |
| <head> | |
| <meta charset=utf-8> | |
| <meta name="timeout" content="long"> | |
| <script src=/resources/testharness.js></script> | |
| <script src=/resources/testharnessreport.js></script> | |
| <script src="RTCPeerConnection-helper.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| 'use strict'; | |
| // This test checks that <video> capture works via PeerConnection. | |
| promise_test(async t => { | |
| const sourceVideo = document.createElement('video'); | |
| sourceVideo.src = "/media/test-v-128k-320x240-24fps-8kfr.webm"; | |
| sourceVideo.loop = true; | |
| const onCanPlay = new Promise(r => sourceVideo.oncanplay = r); | |
| await onCanPlay; | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const pc2 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc2.close()); | |
| // Attach video to pc1. | |
| const stream = sourceVideo.captureStream(); | |
| const tracks = stream.getTracks(); | |
| pc1.addTrack(tracks[0]); | |
| const destVideo = document.createElement('video'); | |
| destVideo.autoplay = true; | |
| // Setup pc1->pc2. | |
| const haveTrackEvent1 = new Promise(r => pc2.ontrack = r); | |
| exchangeIceCandidates(pc1, pc2); | |
| await pc1.setLocalDescription(); | |
| await pc2.setRemoteDescription(pc1.localDescription); | |
| await pc2.setLocalDescription(); | |
| await pc1.setRemoteDescription(pc2.localDescription); | |
| // Display pc2 received track in video element. | |
| const onLoadedMetadata = new Promise(r => destVideo.onloadedmetadata = r); | |
| destVideo.srcObject = new MediaStream([(await haveTrackEvent1).track]); | |
| // Start playback and wait for video on the other side. | |
| sourceVideo.play(); | |
| await onLoadedMetadata; | |
| // Wait until the video has non-zero resolution and some non-black pixels. | |
| await new Promise(p => { | |
| function checkColor() { | |
| if (destVideo.videoWidth > 0 && getVideoSignal(destVideo) > 0.0) | |
| p(); | |
| else | |
| t.step_timeout(checkColor, 0); | |
| } | |
| checkColor(); | |
| }); | |
| // Uses Helper.js GetVideoSignal to query |destVideo| pixel value at a certain position. | |
| const pixelValue = getVideoSignal(destVideo); | |
| // Anything non-black means that capture works. | |
| assert_not_equals(pixelValue, 0); | |
| }, "Capturing a video element and sending it via PeerConnection"); | |
| </script> | |
| </body> | |
| </html> |