mediasource-avtracks.html (7498B)
1 <!DOCTYPE html> 2 <!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --> 3 <meta charset="utf-8"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="mediasource-util.js"></script> 7 <script> 8 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 9 { 10 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); 11 sourceBuffer.appendBuffer(initSegment); 12 test.expectEvent(sourceBuffer.audioTracks, "addtrack", "sourceBuffer.audioTracks addtrack event"); 13 test.expectEvent(sourceBuffer.videoTracks, "addtrack", "sourceBuffer.videoTracks addtrack event"); 14 test.expectEvent(mediaElement.audioTracks, "addtrack", "mediaElement.audioTracks addtrack event"); 15 test.expectEvent(mediaElement.videoTracks, "addtrack", "mediaElement.videoTracks addtrack event"); 16 test.expectEvent(mediaElement, "loadedmetadata", "loadedmetadata done."); 17 test.expectEvent(sourceBuffer, "updateend", "initSegment append ended."); 18 test.waitForExpectedEvents(function() 19 { 20 assert_equals(sourceBuffer.videoTracks.length, 1, "videoTracks.length"); 21 assert_equals(sourceBuffer.videoTracks[0].kind, "main", "videoTrack.kind"); 22 assert_equals(sourceBuffer.videoTracks[0].label, "", "videoTrack.label"); 23 assert_equals(sourceBuffer.videoTracks[0].language, "eng", "videoTrack.language"); 24 assert_equals(sourceBuffer.videoTracks[0].sourceBuffer, sourceBuffer, "videoTrack.sourceBuffer"); 25 // The first video track is selected by default. 26 assert_true(sourceBuffer.videoTracks[0].selected, "sourceBuffer.videoTracks[0].selected"); 27 28 assert_equals(sourceBuffer.audioTracks.length, 1, "audioTracks.length"); 29 assert_equals(sourceBuffer.audioTracks[0].kind, "main", "audioTrack.kind"); 30 assert_equals(sourceBuffer.audioTracks[0].label, "", "audioTrack.label"); 31 assert_equals(sourceBuffer.audioTracks[0].language, "eng", "audioTrack.language"); 32 assert_equals(sourceBuffer.audioTracks[0].sourceBuffer, sourceBuffer, "audioTrack.sourceBuffer"); 33 // The first audio track is enabled by default. 34 assert_true(sourceBuffer.audioTracks[0].enabled, "sourceBuffer.audioTracks[0].enabled"); 35 36 assert_not_equals(sourceBuffer.audioTracks[0].id, sourceBuffer.videoTracks[0].id, "track ids must be unique"); 37 38 assert_equals(mediaElement.videoTracks.length, 1, "videoTracks.length"); 39 assert_equals(mediaElement.videoTracks[0], sourceBuffer.videoTracks[0], "mediaElement.videoTrack == sourceBuffer.videoTrack"); 40 41 assert_equals(mediaElement.audioTracks.length, 1, "audioTracks.length"); 42 assert_equals(mediaElement.audioTracks[0], sourceBuffer.audioTracks[0], "mediaElement.audioTrack == sourceBuffer.audioTrack"); 43 44 test.done(); 45 }); 46 }, "Check that media tracks and their properties are populated properly"); 47 48 function verifyTrackRemoval(test, mediaElement, mediaSource, sourceBuffer, trackRemovalAction, successCallback) { 49 assert_equals(sourceBuffer.audioTracks.length, 1, "audioTracks.length"); 50 assert_true(sourceBuffer.audioTracks[0].enabled, "sourceBuffer.audioTracks[0].enabled"); 51 assert_equals(sourceBuffer.videoTracks.length, 1, "videoTracks.length"); 52 assert_true(sourceBuffer.videoTracks[0].selected, "sourceBuffer.videoTracks[0].selected"); 53 54 var audioTrack = sourceBuffer.audioTracks[0]; 55 var videoTrack = sourceBuffer.videoTracks[0]; 56 57 // Verify removetrack events. 58 test.expectEvent(sourceBuffer.audioTracks, "removetrack", "sourceBuffer.audioTracks removetrack event"); 59 test.expectEvent(sourceBuffer.videoTracks, "removetrack", "sourceBuffer.videoTracks removetrack event"); 60 test.expectEvent(mediaElement.audioTracks, "removetrack", "mediaElement.audioTracks removetrack event"); 61 test.expectEvent(mediaElement.videoTracks, "removetrack", "mediaElement.videoTracks removetrack event"); 62 63 // Removing enabled audio track and selected video track should fire "change" events on mediaElement track lists. 64 test.expectEvent(mediaElement.audioTracks, "change", "mediaElement.audioTracks changed."); 65 test.expectEvent(mediaElement.videoTracks, "change", "mediaElement.videoTracks changed."); 66 67 trackRemovalAction(); 68 69 test.waitForExpectedEvents(function() 70 { 71 assert_equals(mediaSource.sourceBuffers.length, 0, "mediaSource.sourceBuffers.length"); 72 assert_equals(mediaElement.videoTracks.length, 0, "videoTracks.length"); 73 assert_equals(mediaElement.audioTracks.length, 0, "audioTracks.length"); 74 assert_equals(sourceBuffer.videoTracks.length, 0, "videoTracks.length"); 75 assert_equals(sourceBuffer.audioTracks.length, 0, "audioTracks.length"); 76 // Since audio and video tracks have been removed, their .sourceBuffer property should be null now. 77 assert_equals(audioTrack.sourceBuffer, null, "audioTrack.sourceBuffer"); 78 assert_equals(videoTrack.sourceBuffer, null, "videoTrack.sourceBuffer"); 79 test.done(); 80 }); 81 } 82 83 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 84 { 85 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); 86 sourceBuffer.appendBuffer(initSegment); 87 test.expectEvent(sourceBuffer, "updateend", "initSegment append ended."); 88 test.waitForExpectedEvents(function() 89 { 90 verifyTrackRemoval(test, mediaElement, mediaSource, sourceBuffer, test.step_func(function () 91 { 92 mediaSource.removeSourceBuffer(sourceBuffer); 93 })); 94 }); 95 }, "Media tracks must be removed when the SourceBuffer is removed from the MediaSource"); 96 97 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 98 { 99 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); 100 sourceBuffer.appendBuffer(initSegment); 101 test.expectEvent(sourceBuffer, "updateend", "initSegment append ended."); 102 test.waitForExpectedEvents(function() 103 { 104 verifyTrackRemoval(test, mediaElement, mediaSource, sourceBuffer, test.step_func(function () 105 { 106 mediaElement.src = ""; 107 })); 108 }); 109 }, "Media tracks must be removed when the HTMLMediaElement.src is changed"); 110 111 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 112 { 113 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); 114 sourceBuffer.appendBuffer(initSegment); 115 test.expectEvent(sourceBuffer, "updateend", "initSegment append ended."); 116 test.waitForExpectedEvents(function() 117 { 118 verifyTrackRemoval(test, mediaElement, mediaSource, sourceBuffer, test.step_func(function () 119 { 120 mediaElement.load(); 121 })); 122 }); 123 }, "Media tracks must be removed when HTMLMediaElement.load() is called"); 124 </script>