| 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> |
| 11 <script> | 11 <script> |
| 12 var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_
TYPE); | 12 var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_
TYPE); |
| 13 | 13 |
| 14 var manifestFilenameA = subType + "/test-a-128k-44100Hz-1ch-manifest
.json"; | 14 var manifestFilenameA = subType + '/test-a-128k-44100Hz-1ch-manifest
.json'; |
| 15 var manifestFilenameB = subType + "/test-v-128k-320x240-30fps-10kfr-
manifest.json"; | 15 var manifestFilenameB = subType + '/test-v-128k-320x240-30fps-10kfr-
manifest.json'; |
| 16 | 16 |
| 17 var expectationsA = { | 17 var expectationsA = { |
| 18 webm: "{ [0.000, 2.022) }", | 18 webm: '{ [0.000, 2.022) }', |
| 19 mp4: "{ [0.000, 2.043) }", | 19 mp4: '{ [0.000, 2.043) }', |
| 20 }; | 20 }; |
| 21 | 21 |
| 22 var expectationsB = { | 22 var expectationsB = { |
| 23 webm: "{ [0.000, 2.000) }", | 23 webm: '{ [0.000, 2.000) }', |
| 24 mp4: "{ [0.000, 2.000) }", | 24 mp4: '{ [0.000, 2.000) }', |
| 25 }; | 25 }; |
| 26 | 26 |
| 27 function mediaSourceDemuxedTest(callback, description) | 27 function mediaSourceDemuxedTest(callback, description) |
| 28 { | 28 { |
| 29 mediasource_test(function(test, mediaElement, mediaSource) | 29 mediasource_test(function(test, mediaElement, mediaSource) |
| 30 { | 30 { |
| 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.activeSourceBuffers.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 appendData(test, mediaSource, dataA, dataB, callback) |
| 50 { | 50 { |
| 51 var sourceBufferA = mediaSource.activeSourceBuffers[0]; | 51 var sourceBufferA = mediaSource.activeSourceBuffers[0]; |
| 52 var sourceBufferB = mediaSource.activeSourceBuffers[1]; | 52 var sourceBufferB = mediaSource.activeSourceBuffers[1]; |
| 53 | 53 |
| 54 test.expectEvent(sourceBufferA, "update"); | 54 test.expectEvent(sourceBufferA, 'update'); |
| 55 test.expectEvent(sourceBufferA, "updateend"); | 55 test.expectEvent(sourceBufferA, 'updateend'); |
| 56 sourceBufferA.appendBuffer(dataA); | 56 sourceBufferA.appendBuffer(dataA); |
| 57 | 57 |
| 58 test.expectEvent(sourceBufferB, "update"); | 58 test.expectEvent(sourceBufferB, 'update'); |
| 59 test.expectEvent(sourceBufferB, "updateend"); | 59 test.expectEvent(sourceBufferB, 'updateend'); |
| 60 sourceBufferB.appendBuffer(dataB); | 60 sourceBufferB.appendBuffer(dataB); |
| 61 | 61 |
| 62 test.waitForExpectedEvents(function() | 62 test.waitForExpectedEvents(function() |
| 63 { | 63 { |
| 64 callback(); | 64 callback(); |
| 65 }); | 65 }); |
| 66 } | 66 } |
| 67 | 67 |
| 68 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { | 68 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { |
| 69 appendData(test, mediaSource, dataA, dataB, function() | 69 appendData(test, mediaSource, dataA, dataB, function() |
| 70 { | 70 { |
| 71 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], "mediaSource.activeSourceBuffers[0]"); | 71 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
| 72 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], "mediaSource.activeSourceBuffers[1]"); | 72 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); |
| 73 assertBufferedEquals(mediaElement, expectationsB[subType], "
mediaElement.buffered"); | 73 assertBufferedEquals(mediaElement, expectationsB[subType], '
mediaElement.buffered'); |
| 74 | 74 |
| 75 mediaSource.endOfStream(); | 75 mediaSource.endOfStream(); |
| 76 | 76 |
| 77 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], "mediaSource.activeSourceBuffers[0]"); | 77 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
| 78 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], "mediaSource.activeSourceBuffers[1]"); | 78 assertBufferedEquals(mediaSource.activeSourceBuffers[1], exp
ectationsB[subType], 'mediaSource.activeSourceBuffers[1]'); |
| 79 assertBufferedEquals(mediaElement, expectationsA[subType], "
mediaElement.buffered"); | 79 assertBufferedEquals(mediaElement, expectationsA[subType], '
mediaElement.buffered'); |
| 80 | 80 |
| 81 test.done(); | 81 test.done(); |
| 82 }); | 82 }); |
| 83 }, "Demuxed content with different lengths"); | 83 }, 'Demuxed content with different lengths'); |
| 84 | 84 |
| 85 mediasource_test(function(test, mediaElement, mediaSource) | 85 mediasource_test(function(test, mediaElement, mediaSource) |
| 86 { | 86 { |
| 87 mediaElement.pause(); | 87 mediaElement.pause(); |
| 88 test.failOnEvent(mediaElement, 'error'); | 88 test.failOnEvent(mediaElement, 'error'); |
| 89 test.endOnEvent(mediaElement, 'ended'); | 89 test.endOnEvent(mediaElement, 'ended'); |
| 90 | 90 |
| 91 MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-3
84k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data) | 91 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-3
84k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data) |
| 92 { | 92 { |
| 93 var sourceBuffer = mediaSource.addSourceBuffer(type); | 93 var sourceBuffer = mediaSource.addSourceBuffer(type); |
| 94 test.expectEvent(sourceBuffer, "update"); | 94 test.expectEvent(sourceBuffer, 'update'); |
| 95 test.expectEvent(sourceBuffer, "updateend"); | 95 test.expectEvent(sourceBuffer, 'updateend'); |
| 96 sourceBuffer.appendBuffer(data); | 96 sourceBuffer.appendBuffer(data); |
| 97 | 97 |
| 98 test.waitForExpectedEvents(function() | 98 test.waitForExpectedEvents(function() |
| 99 { | 99 { |
| 100 var expectationsAV = { | 100 var expectationsAV = { |
| 101 webm: ["{ [0.000, 2.003) }", "{ [0.000, 2.022) }"], | 101 webm: ['{ [0.000, 2.003) }', '{ [0.000, 2.022) }'], |
| 102 mp4: ["{ [0.000, 2.000) }", "{ [0.000, 2.043) }"], | 102 mp4: ['{ [0.000, 2.000) }', '{ [0.000, 2.043) }'], |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 var expectedBeforeEndOfStream = expectationsAV[subType][
0]; | 105 var expectedBeforeEndOfStream = expectationsAV[subType][
0]; |
| 106 var expectedAfterEndOfStream = expectationsAV[subType][1
]; | 106 var expectedAfterEndOfStream = expectationsAV[subType][1
]; |
| 107 | 107 |
| 108 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
expectedBeforeEndOfStream, "mediaSource.activeSourceBuffers[0]"); | 108 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
expectedBeforeEndOfStream, 'mediaSource.activeSourceBuffers[0]'); |
| 109 assertBufferedEquals(mediaElement, expectedBeforeEndOfSt
ream, "mediaElement.buffered"); | 109 assertBufferedEquals(mediaElement, expectedBeforeEndOfSt
ream, 'mediaElement.buffered'); |
| 110 | 110 |
| 111 mediaSource.endOfStream(); | 111 mediaSource.endOfStream(); |
| 112 | 112 |
| 113 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
expectedAfterEndOfStream, "mediaSource.activeSourceBuffers[0]"); | 113 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
expectedAfterEndOfStream, 'mediaSource.activeSourceBuffers[0]'); |
| 114 assertBufferedEquals(mediaElement, expectedAfterEndOfStr
eam, "mediaElement.buffered"); | 114 assertBufferedEquals(mediaElement, expectedAfterEndOfStr
eam, 'mediaElement.buffered'); |
| 115 | 115 |
| 116 test.done(); | 116 test.done(); |
| 117 }); | 117 }); |
| 118 }); | 118 }); |
| 119 }, "Muxed tracks with different lengths"); | 119 }, 'Muxed tracks with different lengths'); |
| 120 | 120 |
| 121 | 121 |
| 122 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { | 122 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dat
aA, dataB) { |
| 123 appendData(test, mediaSource, dataA, dataB.subarray(0, 318), fun
ction() | 123 appendData(test, mediaSource, dataA, dataB.subarray(0, 318), fun
ction() |
| 124 { | 124 { |
| 125 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], "mediaSource.activeSourceBuffers[0]"); | 125 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
| 126 assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{
}", "mediaSource.activeSourceBuffers[1]"); | 126 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{
}', 'mediaSource.activeSourceBuffers[1]'); |
| 127 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buff
ered"); | 127 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); |
| 128 | 128 |
| 129 mediaSource.endOfStream(); | 129 mediaSource.endOfStream(); |
| 130 | 130 |
| 131 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], "mediaSource.activeSourceBuffers[0]"); | 131 assertBufferedEquals(mediaSource.activeSourceBuffers[0], exp
ectationsA[subType], 'mediaSource.activeSourceBuffers[0]'); |
| 132 assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{
}", "mediaSource.activeSourceBuffers[1]"); | 132 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{
}', 'mediaSource.activeSourceBuffers[1]'); |
| 133 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buff
ered"); | 133 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); |
| 134 | 134 |
| 135 test.done(); | 135 test.done(); |
| 136 }); | 136 }); |
| 137 }, "Demuxed content with an empty buffered range on one SourceBuffer
"); | 137 }, 'Demuxed content with an empty buffered range on one SourceBuffer
'); |
| 138 | 138 |
| 139 mediasource_test(function(test, mediaElement, mediaSource) | 139 mediasource_test(function(test, mediaElement, mediaSource) |
| 140 { | 140 { |
| 141 mediaElement.pause(); | 141 mediaElement.pause(); |
| 142 test.failOnEvent(mediaElement, 'error'); | 142 test.failOnEvent(mediaElement, 'error'); |
| 143 test.endOnEvent(mediaElement, 'ended'); | 143 test.endOnEvent(mediaElement, 'ended'); |
| 144 | 144 |
| 145 MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-3
84k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data) | 145 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-3
84k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data) |
| 146 { | 146 { |
| 147 var sourceBuffer = mediaSource.addSourceBuffer(type); | 147 var sourceBuffer = mediaSource.addSourceBuffer(type); |
| 148 test.expectEvent(sourceBuffer, "update"); | 148 test.expectEvent(sourceBuffer, 'update'); |
| 149 test.expectEvent(sourceBuffer, "updateend"); | 149 test.expectEvent(sourceBuffer, 'updateend'); |
| 150 sourceBuffer.appendBuffer(data.subarray(0, 4052)); | 150 sourceBuffer.appendBuffer(data.subarray(0, 4052)); |
| 151 | 151 |
| 152 test.waitForExpectedEvents(function() | 152 test.waitForExpectedEvents(function() |
| 153 { | 153 { |
| 154 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
"{ }", "mediaSource.activeSourceBuffers[0]"); | 154 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
'{ }', 'mediaSource.activeSourceBuffers[0]'); |
| 155 assertBufferedEquals(mediaElement, "{ }", "mediaElement.
buffered"); | 155 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.
buffered'); |
| 156 | 156 |
| 157 mediaSource.endOfStream(); | 157 mediaSource.endOfStream(); |
| 158 | 158 |
| 159 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
"{ }", "mediaSource.activeSourceBuffers[0]"); | 159 assertBufferedEquals(mediaSource.activeSourceBuffers[0],
'{ }', 'mediaSource.activeSourceBuffers[0]'); |
| 160 assertBufferedEquals(mediaElement, "{ }", "mediaElement.
buffered"); | 160 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.
buffered'); |
| 161 | 161 |
| 162 test.done(); | 162 test.done(); |
| 163 }); | 163 }); |
| 164 }); | 164 }); |
| 165 }, "Muxed content empty buffered ranges."); | 165 }, 'Muxed content empty buffered ranges.'); |
| 166 | 166 |
| 167 mediasource_test(function(test, mediaElement, mediaSource) | 167 mediasource_test(function(test, mediaElement, mediaSource) |
| 168 { | 168 { |
| 169 mediaElement.pause(); | 169 mediaElement.pause(); |
| 170 test.failOnEvent(mediaElement, 'error'); | 170 test.failOnEvent(mediaElement, 'error'); |
| 171 test.endOnEvent(mediaElement, 'ended'); | 171 test.endOnEvent(mediaElement, 'ended'); |
| 172 | 172 |
| 173 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.A
UDIO_ONLY_TYPE); | 173 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.A
UDIO_ONLY_TYPE); |
| 174 | 174 |
| 175 // FIXME: verify activeSourceBuffers is empty until init segment
with at least | 175 // FIXME: verify activeSourceBuffers is empty until init segment
with at least |
| 176 // one active track is appended. | 176 // one active track is appended. |
| 177 assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "media
Source.sourceBuffers[0]"); | 177 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'media
Source.sourceBuffers[0]'); |
| 178 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered
"); | 178 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered
'); |
| 179 test.done(); | 179 test.done(); |
| 180 | 180 |
| 181 }, "Get buffered range when sourcebuffer is empty."); | 181 }, 'Get buffered range when sourcebuffer is empty.'); |
| 182 | 182 |
| 183 mediasource_testafterdataloaded(function(test, mediaElement, mediaSo
urce, segmentInfo, sourceBuffer, mediaData) | 183 mediasource_testafterdataloaded(function(test, mediaElement, mediaSo
urce, segmentInfo, sourceBuffer, mediaData) |
| 184 { | 184 { |
| 185 var initSegment = MediaSourceUtil.extractSegmentData(mediaData,
segmentInfo.init); | 185 var initSegment = MediaSourceUtil.extractSegmentData(mediaData,
segmentInfo.init); |
| 186 | 186 |
| 187 test.expectEvent(sourceBuffer, "updateend", "initSegment append
ended."); | 187 test.expectEvent(sourceBuffer, 'updateend', 'initSegment append
ended.'); |
| 188 sourceBuffer.appendBuffer(initSegment); | 188 sourceBuffer.appendBuffer(initSegment); |
| 189 test.waitForExpectedEvents(function() | 189 test.waitForExpectedEvents(function() |
| 190 { | 190 { |
| 191 assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "m
ediaSource.sourceBuffers[0]"); | 191 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'm
ediaSource.sourceBuffers[0]'); |
| 192 assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{
}", "mediaSource.activeSourceBuffers[0]"); | 192 assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{
}', 'mediaSource.activeSourceBuffers[0]'); |
| 193 assertBufferedEquals(mediaElement, "{ }", "mediaElement.buff
ered"); | 193 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buff
ered'); |
| 194 test.done(); | 194 test.done(); |
| 195 }); | 195 }); |
| 196 | 196 |
| 197 }, "Get buffered range when only initsegment is appended.");
| 197 }, 'Get buffered range when only initsegment is appended.'); |
| 198 |
| 199 mediasource_testafterdataloaded(function(test, mediaElement, mediaSo
urce, segmentInfo, sourceBuffer, mediaData) |
| 200 { |
| 201 test.expectEvent(mediaSource.sourceBuffers, 'removesourcebuffer'
, 'SourceBuffer removed.'); |
| 202 mediaSource.removeSourceBuffer(sourceBuffer); |
| 203 |
| 204 test.waitForExpectedEvents(function() |
| 205 { |
| 206 assert_throws('InvalidStateError', |
| 207 function() { sourceBuffer.buffered; }, |
| 208 'get sourceBuffer.buffered throws an exception for Inval
idStateError.'); |
| 209 test.done(); |
| 210 }); |
| 211 }, 'Get buffered range after removing sourcebuffer.'); |
| 198 </script> | 212 </script> |
| 199 </body> | 213 </body> |
| 200 </html> | 214 </html> |
| OLD | NEW |