OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <html> | 2 <html> |
3 <head> | 3 <head> |
4 <script src="/w3c/resources/testharness.js"></script> | 4 <script src="/w3c/resources/testharness.js"></script> |
5 <script src="/w3c/resources/testharnessreport.js"></script> | 5 <script src="/w3c/resources/testharnessreport.js"></script> |
6 <script src="mediasource-util.js"></script> | 6 <script src="mediasource-util.js"></script> |
7 <link rel="stylesheet" href="/w3c/resources/testharness.css"> | 7 <link rel="stylesheet" href="/w3c/resources/testharness.css"> |
8 </head> | 8 </head> |
9 <body> | 9 <body> |
10 <div id="log"></div> | 10 <div id="log"></div> |
(...skipping 20 matching lines...) Expand all Loading... |
31 mediaElement.pause(); | 31 mediaElement.pause(); |
32 test.failOnEvent(mediaElement, 'error'); | 32 test.failOnEvent(mediaElement, 'error'); |
33 test.endOnEvent(mediaElement, 'ended'); | 33 test.endOnEvent(mediaElement, 'ended'); |
34 | 34 |
35 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA
, function(typeA, dataA) | 35 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA
, function(typeA, dataA) |
36 { | 36 { |
37 MediaSourceUtil.fetchManifestAndData(test, manifestFilen
ameB, function(typeB, dataB) | 37 MediaSourceUtil.fetchManifestAndData(test, manifestFilen
ameB, function(typeB, dataB) |
38 { | 38 { |
39 mediaSource.addSourceBuffer(typeA); | 39 mediaSource.addSourceBuffer(typeA); |
40 mediaSource.addSourceBuffer(typeB); | 40 mediaSource.addSourceBuffer(typeB); |
41 assert_equals(mediaSource.activeSourceBuffers.length
, 2); | 41 assert_equals(mediaSource.sourceBuffers.length, 2); |
42 | 42 |
43 callback(test, mediaElement, mediaSource, dataA, dat
aB); | 43 callback(test, mediaElement, mediaSource, dataA, dat
aB); |
44 }); | 44 }); |
45 }); | 45 }); |
46 }, description); | 46 }, description); |
47 }; | 47 }; |
48 | 48 |
49 function appendData(test, mediaSource, dataA, dataB, callback) | 49 function appendDataAndVerifyAddedToActiveSourceBuffers(test, mediaSo
urce, dataA, dataB, swapAppendBufferOrder, forceParsingOrder, callback) |
50 { | 50 { |
51 var sourceBufferA = mediaSource.activeSourceBuffers[0]; | 51 // Verification here assumes no prior initialization segment rec
eived for any of mediaSource's sourceBuffers. |
52 var sourceBufferB = mediaSource.activeSourceBuffers[1]; | 52 assert_equals(mediaSource.sourceBuffers.length, 2, 'mediaSource
sourceBuffers length before appends'); |
| 53 assert_equals(mediaSource.activeSourceBuffers.length, 0, 'mediaS
ource activeSourceBuffers length before appends'); |
| 54 var sourceBufferA = mediaSource.sourceBuffers[0]; |
| 55 var sourceBufferB = mediaSource.sourceBuffers[1]; |
53 | 56 |
54 test.expectEvent(sourceBufferA, 'update'); | 57 var firstBuffer = swapAppendBufferOrder ? sourceBufferB : source
BufferA; |
55 test.expectEvent(sourceBufferA, 'updateend'); | 58 var firstData = swapAppendBufferOrder ? dataB : dataA; |
56 sourceBufferA.appendBuffer(dataA); | 59 var secondBuffer = swapAppendBufferOrder ? sourceBufferA : sourc
eBufferB; |
| 60 var secondData = swapAppendBufferOrder ? dataA : dataB; |
57 | 61 |
58 test.expectEvent(sourceBufferB, 'update'); | 62 test.expectEvent(firstBuffer, 'update'); |
59 test.expectEvent(sourceBufferB, 'updateend'); | 63 test.expectEvent(firstBuffer, 'updateend'); |
60 sourceBufferB.appendBuffer(dataB); | 64 firstBuffer.appendBuffer(firstData); |
| 65 |
| 66 var doSecondAppend = function() |
| 67 { |
| 68 test.expectEvent(secondBuffer, 'update'); |
| 69 test.expectEvent(secondBuffer, 'updateend'); |
| 70 secondBuffer.appendBuffer(secondData); |
| 71 }; |
| 72 |
| 73 if (forceParsingOrder) { |
| 74 test.waitForExpectedEvents(function() |
| 75 { |
| 76 assert_equals(mediaSource.sourceBuffers.length, 2, 'medi
aSource sourceBuffers length between completed appends'); |
| 77 assert_equals(mediaSource.activeSourceBuffers.length, 1,
'mediaSource activeSourceBuffers length between completed appends'); |
| 78 assert_equals(mediaSource.activeSourceBuffers[0], firstB
uffer); |
| 79 doSecondAppend(); |
| 80 }); |
| 81 } else { |
| 82 doSecondAppend(); |
| 83 } |
61 | 84 |
62 test.waitForExpectedEvents(function() | 85 test.waitForExpectedEvents(function() |
63 { | 86 { |
64 callback(); | 87 assert_equals(mediaSource.sourceBuffers.length, 2, 'mediaSou
rce sourceBuffers length after appends completed'); |
| 88 assert_equals(mediaSource.activeSourceBuffers.length, 2, 'me
diaSource activeSourceBuffers length after appends completed'); |
| 89 assert_equals(mediaSource.activeSourceBuffers[0], sourceBuff
erA); |
| 90 assert_equals(mediaSource.activeSourceBuffers[1], sourceBuff
erB); |
| 91 callback(); |
65 }); | 92 }); |
66 } | 93 } |
67 | 94 |
68 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { | 95 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { |
69 appendData(test, mediaSource, dataA, dataB, function() | 96 appendDataAndVerifyAddedToActiveSourceBuffers(test, mediaSource,
dataA, dataB, false, false, function() |
70 { | 97 { |
71 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); | 98 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
72 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); | 99 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); |
73 assertBufferedEquals(mediaElement, expectationsB[subType], '
mediaElement.buffered'); | 100 assertBufferedEquals(mediaElement, expectationsB[subType], '
mediaElement.buffered'); |
74 | 101 |
75 mediaSource.endOfStream(); | 102 mediaSource.endOfStream(); |
76 | 103 |
77 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); | 104 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
78 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); | 105 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); |
79 assertBufferedEquals(mediaElement, expectationsA[subType], '
mediaElement.buffered'); | 106 assertBufferedEquals(mediaElement, expectationsA[subType], '
mediaElement.buffered'); |
80 | 107 |
81 test.done(); | 108 test.done(); |
82 }); | 109 }); |
83 }, 'Demuxed content with different lengths'); | 110 }, 'Demuxed content with different lengths'); |
84 | 111 |
| 112 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { |
| 113 appendDataAndVerifyAddedToActiveSourceBuffers(test, mediaSource,
dataA, dataB, false, true, function() |
| 114 { |
| 115 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
| 116 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); |
| 117 assertBufferedEquals(mediaElement, expectationsB[subType], '
mediaElement.buffered'); |
| 118 test.done(); |
| 119 }); |
| 120 }, 'Process first init segment for sourceBuffer[0] first'); |
| 121 |
| 122 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { |
| 123 appendDataAndVerifyAddedToActiveSourceBuffers(test, mediaSource,
dataA, dataB, true, true, function() |
| 124 { |
| 125 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
| 126 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); |
| 127 assertBufferedEquals(mediaElement, expectationsB[subType], '
mediaElement.buffered'); |
| 128 test.done(); |
| 129 }); |
| 130 }, 'Process first init segment for sourceBuffer[1] first'); |
| 131 |
85 mediasource_test(function(test, mediaElement, mediaSource) | 132 mediasource_test(function(test, mediaElement, mediaSource) |
86 { | 133 { |
87 mediaElement.pause(); | 134 mediaElement.pause(); |
88 test.failOnEvent(mediaElement, 'error'); | 135 test.failOnEvent(mediaElement, 'error'); |
89 test.endOnEvent(mediaElement, 'ended'); | 136 test.endOnEvent(mediaElement, 'ended'); |
90 | 137 |
91 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-3
84k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data) | 138 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-3
84k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data) |
92 { | 139 { |
93 var sourceBuffer = mediaSource.addSourceBuffer(type); | 140 var sourceBuffer = mediaSource.addSourceBuffer(type); |
94 test.expectEvent(sourceBuffer, 'update'); | 141 test.expectEvent(sourceBuffer, 'update'); |
(...skipping 16 matching lines...) Expand all Loading... |
111 mediaSource.endOfStream(); | 158 mediaSource.endOfStream(); |
112 | 159 |
113 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
expectedAfterEndOfStream, 'mediaSource.activeSourceBuffers[0]'); | 160 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
expectedAfterEndOfStream, 'mediaSource.activeSourceBuffers[0]'); |
114 assertBufferedEquals(mediaElement, expectedAfterEndOfStr
eam, 'mediaElement.buffered'); | 161 assertBufferedEquals(mediaElement, expectedAfterEndOfStr
eam, 'mediaElement.buffered'); |
115 | 162 |
116 test.done(); | 163 test.done(); |
117 }); | 164 }); |
118 }); | 165 }); |
119 }, 'Muxed tracks with different lengths'); | 166 }, 'Muxed tracks with different lengths'); |
120 | 167 |
121 | |
122 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { | 168 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { |
123 appendData(test, mediaSource, dataA, dataB.subarray(0, 318), fun
ction() | 169 appendDataAndVerifyAddedToActiveSourceBuffers(test, mediaSource,
dataA, dataB.subarray(0, 318), false, false, function() |
124 { | 170 { |
125 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); | 171 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
126 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{
}', 'mediaSource.activeSourceBuffers[1]'); | 172 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{
}', 'mediaSource.activeSourceBuffers[1]'); |
127 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); | 173 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); |
128 | 174 |
129 mediaSource.endOfStream(); | 175 mediaSource.endOfStream(); |
130 | 176 |
131 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); | 177 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
132 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{
}', 'mediaSource.activeSourceBuffers[1]'); | 178 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{
}', 'mediaSource.activeSourceBuffers[1]'); |
133 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); | 179 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); |
(...skipping 30 matching lines...) Expand all Loading... |
164 }); | 210 }); |
165 }, 'Muxed content empty buffered ranges.'); | 211 }, 'Muxed content empty buffered ranges.'); |
166 | 212 |
167 mediasource_test(function(test, mediaElement, mediaSource) | 213 mediasource_test(function(test, mediaElement, mediaSource) |
168 { | 214 { |
169 mediaElement.pause(); | 215 mediaElement.pause(); |
170 test.failOnEvent(mediaElement, 'error'); | 216 test.failOnEvent(mediaElement, 'error'); |
171 test.endOnEvent(mediaElement, 'ended'); | 217 test.endOnEvent(mediaElement, 'ended'); |
172 | 218 |
173 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.A
UDIO_ONLY_TYPE); | 219 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.A
UDIO_ONLY_TYPE); |
174 | 220 |
175 // FIXME: verify activeSourceBuffers is empty until init segment
with at least | |
176 // one active track is appended. | |
177 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'media
Source.sourceBuffers[0]'); | 221 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'media
Source.sourceBuffers[0]'); |
178 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered
'); | 222 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered
'); |
179 test.done(); | 223 test.done(); |
180 | 224 |
181 }, 'Get buffered range when sourcebuffer is empty.'); | 225 }, 'Get buffered range when sourcebuffer is empty.'); |
182 | 226 |
183 mediasource_testafterdataloaded(function(test, mediaElement, mediaSo
urce, segmentInfo, sourceBuffer, mediaData) | 227 mediasource_testafterdataloaded(function(test, mediaElement, mediaSo
urce, segmentInfo, sourceBuffer, mediaData) |
184 { | 228 { |
185 var initSegment = MediaSourceUtil.extractSegmentData(mediaData,
segmentInfo.init); | 229 var initSegment = MediaSourceUtil.extractSegmentData(mediaData,
segmentInfo.init); |
186 | 230 |
187 test.expectEvent(sourceBuffer, 'updateend', 'initSegment append
ended.'); | 231 test.expectEvent(sourceBuffer, 'updateend', 'initSegment append
ended.'); |
188 sourceBuffer.appendBuffer(initSegment); | 232 sourceBuffer.appendBuffer(initSegment); |
189 test.waitForExpectedEvents(function() | 233 test.waitForExpectedEvents(function() |
190 { | 234 { |
191 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'm
ediaSource.sourceBuffers[0]'); | 235 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'm
ediaSource.sourceBuffers[0]'); |
192 assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{
}', 'mediaSource.activeSourceBuffers[0]'); | 236 assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{
}', 'mediaSource.activeSourceBuffers[0]'); |
193 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); | 237 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); |
194 test.done(); | 238 test.done(); |
195 }); | 239 }); |
196 | 240 |
197 }, 'Get buffered range when only initsegment is appended.'); | 241 }, 'Get buffered range when only initsegment is appended.'); |
198 | 242 |
199 mediasource_testafterdataloaded(function(test, mediaElement, mediaSo
urce, segmentInfo, sourceBuffer, mediaData) | 243 mediasource_testafterdataloaded(function(test, mediaElement, mediaSo
urce, segmentInfo, sourceBuffer, mediaData) |
200 { | 244 { |
201 test.expectEvent(mediaSource.sourceBuffers, 'removesourcebuffer'
, 'SourceBuffer removed.'); | 245 test.expectEvent(mediaSource.sourceBuffers, 'removesourcebuffer'
, 'SourceBuffer removed.'); |
202 mediaSource.removeSourceBuffer(sourceBuffer); | 246 mediaSource.removeSourceBuffer(sourceBuffer); |
203 | 247 |
204 test.waitForExpectedEvents(function() | 248 test.waitForExpectedEvents(function() |
205 { | 249 { |
206 assert_throws('InvalidStateError', | 250 assert_throws('InvalidStateError', |
207 function() { sourceBuffer.buffered; }, | 251 function() { sourceBuffer.buffered; }, |
208 'get sourceBuffer.buffered throws an exception for Inval
idStateError.'); | 252 'get sourceBuffer.buffered throws an exception for Inval
idStateError.'); |
209 test.done(); | 253 test.done(); |
210 }); | 254 }); |
211 }, 'Get buffered range after removing sourcebuffer.'); | 255 }, 'Get buffered range after removing sourcebuffer.'); |
212 </script> | 256 </script> |
213 </body> | 257 </body> |
214 </html> | 258 </html> |
OLD | NEW |