4 <script src="/w3c/resources/testharness.js"></script>
5 <script src="/w3c/resources/testharnessreport.js"></script>
6 <script src="mediasource-util.js"></script>
7 <link rel="stylesheet" href="/w3c/resources/testharness.css">
12 var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
14 var manifestFilenameA = subType + '/test-a-128k-44100Hz-1ch-manifest.json';
15 var manifestFilenameB = subType + '/test-v-128k-320x240-30fps-10kfr-manifest.json';
18 webm: '{ [0.000, 2.022) }',
19 mp4: '{ [0.000, 2.043) }',
23 webm: '{ [0.000, 2.000) }',
24 mp4: '{ [0.000, 2.000) }',
27 function mediaSourceDemuxedTest(callback, description)
29 mediasource_test(function(test, mediaElement, mediaSource)
32 test.failOnEvent(mediaElement, 'error');
33 test.endOnEvent(mediaElement, 'ended');
35 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA)
37 MediaSourceUtil.fetchManifestAndData(test, manifestFilenameB, function(typeB, dataB)
39 mediaSource.addSourceBuffer(typeA);
40 mediaSource.addSourceBuffer(typeB);
41 assert_equals(mediaSource.activeSourceBuffers.length, 2);
43 callback(test, mediaElement, mediaSource, dataA, dataB);
49 function appendData(test, mediaSource, dataA, dataB, callback)
51 var sourceBufferA = mediaSource.activeSourceBuffers[0];
52 var sourceBufferB = mediaSource.activeSourceBuffers[1];
54 test.expectEvent(sourceBufferA, 'update');
55 test.expectEvent(sourceBufferA, 'updateend');
56 sourceBufferA.appendBuffer(dataA);
58 test.expectEvent(sourceBufferB, 'update');
59 test.expectEvent(sourceBufferB, 'updateend');
60 sourceBufferB.appendBuffer(dataB);
62 test.waitForExpectedEvents(function()
68 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
69 appendData(test, mediaSource, dataA, dataB, function()
71 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], 'mediaSource.activeSourceBuffers[0]');
72 assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], 'mediaSource.activeSourceBuffers[1]');
73 assertBufferedEquals(mediaElement, expectationsB[subType], 'mediaElement.buffered');
75 mediaSource.endOfStream();
77 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], 'mediaSource.activeSourceBuffers[0]');
78 assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], 'mediaSource.activeSourceBuffers[1]');
79 assertBufferedEquals(mediaElement, expectationsA[subType], 'mediaElement.buffered');
83 }, 'Demuxed content with different lengths');
85 mediasource_test(function(test, mediaElement, mediaSource)
88 test.failOnEvent(mediaElement, 'error');
89 test.endOnEvent(mediaElement, 'ended');
91 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data)
93 var sourceBuffer = mediaSource.addSourceBuffer(type);
94 test.expectEvent(sourceBuffer, 'update');
95 test.expectEvent(sourceBuffer, 'updateend');
96 sourceBuffer.appendBuffer(data);
98 test.waitForExpectedEvents(function()
100 var expectationsAV = {
101 webm: ['{ [0.000, 2.003) }', '{ [0.000, 2.022) }'],
102 mp4: ['{ [0.000, 2.000) }', '{ [0.000, 2.043) }'],
105 var expectedBeforeEndOfStream = expectationsAV[subType][0];
106 var expectedAfterEndOfStream = expectationsAV[subType][1];
108 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedBeforeEndOfStream, 'mediaSource.activeSourceBuffers[0]');
109 assertBufferedEquals(mediaElement, expectedBeforeEndOfStream, 'mediaElement.buffered');
111 mediaSource.endOfStream();
113 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedAfterEndOfStream, 'mediaSource.activeSourceBuffers[0]');
114 assertBufferedEquals(mediaElement, expectedAfterEndOfStream, 'mediaElement.buffered');
119 }, 'Muxed tracks with different lengths');
122 mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
123 appendData(test, mediaSource, dataA, dataB.subarray(0, 318), function()
125 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], 'mediaSource.activeSourceBuffers[0]');
126 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{ }', 'mediaSource.activeSourceBuffers[1]');
127 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
129 mediaSource.endOfStream();
131 assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], 'mediaSource.activeSourceBuffers[0]');
132 assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{ }', 'mediaSource.activeSourceBuffers[1]');
133 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
137 }, 'Demuxed content with an empty buffered range on one SourceBuffer');
139 mediasource_test(function(test, mediaElement, mediaSource)
141 mediaElement.pause();
142 test.failOnEvent(mediaElement, 'error');
143 test.endOnEvent(mediaElement, 'ended');
145 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data)
147 var sourceBuffer = mediaSource.addSourceBuffer(type);
148 test.expectEvent(sourceBuffer, 'update');
149 test.expectEvent(sourceBuffer, 'updateend');
150 sourceBuffer.appendBuffer(data.subarray(0, 4052));
152 test.waitForExpectedEvents(function()
154 assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{ }', 'mediaSource.activeSourceBuffers[0]');
155 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
157 mediaSource.endOfStream();
159 assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{ }', 'mediaSource.activeSourceBuffers[0]');
160 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
165 }, 'Muxed content empty buffered ranges.');
167 mediasource_test(function(test, mediaElement, mediaSource)
169 mediaElement.pause();
170 test.failOnEvent(mediaElement, 'error');
171 test.endOnEvent(mediaElement, 'ended');
173 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
175 // FIXME: verify activeSourceBuffers is empty until init segment with at least
176 // one active track is appended.
177 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'mediaSource.sourceBuffers[0]');
178 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
181 }, 'Get buffered range when sourcebuffer is empty.');
183 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
185 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
187 test.expectEvent(sourceBuffer, 'updateend', 'initSegment append ended.');
188 sourceBuffer.appendBuffer(initSegment);
189 test.waitForExpectedEvents(function()
191 assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'mediaSource.sourceBuffers[0]');
192 assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{ }', 'mediaSource.activeSourceBuffers[0]');
193 assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
197 }, 'Get buffered range when only initsegment is appended.');
199 mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
201 test.expectEvent(mediaSource.sourceBuffers, 'removesourcebuffer', 'SourceBuffer removed.');
202 mediaSource.removeSourceBuffer(sourceBuffer);
204 test.waitForExpectedEvents(function()
206 assert_throws('InvalidStateError',
207 function() { sourceBuffer.buffered; },
208 'get sourceBuffer.buffered throws an exception for InvalidStateError.');
211 }, 'Get buffered range after removing sourcebuffer.');