 Chromium Code Reviews
 Chromium Code Reviews Issue 273153002:
  MSE: Add basic sequence AppendMode layout tests  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk
    
  
    Issue 273153002:
  MSE: Add basic sequence AppendMode layout tests  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk| Index: LayoutTests/http/tests/media/media-source/mediasource-sequencemode-append-buffer.html | 
| diff --git a/LayoutTests/http/tests/media/media-source/mediasource-sequencemode-append-buffer.html b/LayoutTests/http/tests/media/media-source/mediasource-sequencemode-append-buffer.html | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..9ef8adc799ee99d2d688bc0b00b901ac0f44876c | 
| --- /dev/null | 
| +++ b/LayoutTests/http/tests/media/media-source/mediasource-sequencemode-append-buffer.html | 
| @@ -0,0 +1,129 @@ | 
| +<!DOCTYPE html> | 
| +<html> | 
| + <head> | 
| + <script src="/w3c/resources/testharness.js"></script> | 
| + <script src="/w3c/resources/testharnessreport.js"></script> | 
| + <script src="mediasource-util.js"></script> | 
| + <link rel='stylesheet' href='/w3c/resources/testharness.css'> | 
| + </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'); | 
| + test.failOnEvent(mediaElement, '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(function() { callback(); }); | 
| 
acolwell GONE FROM CHROMIUM
2014/05/19 22:12:49
You can just use test.waitForExpectedEvents(callba
 
wolenetz
2014/05/19 22:23:03
Done.
 | 
| + } | 
| + | 
| + function threeDecimalPlaces(number) | 
| + { | 
| + return Number(number.toFixed(3)); | 
| 
acolwell GONE FROM CHROMIUM
2014/05/19 22:12:49
Why do you need the Number()?
 
wolenetz
2014/05/19 22:23:03
By example:
var a = 3.14159265;
a.toFixed(3) == "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 /* + timestampOffset of 0 */, | 
| 
acolwell GONE FROM CHROMIUM
2014/05/19 22:12:49
nit: Remove the comments. I think they are more co
 
wolenetz
2014/05/19 22:23:03
Done.
 | 
| + segmentInfo.media[0].highest_end_time /* + timestampOffset of 0 */, | 
| + 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> |