test_getUserMedia_mediaStreamConstructors.html (7900B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <script type="application/javascript" src="mediaStreamPlayback.js"></script> 5 </head> 6 <body> 7 <pre id="test"> 8 <script type="application/javascript"> 9 "use strict"; 10 11 createHTML({ 12 title: "MediaStream constructors with getUserMedia streams Test", 13 bug: "1070216" 14 }); 15 16 var audioContext = new AudioContext(); 17 var videoElement; 18 19 runTest(() => Promise.resolve() 20 .then(() => videoElement = createMediaElement('video', 'constructorsTest')) 21 .then(() => getUserMedia({video: true})).then(gUMStream => { 22 info("Test default constructor with video"); 23 ok(gUMStream.active, "gUMStream with one track should be active"); 24 var track = gUMStream.getTracks()[0]; 25 26 var stream = new MediaStream(); 27 ok(!stream.active, "New MediaStream should be inactive"); 28 checkMediaStreamContains(stream, [], "Default constructed stream"); 29 30 stream.addTrack(track); 31 ok(stream.active, "MediaStream should be active after adding a track"); 32 checkMediaStreamContains(stream, [track], "Added video track"); 33 34 var playback = new MediaStreamPlayback(videoElement, stream); 35 return playback.playMedia(false).then(() => { 36 ok(!gUMStream.active, "gUMStream should be inactive after stopping"); 37 ok(!stream.active, "stream with stopped tracks should be inactive"); 38 }); 39 }) 40 .then(() => getUserMedia({video: true})).then(gUMStream => { 41 info("Test copy constructor with gUM stream"); 42 ok(gUMStream.active, "gUMStream with one track should be active"); 43 var track = gUMStream.getTracks()[0]; 44 45 var stream = new MediaStream(gUMStream); 46 ok(stream.active, "List constructed MediaStream should be active"); 47 checkMediaStreamContains(stream, [track], "Copy constructed video track"); 48 49 var playback = new MediaStreamPlayback(videoElement, stream); 50 return playback.playMedia(false).then(() => { 51 ok(!gUMStream.active, "gUMStream should be inactive after stopping"); 52 ok(!stream.active, "stream with stopped tracks should be inactive"); 53 }); 54 }) 55 .then(() => getUserMedia({video: true})).then(gUMStream => { 56 info("Test list constructor with empty list"); 57 ok(gUMStream.active, "gUMStream with one track should be active"); 58 var track = gUMStream.getTracks()[0]; 59 60 var stream = new MediaStream([]); 61 ok(!stream.active, "Empty-list constructed MediaStream should be inactive"); 62 checkMediaStreamContains(stream, [], "Empty-list constructed stream"); 63 64 stream.addTrack(track); 65 ok(stream.active, "MediaStream should be active after adding a track"); 66 checkMediaStreamContains(stream, [track], "Added video track"); 67 68 var playback = new MediaStreamPlayback(videoElement, stream); 69 return playback.playMedia(false).then(() => { 70 ok(!gUMStream.active, "gUMStream should be inactive after stopping"); 71 ok(!stream.active, "stream with stopped tracks should be inactive"); 72 }); 73 }) 74 .then(() => getUserMedia({audio: true, video: true})).then(gUMStream => { 75 info("Test list constructor with a gUM audio/video stream"); 76 ok(gUMStream.active, "gUMStream with two tracks should be active"); 77 var audioTrack = gUMStream.getAudioTracks()[0]; 78 var videoTrack = gUMStream.getVideoTracks()[0]; 79 80 var stream = new MediaStream([audioTrack, videoTrack]); 81 ok(stream.active, "List constructed MediaStream should be active"); 82 checkMediaStreamContains(stream, [audioTrack, videoTrack], 83 "List constructed audio and video tracks"); 84 85 var playback = new MediaStreamPlayback(videoElement, stream); 86 return playback.playMedia(false).then(() => { 87 ok(!gUMStream.active, "gUMStream should be inactive after stopping"); 88 ok(!stream.active, "stream with stopped tracks should be inactive"); 89 }); 90 }) 91 .then(() => getUserMedia({video: true})).then(gUMStream => { 92 info("Test list constructor with gUM-video and WebAudio tracks"); 93 ok(gUMStream.active, "gUMStream with one track should be active"); 94 var audioStream = createOscillatorStream(audioContext, 2000); 95 ok(audioStream.active, "WebAudio stream should be active"); 96 97 var audioTrack = audioStream.getTracks()[0]; 98 var videoTrack = gUMStream.getTracks()[0]; 99 100 var stream = new MediaStream([audioTrack, videoTrack]); 101 ok(stream.active, "List constructed MediaStream should be active"); 102 checkMediaStreamContains(stream, [audioTrack, videoTrack], 103 "List constructed WebAudio and gUM-video tracks"); 104 105 var playback = new MediaStreamPlayback(videoElement, stream); 106 return playback.playMedia(false).then(() => { 107 gUMStream.getTracks().forEach(t => t.stop()); 108 ok(!gUMStream.active, "gUMStream should be inactive after stopping"); 109 ok(!stream.active, "stream with stopped tracks should be inactive"); 110 }); 111 }) 112 .then(() => { 113 var osc1k = createOscillatorStream(audioContext, 1000); 114 var audioTrack1k = osc1k.getTracks()[0]; 115 116 var osc5k = createOscillatorStream(audioContext, 5000); 117 var audioTrack5k = osc5k.getTracks()[0]; 118 119 var osc10k = createOscillatorStream(audioContext, 10000); 120 var audioTrack10k = osc10k.getTracks()[0]; 121 122 return Promise.resolve().then(() => { 123 info("Analysing audio output with empty default constructed stream"); 124 var stream = new MediaStream(); 125 var analyser = new AudioStreamAnalyser(audioContext, stream); 126 return analyser.waitForAnalysisSuccess(array => 127 array[analyser.binIndexForFrequency(1000)] < 50 && 128 array[analyser.binIndexForFrequency(5000)] < 50 && 129 array[analyser.binIndexForFrequency(10000)] < 50) 130 .then(() => analyser.disconnect()); 131 }).then(() => { 132 info("Analysing audio output with copy constructed 5k stream"); 133 var stream = new MediaStream(osc5k); 134 is(stream.active, osc5k.active, 135 "Copy constructed MediaStream should preserve active state"); 136 var analyser = new AudioStreamAnalyser(audioContext, stream); 137 return analyser.waitForAnalysisSuccess(array => 138 array[analyser.binIndexForFrequency(1000)] < 50 && 139 array[analyser.binIndexForFrequency(5000)] > 200 && 140 array[analyser.binIndexForFrequency(10000)] < 50) 141 .then(() => analyser.disconnect()); 142 }).then(() => { 143 info("Analysing audio output with empty-list constructed stream"); 144 var stream = new MediaStream([]); 145 var analyser = new AudioStreamAnalyser(audioContext, stream); 146 return analyser.waitForAnalysisSuccess(array => 147 array[analyser.binIndexForFrequency(1000)] < 50 && 148 array[analyser.binIndexForFrequency(5000)] < 50 && 149 array[analyser.binIndexForFrequency(10000)] < 50) 150 .then(() => analyser.disconnect()); 151 }).then(() => { 152 info("Analysing audio output with list constructed 1k, 5k and 10k tracks"); 153 var stream = new MediaStream([audioTrack1k, audioTrack5k, audioTrack10k]); 154 ok(stream.active, 155 "List constructed MediaStream from WebAudio should be active"); 156 var analyser = new AudioStreamAnalyser(audioContext, stream); 157 return analyser.waitForAnalysisSuccess(array => 158 array[analyser.binIndexForFrequency(50)] < 50 && 159 array[analyser.binIndexForFrequency(1000)] > 200 && 160 array[analyser.binIndexForFrequency(2500)] < 50 && 161 array[analyser.binIndexForFrequency(5000)] > 200 && 162 array[analyser.binIndexForFrequency(7500)] < 50 && 163 array[analyser.binIndexForFrequency(10000)] > 200 && 164 array[analyser.binIndexForFrequency(11000)] < 50) 165 .then(() => analyser.disconnect()); 166 }); 167 })); 168 </script> 169 </pre> 170 </body> 171 </html>