blob: 7015fc6b61ac68eb058dc9acaa73ecc5a60dd605 [file] [log] [blame]
Aaron Colwellc6841a02014-03-07 01:37:561<!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 Colwellc6841a02014-03-07 01:37:563<html>
4 <head>
Aaron Colwellaa3c90b2014-08-04 17:58:375 <title>SourceBuffer.buffered test cases.</title>
Aaron Colwell06f8ec22014-03-07 18:09:476 <script src="/resources/testharness.js"></script>
7 <script src="/resources/testharnessreport.js"></script>
Aaron Colwellc6841a02014-03-07 01:37:568 <script src="mediasource-util.js"></script>
Aaron Colwellc6841a02014-03-07 01:37:569 </head>
10 <body>
11 <div id="log"></div>
12 <script>
13 var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
14
15 var manifestFilenameA = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
16 var manifestFilenameB = subType + "/test-v-128k-320x240-30fps-10kfr-manifest.json";
17
Jean-Yves Avenard0b35fdb2016-08-25 12:56:5918 // Audio track expectations
Aaron Colwellc6841a02014-03-07 01:37:5619 var expectationsA = {
Jan Gerber1ac73d82015-08-25 13:40:3120 webm: "{ [0.000, 2.023) }",
Aaron Colwellc6841a02014-03-07 01:37:5621 mp4: "{ [0.000, 2.043) }",
22 };
23
Jean-Yves Avenard0b35fdb2016-08-25 12:56:5924 // Video track expectations
Aaron Colwellc6841a02014-03-07 01:37:5625 var expectationsB = {
Jan Gerber1ac73d82015-08-25 13:40:3126 webm: "{ [0.000, 2.001) }",
Jean-Yves Avenard0b35fdb2016-08-25 12:56:5927 mp4: "{ [0.067, 2.067) }",
28 };
29
30 // Audio and Video intersection expectations.
31 // https://w3c.github.io/media-source/index.html#dom-sourcebuffer-buffered
32 // When mediaSource.readyState is "ended", then set the end time on the last range in track ranges to highest end time.
33 var expectationsC = {
34 webm: ["{ [0.000, 2.001) }", "{ [0.000, 2.023) }"],
35 mp4: ["{ [0.067, 2.043) }", "{ [0.067, 2.067) }"]
Aaron Colwellc6841a02014-03-07 01:37:5636 };
37
38 function mediaSourceDemuxedTest(callback, description)
39 {
40 mediasource_test(function(test, mediaElement, mediaSource)
41 {
42 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:1943 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Ms2geredb207d2015-06-29 10:31:5744 mediaElement.addEventListener("ended", test.step_func_done());
Aaron Colwellc6841a02014-03-07 01:37:5645
46 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA)
47 {
48 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameB, function(typeB, dataB)
49 {
50 mediaSource.addSourceBuffer(typeA);
51 mediaSource.addSourceBuffer(typeB);
Aaron Colwellcffb8af2014-05-23 22:27:1052 assert_equals(mediaSource.sourceBuffers.length, 2);
Aaron Colwellc6841a02014-03-07 01:37:5653
54 callback(test, mediaElement, mediaSource, dataA, dataB);
55 });
56 });
57 }, description);
58 };
59
60 function appendData(test, mediaSource, dataA, dataB, callback)
61 {
Aaron Colwellcffb8af2014-05-23 22:27:1062 var sourceBufferA = mediaSource.sourceBuffers[0];
63 var sourceBufferB = mediaSource.sourceBuffers[1];
Aaron Colwellc6841a02014-03-07 01:37:5664
65 test.expectEvent(sourceBufferA, "update");
66 test.expectEvent(sourceBufferA, "updateend");
67 sourceBufferA.appendBuffer(dataA);
68
69 test.expectEvent(sourceBufferB, "update");
70 test.expectEvent(sourceBufferB, "updateend");
71 sourceBufferB.appendBuffer(dataB);
72
73 test.waitForExpectedEvents(function()
74 {
75 callback();
76 });
77 }
78
79 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
Aaron Colwellab0ee7b2014-09-09 21:10:3980 test.expectEvent(mediaElement, "loadedmetadata");
Aaron Colwellc6841a02014-03-07 01:37:5681 appendData(test, mediaSource, dataA, dataB, function()
82 {
Jean-Yves Avenard0b35fdb2016-08-25 12:56:5983 var expectedBeforeEndOfStreamIntersection = expectationsC[subType][0];
84 var expectedAfterEndOfStreamIntersection = expectationsC[subType][1];
85
Aaron Colwellc6841a02014-03-07 01:37:5686 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
87 assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
Jean-Yves Avenard0b35fdb2016-08-25 12:56:5988 assertBufferedEquals(mediaElement, expectedBeforeEndOfStreamIntersection, "mediaElement.buffered");
Aaron Colwellc6841a02014-03-07 01:37:5689
90 mediaSource.endOfStream();
91
92 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
93 assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
Jean-Yves Avenard0b35fdb2016-08-25 12:56:5994 assertBufferedEquals(mediaElement, expectedAfterEndOfStreamIntersection, "mediaElement.buffered");
Aaron Colwellc6841a02014-03-07 01:37:5695
96 test.done();
97 });
98 }, "Demuxed content with different lengths");
99
100 mediasource_test(function(test, mediaElement, mediaSource)
101 {
102 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:19103 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Ms2geredb207d2015-06-29 10:31:57104 mediaElement.addEventListener("ended", test.step_func_done());
Aaron Colwellc6841a02014-03-07 01:37:56105
106 MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
107 {
108 var sourceBuffer = mediaSource.addSourceBuffer(type);
109 test.expectEvent(sourceBuffer, "update");
110 test.expectEvent(sourceBuffer, "updateend");
111 sourceBuffer.appendBuffer(data);
112
113 test.waitForExpectedEvents(function()
114 {
115 var expectationsAV = {
Jean-Yves Avenard0b35fdb2016-08-25 12:56:59116 webm: ["{ [0.003, 2.004) }", "{ [0.003, 2.023) }"],
117 mp4: ["{ [0.067, 2.043) }", "{ [0.067, 2.067) }"],
Aaron Colwellc6841a02014-03-07 01:37:56118 };
119
120 var expectedBeforeEndOfStream = expectationsAV[subType][0];
121 var expectedAfterEndOfStream = expectationsAV[subType][1];
122
123 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedBeforeEndOfStream, "mediaSource.activeSourceBuffers[0]");
124 assertBufferedEquals(mediaElement, expectedBeforeEndOfStream, "mediaElement.buffered");
125
126 mediaSource.endOfStream();
127
128 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedAfterEndOfStream, "mediaSource.activeSourceBuffers[0]");
129 assertBufferedEquals(mediaElement, expectedAfterEndOfStream, "mediaElement.buffered");
130
131 test.done();
132 });
133 });
Aaron Colwellab0ee7b2014-09-09 21:10:39134 }, "Muxed content with different lengths");
Aaron Colwellc6841a02014-03-07 01:37:56135
Aaron Colwellc6841a02014-03-07 01:37:56136 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
Aaron Colwellcffb8af2014-05-23 22:27:10137 var dataBSize = {
138 webm: 318,
Aaron Colwell795cb532014-08-07 16:35:39139 mp4: 835,
Aaron Colwellcffb8af2014-05-23 22:27:10140 };
Aaron Colwellab0ee7b2014-09-09 21:10:39141 test.expectEvent(mediaElement, "loadedmetadata");
Aaron Colwellcffb8af2014-05-23 22:27:10142 appendData(test, mediaSource, dataA, dataB.subarray(0, dataBSize[subType]), function()
Aaron Colwellc6841a02014-03-07 01:37:56143 {
144 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
145 assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
146 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
147
148 mediaSource.endOfStream();
149
150 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
151 assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
152 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
153
154 test.done();
155 });
156 }, "Demuxed content with an empty buffered range on one SourceBuffer");
157
158 mediasource_test(function(test, mediaElement, mediaSource)
159 {
160 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:19161 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Ms2geredb207d2015-06-29 10:31:57162 mediaElement.addEventListener("ended", test.step_func_done());
Aaron Colwellc6841a02014-03-07 01:37:56163
164 MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
165 {
166 var sourceBuffer = mediaSource.addSourceBuffer(type);
Aaron Colwellab0ee7b2014-09-09 21:10:39167 test.expectEvent(mediaElement, "loadedmetadata");
Aaron Colwellc6841a02014-03-07 01:37:56168 test.expectEvent(sourceBuffer, "update");
169 test.expectEvent(sourceBuffer, "updateend");
170 sourceBuffer.appendBuffer(data.subarray(0, 4052));
171
172 test.waitForExpectedEvents(function()
173 {
174 assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
175 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
176
177 mediaSource.endOfStream();
178
179 assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
180 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
181
182 test.done();
183 });
184 });
185 }, "Muxed content empty buffered ranges.");
Aaron Colwellcffb8af2014-05-23 22:27:10186
Aaron Colwellab0ee7b2014-09-09 21:10:39187 mediasource_test(function(test, mediaElement, mediaSource)
188 {
189 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:19190 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Ms2geredb207d2015-06-29 10:31:57191 mediaElement.addEventListener("ended", test.step_func_done());
Aaron Colwellab0ee7b2014-09-09 21:10:39192
193 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
194
195 assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
196 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
197 test.done();
198
199 }, "Get buffered range when sourcebuffer is empty.");
200
201 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
202 {
203 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
204
205 test.expectEvent(mediaElement, "loadedmetadata");
206 test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
207 sourceBuffer.appendBuffer(initSegment);
208 test.waitForExpectedEvents(function()
209 {
210 assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
211 assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
212 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
213 test.done();
214 });
215
216 }, "Get buffered range when only init segment is appended.");
217
218 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
219 {
220 test.expectEvent(mediaSource.sourceBuffers, "removesourcebuffer", "SourceBuffer removed.");
221 mediaSource.removeSourceBuffer(sourceBuffer);
222
223 test.waitForExpectedEvents(function()
224 {
Stephen McGruer3696f222020-01-23 19:11:58225 assert_throws_dom("InvalidStateError",
Aaron Colwellab0ee7b2014-09-09 21:10:39226 function() { sourceBuffer.buffered; },
227 "get sourceBuffer.buffered throws an exception for InvalidStateError.");
228 test.done();
229 });
230 }, "Get buffered range after removing sourcebuffer.");
Aaron Colwellc6841a02014-03-07 01:37:56231 </script>
232 </body>
233</html>