blob: 92a01abcc0ef473a7527e1ab29ba49344669adb0 [file] [log] [blame]
Aaron Colwellab0ee7b2014-09-09 21:10:391<!DOCTYPE html>
Matt Wolenetz74803c62016-08-19 01:46:402<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
Aaron Colwellab0ee7b2014-09-09 21:10:393<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");
Ms2ger979de362015-06-29 10:21:1918 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Aaron Colwellab0ee7b2014-09-09 21:10:3919 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 function threeDecimalPlaces(number)
46 {
47 return Number(number.toFixed(3));
48 }
49
50 // Verifies expected times to 3 decimal places before and after mediaSource.endOfStream(),
51 // and calls |callback| on success.
52 function verify_offset_and_buffered(test, mediaSource, sourceBuffer,
53 expectedTimestampOffset, expectedBufferedRangeStartTime,
54 expectedBufferedRangeMaxEndTimeBeforeEOS,
55 expectedBufferedRangeEndTimeAfterEOS,
56 callback) {
57 assert_equals(threeDecimalPlaces(sourceBuffer.timestampOffset),
58 threeDecimalPlaces(expectedTimestampOffset),
59 "expectedTimestampOffset");
60
61 // Prior to EOS, the buffered range end time may not have fully reached the next media
62 // segment's timecode (adjusted by any timestampOffset). It should not exceed it though.
63 // Therefore, an exact assertBufferedEquals() will not work here.
jgraham202e5672016-10-06 18:35:0664 assert_greater_than(sourceBuffer.buffered.length, 0, "sourceBuffer.buffered has at least 1 range before EOS");
Aaron Colwellab0ee7b2014-09-09 21:10:3965 assert_equals(threeDecimalPlaces(sourceBuffer.buffered.start(0)),
66 threeDecimalPlaces(expectedBufferedRangeStartTime),
67 "sourceBuffer.buffered range begins where expected before EOS");
68 assert_less_than_equal(threeDecimalPlaces(sourceBuffer.buffered.end(0)),
69 threeDecimalPlaces(expectedBufferedRangeMaxEndTimeBeforeEOS),
70 "sourceBuffer.buffered range ends at or before expected upper bound before EOS");
71
72 test.expectEvent(mediaSource, "sourceended", "mediaSource endOfStream");
73 mediaSource.endOfStream();
74 test.waitForExpectedEvents(function()
75 {
76 assertBufferedEquals(sourceBuffer,
77 "{ [" + expectedBufferedRangeStartTime.toFixed(3) + ", " + expectedBufferedRangeEndTimeAfterEOS.toFixed(3) + ") }",
78 "sourceBuffer.buffered after EOS");
79 callback();
80 });
81 }
82
83 mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
84 {
Jean-Yves Avenarde4324682016-08-25 12:57:0285 var offset = Math.min(segmentInfo.media[0].timev, segmentInfo.media[0].timea);
86 var expectedStart = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea) - offset;
87 var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
88 var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
Aaron Colwellab0ee7b2014-09-09 21:10:3989 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
90 {
91 verify_offset_and_buffered(test, mediaSource, sourceBuffer,
Jean-Yves Avenarde4324682016-08-25 12:57:0292 -offset, expectedStart,
93 expectedEnd, expectedEndEOS,
Aaron Colwellab0ee7b2014-09-09 21:10:3994 test.done);
95 });
96 }, "Test sequence AppendMode appendBuffer(first media segment)");
97
98 mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
99 {
Jean-Yves Avenarde4324682016-08-25 12:57:02100 var offset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
101 var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - offset;
102 var expectedEnd = Math.min(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
103 var expectedEndEOS = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
104 assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
105 "segment starts after time 0");
Aaron Colwellab0ee7b2014-09-09 21:10:39106 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
107 {
108 verify_offset_and_buffered(test, mediaSource, sourceBuffer,
Jean-Yves Avenarde4324682016-08-25 12:57:02109 -offset, expectedStart,
110 expectedEnd, expectedEndEOS,
Aaron Colwellab0ee7b2014-09-09 21:10:39111 test.done);
112 });
113 }, "Test sequence AppendMode appendBuffer(second media segment)");
114
115 mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
116 {
Jean-Yves Avenarde4324682016-08-25 12:57:02117 assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
118 "segment starts after time 0");
Aaron Colwellab0ee7b2014-09-09 21:10:39119 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
120 {
Aaron Colwellab0ee7b2014-09-09 21:10:39121 append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
122 {
Jean-Yves Avenarde4324682016-08-25 12:57:02123 var firstOffset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
124 var secondOffset = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - firstOffset;
125 var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - firstOffset;
126 var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
127 var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
Aaron Colwellab0ee7b2014-09-09 21:10:39128 // Current timestampOffset should reflect offset required to put media[0]
129 // immediately after media[1]'s highest frame end timestamp (as was adjusted
130 // by an earlier timestampOffset).
131 verify_offset_and_buffered(test, mediaSource, sourceBuffer,
Jean-Yves Avenarde4324682016-08-25 12:57:02132 secondOffset, expectedStart,
133 expectedEnd, expectedEndEOS,
Aaron Colwellab0ee7b2014-09-09 21:10:39134 test.done);
135 })
136 });
137 }, "Test sequence AppendMode appendBuffer(second media segment, then first media segment)");
138 </script>
139 </body>
140</html>