| <!DOCTYPE html> | |
| <html> | |
| <title>Test the VideoTrackReader API.</title> | |
| <body></body> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/common/media.js"></script> | |
| <script> | |
| var testVideo = { | |
| url: getVideoURI('/media/movie_5'), | |
| height: 240, | |
| width: 320, | |
| } | |
| async function getMediaStream() { | |
| let video = document.createElement('video'); | |
| document.body.appendChild(video); | |
| video.src = testVideo.url; | |
| await video.play(); | |
| return video.captureStream(); | |
| } | |
| promise_test(async function(t) { | |
| let stream = await getMediaStream(); | |
| let vtr = new VideoTrackReader(stream.getVideoTracks()[0]); | |
| }, 'Test we can construct a VideoTrackReader.'); | |
| promise_test(async function(t) { | |
| let stream = await getMediaStream(); | |
| let vtr = new VideoTrackReader(stream.getVideoTracks()[0]); | |
| let numberFrames = 0; | |
| return new Promise(resolve => { | |
| vtr.start(t.step_func(frame => { | |
| assert_equals(frame.codedWidth, testVideo.width); | |
| assert_equals(frame.codedHeight, testVideo.height); | |
| assert_not_equals(frame.timestamp, null); | |
| frame.destroy(); | |
| if (++numberFrames == 5) { | |
| vtr.stop(); | |
| resolve(); | |
| } | |
| })); | |
| }); | |
| }, 'Test we can start and stop a VideoTrackReader.'); | |
| promise_test(async function(t) { | |
| let stream = await getMediaStream(); | |
| let vtr = new VideoTrackReader(stream.getVideoTracks()[0]); | |
| let stopped = false; | |
| return new Promise(resolve => { | |
| vtr.start(t.step_func(() => { | |
| assert_false(stopped, "A stopped callback should never be called again"); | |
| vtr.stop(); | |
| vtr.start(resolve); | |
| stopped = true; | |
| })); | |
| }); | |
| }, 'Test we can restart a stopped VideoTrackReader.'); | |
| promise_test(async function(t) { | |
| let stream = await getMediaStream(); | |
| let track = stream.getVideoTracks()[0]; | |
| let vtr_a = new VideoTrackReader(track); | |
| let vtr_b = new VideoTrackReader(track); | |
| let receivedFrame_a = false; | |
| let receivedFrame_b = false; | |
| return Promise.all([ | |
| new Promise(resolve => { vtr_a.start(resolve); }), | |
| new Promise(resolve => { vtr_b.start(resolve); }), | |
| ]); | |
| }, 'Test we can create multiple VideoTrackReaders from the same track.'); | |
| promise_test(async function(t) { | |
| let stream = await getMediaStream(); | |
| let audioTrack = stream.getAudioTracks()[0]; | |
| assert_throws_js(TypeError, () => { | |
| let vtr = new VideoTrackReader(audioTrack); | |
| }) | |
| }, 'Test creating a VideoTrackReaders from an audio track throws.'); | |
| promise_test(async function(t) { | |
| let stream = await getMediaStream(); | |
| let vtr = new VideoTrackReader(stream.getVideoTracks()[0]); | |
| assert_throws_dom("InvalidStateError", () => { | |
| vtr.stop(); | |
| }) | |
| }, 'Test stopping a stopped VideoTrackReader throws.'); | |
| promise_test(async function(t) { | |
| let stream = await getMediaStream(); | |
| let vtr = new VideoTrackReader(stream.getVideoTracks()[0]); | |
| vtr.start(() => {}); | |
| assert_throws_dom("InvalidStateError", () => { | |
| vtr.start(() => {}); | |
| }) | |
| }, 'Test starting a started VideoTrackReader throws.'); | |
| </script> | |
| </html> |