| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>SourceBuffer.mode == "sequence" test cases.</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="mediasource-util.js"></script> |
| </head> |
| <body> |
| <div id="log"></div> |
| <script> |
| function mediasource_sequencemode_test(testFunction, description, options) |
| { |
| return mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| assert_greater_than(segmentInfo.media.length, 3, "at least 3 media segments for supported type"); |
| mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'")); |
| sourceBuffer.mode = "sequence"; |
| assert_equals(sourceBuffer.mode, "sequence", "mode after setting it to \"sequence\""); |
| |
| var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init); |
| test.expectEvent(sourceBuffer, "updatestart", "initSegment append started."); |
| test.expectEvent(sourceBuffer, "update", "initSegment append success."); |
| test.expectEvent(sourceBuffer, "updateend", "initSegment append ended."); |
| sourceBuffer.appendBuffer(initSegment); |
| test.waitForExpectedEvents(function() |
| { |
| assert_equals(sourceBuffer.timestampOffset, 0, "timestampOffset initially 0"); |
| testFunction(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData); |
| }); |
| }, description, options); |
| } |
| |
| function append_segment(test, sourceBuffer, mediaData, info, callback) |
| { |
| var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, info); |
| test.expectEvent(sourceBuffer, "updatestart", "media segment append started."); |
| test.expectEvent(sourceBuffer, "update", "media segment append success."); |
| test.expectEvent(sourceBuffer, "updateend", "media segment append ended."); |
| sourceBuffer.appendBuffer(mediaSegment); |
| test.waitForExpectedEvents(callback); |
| } |
| |
| function threeDecimalPlaces(number) |
| { |
| return Number(number.toFixed(3)); |
| } |
| |
| // Verifies expected times to 3 decimal places before and after mediaSource.endOfStream(), |
| // and calls |callback| on success. |
| function verify_offset_and_buffered(test, mediaSource, sourceBuffer, |
| expectedTimestampOffset, expectedBufferedRangeStartTime, |
| expectedBufferedRangeMaxEndTimeBeforeEOS, |
| expectedBufferedRangeEndTimeAfterEOS, |
| callback) { |
| assert_equals(threeDecimalPlaces(sourceBuffer.timestampOffset), |
| threeDecimalPlaces(expectedTimestampOffset), |
| "expectedTimestampOffset"); |
| |
| // Prior to EOS, the buffered range end time may not have fully reached the next media |
| // segment's timecode (adjusted by any timestampOffset). It should not exceed it though. |
| // Therefore, an exact assertBufferedEquals() will not work here. |
| assert_equals(sourceBuffer.buffered.length, 1, "sourceBuffer.buffered has 1 range before EOS"); |
| assert_equals(threeDecimalPlaces(sourceBuffer.buffered.start(0)), |
| threeDecimalPlaces(expectedBufferedRangeStartTime), |
| "sourceBuffer.buffered range begins where expected before EOS"); |
| assert_less_than_equal(threeDecimalPlaces(sourceBuffer.buffered.end(0)), |
| threeDecimalPlaces(expectedBufferedRangeMaxEndTimeBeforeEOS), |
| "sourceBuffer.buffered range ends at or before expected upper bound before EOS"); |
| |
| test.expectEvent(mediaSource, "sourceended", "mediaSource endOfStream"); |
| mediaSource.endOfStream(); |
| test.waitForExpectedEvents(function() |
| { |
| assertBufferedEquals(sourceBuffer, |
| "{ [" + expectedBufferedRangeStartTime.toFixed(3) + ", " + expectedBufferedRangeEndTimeAfterEOS.toFixed(3) + ") }", |
| "sourceBuffer.buffered after EOS"); |
| callback(); |
| }); |
| } |
| |
| mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| assert_equals(segmentInfo.media[0].timecode, 0, "segment starts at time 0"); |
| append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function() |
| { |
| verify_offset_and_buffered(test, mediaSource, sourceBuffer, |
| 0, 0, |
| segmentInfo.media[1].timecode + sourceBuffer.timestampOffset, |
| segmentInfo.media[0].highest_end_time + sourceBuffer.timestampOffset, |
| test.done); |
| }); |
| }, "Test sequence AppendMode appendBuffer(first media segment)"); |
| |
| mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| assert_greater_than(segmentInfo.media[1].timecode, 0, "segment starts after time 0"); |
| append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function() |
| { |
| verify_offset_and_buffered(test, mediaSource, sourceBuffer, |
| -segmentInfo.media[1].timecode, 0, |
| segmentInfo.media[2].timecode + sourceBuffer.timestampOffset, |
| segmentInfo.media[1].highest_end_time + sourceBuffer.timestampOffset, |
| test.done); |
| }); |
| }, "Test sequence AppendMode appendBuffer(second media segment)"); |
| |
| mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData) |
| { |
| assert_greater_than(segmentInfo.media[1].timecode, 0, "segment starts after time 0"); |
| append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function() |
| { |
| assert_equals(segmentInfo.media[0].timecode, 0, "segment starts at time 0"); |
| append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function() |
| { |
| // Current timestampOffset should reflect offset required to put media[0] |
| // immediately after media[1]'s highest frame end timestamp (as was adjusted |
| // by an earlier timestampOffset). |
| verify_offset_and_buffered(test, mediaSource, sourceBuffer, |
| segmentInfo.media[1].highest_end_time - segmentInfo.media[1].timecode, 0, |
| segmentInfo.media[1].timecode + sourceBuffer.timestampOffset, |
| segmentInfo.media[0].highest_end_time + sourceBuffer.timestampOffset, |
| test.done); |
| }) |
| }); |
| }, "Test sequence AppendMode appendBuffer(second media segment, then first media segment)"); |
| </script> |
| </body> |
| </html> |