| <!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> |