| <!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.close(); |
| |
| 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> |