blob: 12fbaf0b7794e08f4411c4fa861090bbc2a46ed3 [file] [log] [blame]
Aaron Colwellc6841a02014-03-07 01:37:561<!DOCTYPE html>
2<html>
3 <head>
Aaron Colwellaa3c90b2014-08-04 17:58:374 <title>SourceBuffer.buffered test cases.</title>
Aaron Colwell06f8ec22014-03-07 18:09:475 <script src="/resources/testharness.js"></script>
6 <script src="/resources/testharnessreport.js"></script>
Aaron Colwellc6841a02014-03-07 01:37:567 <script src="mediasource-util.js"></script>
Aaron Colwellc6841a02014-03-07 01:37:568 </head>
9 <body>
10 <div id="log"></div>
11 <script>
12 var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
13
14 var manifestFilenameA = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
15 var manifestFilenameB = subType + "/test-v-128k-320x240-30fps-10kfr-manifest.json";
16
17 var expectationsA = {
Aaron Colwellcffb8af2014-05-23 22:27:1018 webm: "{ [0.000, 2.022) }",
Aaron Colwellc6841a02014-03-07 01:37:5619 mp4: "{ [0.000, 2.043) }",
20 };
21
22 var expectationsB = {
Aaron Colwellcffb8af2014-05-23 22:27:1023 webm: "{ [0.000, 2.000) }",
Aaron Colwellc6841a02014-03-07 01:37:5624 mp4: "{ [0.000, 2.000) }",
25 };
26
27 function mediaSourceDemuxedTest(callback, description)
28 {
29 mediasource_test(function(test, mediaElement, mediaSource)
30 {
31 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:1932 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Aaron Colwell795cb532014-08-07 16:35:3933 test.endOnEvent(mediaElement, "ended");
Aaron Colwellc6841a02014-03-07 01:37:5634
35 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA)
36 {
37 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameB, function(typeB, dataB)
38 {
39 mediaSource.addSourceBuffer(typeA);
40 mediaSource.addSourceBuffer(typeB);
Aaron Colwellcffb8af2014-05-23 22:27:1041 assert_equals(mediaSource.sourceBuffers.length, 2);
Aaron Colwellc6841a02014-03-07 01:37:5642
43 callback(test, mediaElement, mediaSource, dataA, dataB);
44 });
45 });
46 }, description);
47 };
48
49 function appendData(test, mediaSource, dataA, dataB, callback)
50 {
Aaron Colwellcffb8af2014-05-23 22:27:1051 var sourceBufferA = mediaSource.sourceBuffers[0];
52 var sourceBufferB = mediaSource.sourceBuffers[1];
Aaron Colwellc6841a02014-03-07 01:37:5653
54 test.expectEvent(sourceBufferA, "update");
55 test.expectEvent(sourceBufferA, "updateend");
56 sourceBufferA.appendBuffer(dataA);
57
58 test.expectEvent(sourceBufferB, "update");
59 test.expectEvent(sourceBufferB, "updateend");
60 sourceBufferB.appendBuffer(dataB);
61
62 test.waitForExpectedEvents(function()
63 {
64 callback();
65 });
66 }
67
68 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
Aaron Colwellab0ee7b2014-09-09 21:10:3969 test.expectEvent(mediaElement, "loadedmetadata");
Aaron Colwellc6841a02014-03-07 01:37:5670 appendData(test, mediaSource, dataA, dataB, function()
71 {
72 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
73 assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
74 assertBufferedEquals(mediaElement, expectationsB[subType], "mediaElement.buffered");
75
76 mediaSource.endOfStream();
77
78 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
79 assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
80 assertBufferedEquals(mediaElement, expectationsA[subType], "mediaElement.buffered");
81
82 test.done();
83 });
84 }, "Demuxed content with different lengths");
85
86 mediasource_test(function(test, mediaElement, mediaSource)
87 {
88 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:1989 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Aaron Colwell795cb532014-08-07 16:35:3990 test.endOnEvent(mediaElement, "ended");
Aaron Colwellc6841a02014-03-07 01:37:5691
92 MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
93 {
94 var sourceBuffer = mediaSource.addSourceBuffer(type);
95 test.expectEvent(sourceBuffer, "update");
96 test.expectEvent(sourceBuffer, "updateend");
97 sourceBuffer.appendBuffer(data);
98
99 test.waitForExpectedEvents(function()
100 {
101 var expectationsAV = {
Aaron Colwellcffb8af2014-05-23 22:27:10102 webm: ["{ [0.000, 2.003) }", "{ [0.000, 2.022) }"],
Aaron Colwellc6841a02014-03-07 01:37:56103 mp4: ["{ [0.000, 2.000) }", "{ [0.000, 2.043) }"],
104 };
105
106 var expectedBeforeEndOfStream = expectationsAV[subType][0];
107 var expectedAfterEndOfStream = expectationsAV[subType][1];
108
109 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedBeforeEndOfStream, "mediaSource.activeSourceBuffers[0]");
110 assertBufferedEquals(mediaElement, expectedBeforeEndOfStream, "mediaElement.buffered");
111
112 mediaSource.endOfStream();
113
114 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedAfterEndOfStream, "mediaSource.activeSourceBuffers[0]");
115 assertBufferedEquals(mediaElement, expectedAfterEndOfStream, "mediaElement.buffered");
116
117 test.done();
118 });
119 });
Aaron Colwellab0ee7b2014-09-09 21:10:39120 }, "Muxed content with different lengths");
Aaron Colwellc6841a02014-03-07 01:37:56121
Aaron Colwellc6841a02014-03-07 01:37:56122 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
Aaron Colwellcffb8af2014-05-23 22:27:10123 var dataBSize = {
124 webm: 318,
Aaron Colwell795cb532014-08-07 16:35:39125 mp4: 835,
Aaron Colwellcffb8af2014-05-23 22:27:10126 };
Aaron Colwellab0ee7b2014-09-09 21:10:39127 test.expectEvent(mediaElement, "loadedmetadata");
Aaron Colwellcffb8af2014-05-23 22:27:10128 appendData(test, mediaSource, dataA, dataB.subarray(0, dataBSize[subType]), function()
Aaron Colwellc6841a02014-03-07 01:37:56129 {
130 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
131 assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
132 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
133
134 mediaSource.endOfStream();
135
136 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
137 assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
138 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
139
140 test.done();
141 });
142 }, "Demuxed content with an empty buffered range on one SourceBuffer");
143
144 mediasource_test(function(test, mediaElement, mediaSource)
145 {
146 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:19147 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Aaron Colwell795cb532014-08-07 16:35:39148 test.endOnEvent(mediaElement, "ended");
Aaron Colwellc6841a02014-03-07 01:37:56149
150 MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
151 {
152 var sourceBuffer = mediaSource.addSourceBuffer(type);
Aaron Colwellab0ee7b2014-09-09 21:10:39153 test.expectEvent(mediaElement, "loadedmetadata");
Aaron Colwellc6841a02014-03-07 01:37:56154 test.expectEvent(sourceBuffer, "update");
155 test.expectEvent(sourceBuffer, "updateend");
156 sourceBuffer.appendBuffer(data.subarray(0, 4052));
157
158 test.waitForExpectedEvents(function()
159 {
160 assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
161 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
162
163 mediaSource.endOfStream();
164
165 assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
166 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
167
168 test.done();
169 });
170 });
171 }, "Muxed content empty buffered ranges.");
Aaron Colwellcffb8af2014-05-23 22:27:10172
Aaron Colwellab0ee7b2014-09-09 21:10:39173 mediasource_test(function(test, mediaElement, mediaSource)
174 {
175 mediaElement.pause();
Ms2ger979de362015-06-29 10:21:19176 mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
Aaron Colwellab0ee7b2014-09-09 21:10:39177 test.endOnEvent(mediaElement, "ended");
178
179 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
180
181 assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
182 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
183 test.done();
184
185 }, "Get buffered range when sourcebuffer is empty.");
186
187 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
188 {
189 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
190
191 test.expectEvent(mediaElement, "loadedmetadata");
192 test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
193 sourceBuffer.appendBuffer(initSegment);
194 test.waitForExpectedEvents(function()
195 {
196 assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
197 assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
198 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
199 test.done();
200 });
201
202 }, "Get buffered range when only init segment is appended.");
203
204 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
205 {
206 test.expectEvent(mediaSource.sourceBuffers, "removesourcebuffer", "SourceBuffer removed.");
207 mediaSource.removeSourceBuffer(sourceBuffer);
208
209 test.waitForExpectedEvents(function()
210 {
211 assert_throws("InvalidStateError",
212 function() { sourceBuffer.buffered; },
213 "get sourceBuffer.buffered throws an exception for InvalidStateError.");
214 test.done();
215 });
216 }, "Get buffered range after removing sourcebuffer.");
Aaron Colwellc6841a02014-03-07 01:37:56217 </script>
218 </body>
219</html>