test_getUserMedia_addTrackRemoveTrack.html (7223B)
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's addTrack() and removeTrack() with getUserMedia streams Test", 13 bug: "1103188" 14 }); 15 16 runTest(() => Promise.resolve() 17 .then(() => getUserMedia({audio: true})).then(stream => 18 getUserMedia({video: true}).then(otherStream => { 19 info("Test addTrack()ing a video track to an audio-only gUM stream"); 20 var track = stream.getTracks()[0]; 21 var otherTrack = otherStream.getTracks()[0]; 22 23 stream.addTrack(track); 24 checkMediaStreamContains(stream, [track], "Re-added audio"); 25 26 stream.addTrack(otherTrack); 27 checkMediaStreamContains(stream, [track, otherTrack], "Added video"); 28 29 var testElem = createMediaElement('video', 'testAddTrackAudioVideo'); 30 var playback = new MediaStreamPlayback(testElem, stream); 31 return playback.playMedia(false); 32 })) 33 .then(() => getUserMedia({video: true})).then(stream => 34 getUserMedia({video: true}).then(otherStream => { 35 info("Test addTrack()ing a video track to a video-only gUM stream"); 36 var track = stream.getTracks()[0]; 37 var otherTrack = otherStream.getTracks()[0]; 38 39 stream.addTrack(track); 40 checkMediaStreamContains(stream, [track], "Re-added video"); 41 42 stream.addTrack(otherTrack); 43 checkMediaStreamContains(stream, [track, otherTrack], "Added video"); 44 45 var test = createMediaElement('video', 'testAddTrackDoubleVideo'); 46 var playback = new MediaStreamPlayback(test, stream); 47 return playback.playMedia(false); 48 })) 49 .then(() => getUserMedia({video: true})).then(stream => 50 getUserMedia({video: true}).then(otherStream => { 51 info("Test removeTrack() existing and added video tracks from a video-only gUM stream"); 52 var track = stream.getTracks()[0]; 53 var otherTrack = otherStream.getTracks()[0]; 54 55 stream.removeTrack(otherTrack); 56 checkMediaStreamContains(stream, [track], "Removed non-existing video"); 57 58 stream.addTrack(otherTrack); 59 checkMediaStreamContains(stream, [track, otherTrack], "Added video"); 60 61 stream.removeTrack(otherTrack); 62 checkMediaStreamContains(stream, [track], "Removed added video"); 63 64 stream.removeTrack(otherTrack); 65 checkMediaStreamContains(stream, [track], "Re-removed added video"); 66 67 stream.removeTrack(track); 68 checkMediaStreamContains(stream, [], "Removed original video"); 69 70 var elem = createMediaElement('video', 'testRemoveAllVideo'); 71 var loadeddata = false; 72 elem.onloadeddata = () => { loadeddata = true; elem.onloadeddata = null; }; 73 elem.srcObject = stream; 74 elem.play(); 75 return wait(500).then(() => { 76 ok(!loadeddata, "Stream without tracks shall not raise 'loadeddata' on media element"); 77 elem.pause(); 78 elem.srcObject = null; 79 }) 80 .then(() => { 81 stream.addTrack(track); 82 checkMediaStreamContains(stream, [track], "Re-added added-then-removed track"); 83 var playback = new MediaStreamPlayback(elem, stream); 84 return playback.playMedia(false); 85 }) 86 .then(() => otherTrack.stop()); 87 })) 88 .then(() => getUserMedia({ audio: true })).then(audioStream => 89 getUserMedia({ video: true }).then(videoStream => { 90 info("Test adding track and removing the original"); 91 var audioTrack = audioStream.getTracks()[0]; 92 var videoTrack = videoStream.getTracks()[0]; 93 videoStream.removeTrack(videoTrack); 94 audioStream.addTrack(videoTrack); 95 96 checkMediaStreamContains(videoStream, [], "1, Removed original track"); 97 checkMediaStreamContains(audioStream, [audioTrack, videoTrack], 98 "2, Added external track"); 99 100 var elem = createMediaElement('video', 'testAddRemoveOriginalTrackVideo'); 101 var playback = new MediaStreamPlayback(elem, audioStream); 102 return playback.playMedia(false); 103 })) 104 .then(() => getUserMedia({ audio: true, video: true })).then(stream => { 105 info("Test removing stopped tracks"); 106 stream.getTracks().forEach(t => { 107 t.stop(); 108 stream.removeTrack(t); 109 }); 110 checkMediaStreamContains(stream, [], "Removed stopped tracks"); 111 }) 112 .then(() => { 113 var ac = new AudioContext(); 114 115 var osc1k = createOscillatorStream(ac, 1000); 116 var audioTrack1k = osc1k.getTracks()[0]; 117 118 var osc5k = createOscillatorStream(ac, 5000); 119 var audioTrack5k = osc5k.getTracks()[0]; 120 121 var osc10k = createOscillatorStream(ac, 10000); 122 var audioTrack10k = osc10k.getTracks()[0]; 123 124 var stream = osc1k; 125 return Promise.resolve().then(() => { 126 info("Analysing audio output with original 1k track"); 127 var analyser = new AudioStreamAnalyser(ac, stream); 128 return analyser.waitForAnalysisSuccess(array => 129 array[analyser.binIndexForFrequency(50)] < 50 && 130 array[analyser.binIndexForFrequency(1000)] > 200 && 131 array[analyser.binIndexForFrequency(5000)] < 50 && 132 array[analyser.binIndexForFrequency(10000)] < 50); 133 }).then(() => { 134 info("Analysing audio output with removed original 1k track and added 5k track"); 135 stream.removeTrack(audioTrack1k); 136 stream.addTrack(audioTrack5k); 137 var analyser = new AudioStreamAnalyser(ac, stream); 138 return analyser.waitForAnalysisSuccess(array => 139 array[analyser.binIndexForFrequency(1000)] < 50 && 140 array[analyser.binIndexForFrequency(5000)] > 200 && 141 array[analyser.binIndexForFrequency(10000)] < 50); 142 }).then(() => { 143 info("Analysing audio output with removed 5k track and added 10k track"); 144 stream.removeTrack(audioTrack5k); 145 stream.addTrack(audioTrack10k); 146 var analyser = new AudioStreamAnalyser(ac, stream); 147 return analyser.waitForAnalysisSuccess(array => 148 array[analyser.binIndexForFrequency(1000)] < 50 && 149 array[analyser.binIndexForFrequency(5000)] < 50 && 150 array[analyser.binIndexForFrequency(10000)] > 200); 151 }).then(() => { 152 info("Analysing audio output with re-added 1k, 5k and added 10k tracks"); 153 stream.addTrack(audioTrack1k); 154 stream.addTrack(audioTrack5k); 155 var analyser = new AudioStreamAnalyser(ac, stream); 156 return analyser.waitForAnalysisSuccess(array => 157 array[analyser.binIndexForFrequency(50)] < 50 && 158 array[analyser.binIndexForFrequency(1000)] > 200 && 159 array[analyser.binIndexForFrequency(2500)] < 50 && 160 array[analyser.binIndexForFrequency(5000)] > 200 && 161 array[analyser.binIndexForFrequency(7500)] < 50 && 162 array[analyser.binIndexForFrequency(10000)] > 200 && 163 array[analyser.binIndexForFrequency(11000)] < 50); 164 }); 165 })); 166 </script> 167 </pre> 168 </body> 169 </html>