mediasource-sequencemode-append-buffer.html (8906B)
1 <!DOCTYPE html> 2 <!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --> 3 <html> 4 <head> 5 <title>SourceBuffer.mode == "sequence" test cases.</title> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script src="mediasource-util.js"></script> 9 </head> 10 <body> 11 <div id="log"></div> 12 <script> 13 function mediasource_sequencemode_test(testFunction, description, options) 14 { 15 return mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 16 { 17 assert_greater_than(segmentInfo.media.length, 3, "at least 3 media segments for supported type"); 18 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'")); 19 sourceBuffer.mode = "sequence"; 20 assert_equals(sourceBuffer.mode, "sequence", "mode after setting it to \"sequence\""); 21 22 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); 23 test.expectEvent(sourceBuffer, "updatestart", "initSegment append started."); 24 test.expectEvent(sourceBuffer, "update", "initSegment append success."); 25 test.expectEvent(sourceBuffer, "updateend", "initSegment append ended."); 26 sourceBuffer.appendBuffer(initSegment); 27 test.waitForExpectedEvents(function() 28 { 29 assert_equals(sourceBuffer.timestampOffset, 0, "timestampOffset initially 0"); 30 testFunction(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData); 31 }); 32 }, description, options); 33 } 34 35 function append_segment(test, sourceBuffer, mediaData, info, callback) 36 { 37 var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, info); 38 test.expectEvent(sourceBuffer, "updatestart", "media segment append started."); 39 test.expectEvent(sourceBuffer, "update", "media segment append success."); 40 test.expectEvent(sourceBuffer, "updateend", "media segment append ended."); 41 sourceBuffer.appendBuffer(mediaSegment); 42 test.waitForExpectedEvents(callback); 43 } 44 45 // Verifies expected times to 3 decimal places before and after mediaSource.endOfStream(), 46 // and calls |callback| on success. 47 function verify_offset_and_buffered(test, mediaSource, sourceBuffer, 48 expectedTimestampOffset, expectedBufferedRangeStartTime, 49 expectedBufferedRangeMaxEndTimeBeforeEOS, 50 expectedBufferedRangeEndTimeAfterEOS, 51 callback) { 52 assert_approx_equals(sourceBuffer.timestampOffset, 53 expectedTimestampOffset, 54 0.001, 55 "expectedTimestampOffset"); 56 57 // Prior to EOS, the buffered range end time may not have fully reached the next media 58 // segment's timecode (adjusted by any timestampOffset). It should not exceed it though. 59 // Therefore, an exact assertBufferedEquals() will not work here. 60 assert_greater_than(sourceBuffer.buffered.length, 0, "sourceBuffer.buffered has at least 1 range before EOS"); 61 assert_approx_equals(sourceBuffer.buffered.start(0), 62 expectedBufferedRangeStartTime, 63 0.001, 64 "sourceBuffer.buffered range begins where expected before EOS"); 65 assert_less_than_equal(sourceBuffer.buffered.end(0), 66 expectedBufferedRangeMaxEndTimeBeforeEOS + 0.001, 67 "sourceBuffer.buffered range ends at or before expected upper bound before EOS"); 68 69 test.expectEvent(mediaSource, "sourceended", "mediaSource endOfStream"); 70 mediaSource.endOfStream(); 71 test.waitForExpectedEvents(function() 72 { 73 assertBufferedEquals(sourceBuffer, 74 "{ [" + expectedBufferedRangeStartTime.toFixed(3) + ", " + expectedBufferedRangeEndTimeAfterEOS.toFixed(3) + ") }", 75 "sourceBuffer.buffered after EOS"); 76 callback(); 77 }); 78 } 79 80 mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 81 { 82 var offset = Math.min(segmentInfo.media[0].timev, segmentInfo.media[0].timea); 83 var expectedStart = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea) - offset; 84 var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset; 85 var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset; 86 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function() 87 { 88 verify_offset_and_buffered(test, mediaSource, sourceBuffer, 89 -offset, expectedStart, 90 expectedEnd, expectedEndEOS, 91 test.done); 92 }); 93 }, "Test sequence AppendMode appendBuffer(first media segment)"); 94 95 mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 96 { 97 var offset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea); 98 var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - offset; 99 var expectedEnd = Math.min(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset; 100 var expectedEndEOS = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset; 101 assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0, 102 "segment starts after time 0"); 103 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function() 104 { 105 verify_offset_and_buffered(test, mediaSource, sourceBuffer, 106 -offset, expectedStart, 107 expectedEnd, expectedEndEOS, 108 test.done); 109 }); 110 }, "Test sequence AppendMode appendBuffer(second media segment)"); 111 112 mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) 113 { 114 assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0, 115 "segment starts after time 0"); 116 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function() 117 { 118 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function() 119 { 120 var firstOffset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea); 121 var secondOffset = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - firstOffset; 122 var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - firstOffset; 123 var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset; 124 var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset; 125 // Current timestampOffset should reflect offset required to put media[0] 126 // immediately after media[1]'s highest frame end timestamp (as was adjusted 127 // by an earlier timestampOffset). 128 verify_offset_and_buffered(test, mediaSource, sourceBuffer, 129 secondOffset, expectedStart, 130 expectedEnd, expectedEndEOS, 131 test.done); 132 }) 133 }); 134 }, "Test sequence AppendMode appendBuffer(second media segment, then first media segment)"); 135 </script> 136 </body> 137 </html>