Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / http / tests / media / media-source / mediasource-buffered.html
1 <!DOCTYPE html>
2 <html>
3     <head>
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">
8     </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 = {
18               webm: '{ [0.000, 2.022) }',
19               mp4: '{ [0.000, 2.043) }',
20             };
21
22             var expectationsB = {
23               webm: '{ [0.000, 2.000) }',
24               mp4: '{ [0.000, 2.000) }',
25             };
26
27             function mediaSourceDemuxedTest(callback, description)
28             {
29                 mediasource_test(function(test, mediaElement, mediaSource)
30                 {
31                     mediaElement.pause();
32                     test.failOnEvent(mediaElement, 'error');
33                     test.endOnEvent(mediaElement, 'ended');
34
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);
41                             assert_equals(mediaSource.activeSourceBuffers.length, 2);
42
43                             callback(test, mediaElement, mediaSource, dataA, dataB);
44                         });
45                     });
46                 }, description);
47             };
48
49             function appendData(test, mediaSource, dataA, dataB, callback)
50             {
51                 var sourceBufferA = mediaSource.activeSourceBuffers[0];
52                 var sourceBufferB = mediaSource.activeSourceBuffers[1];
53
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) {
69                 appendData(test, mediaSource, dataA, dataB, function()
70                 {
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');
74
75                     mediaSource.endOfStream();
76
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');
80
81                     test.done();
82                 });
83             }, 'Demuxed content with different lengths');
84
85             mediasource_test(function(test, mediaElement, mediaSource)
86             {
87                 mediaElement.pause();
88                 test.failOnEvent(mediaElement, 'error');
89                 test.endOnEvent(mediaElement, 'ended');
90
91                 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data)
92                 {
93                     var sourceBuffer = mediaSource.addSourceBuffer(type);
94                     test.expectEvent(sourceBuffer, 'update');
95                     test.expectEvent(sourceBuffer, 'updateend');
96                     sourceBuffer.appendBuffer(data);
97
98                     test.waitForExpectedEvents(function()
99                     {
100                         var expectationsAV = {
101                             webm: ['{ [0.000, 2.003) }', '{ [0.000, 2.022) }'],
102                             mp4: ['{ [0.000, 2.000) }', '{ [0.000, 2.043) }'],
103                         };
104
105                         var expectedBeforeEndOfStream = expectationsAV[subType][0];
106                         var expectedAfterEndOfStream = expectationsAV[subType][1];
107
108                         assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedBeforeEndOfStream, 'mediaSource.activeSourceBuffers[0]');
109                         assertBufferedEquals(mediaElement, expectedBeforeEndOfStream, 'mediaElement.buffered');
110
111                         mediaSource.endOfStream();
112
113                         assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedAfterEndOfStream, 'mediaSource.activeSourceBuffers[0]');
114                         assertBufferedEquals(mediaElement, expectedAfterEndOfStream, 'mediaElement.buffered');
115
116                         test.done();
117                     });
118                 });
119             }, 'Muxed tracks with different lengths');
120
121
122             mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
123                 appendData(test, mediaSource, dataA, dataB.subarray(0, 318), function()
124                 {
125                     assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], 'mediaSource.activeSourceBuffers[0]');
126                     assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{ }', 'mediaSource.activeSourceBuffers[1]');
127                     assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
128
129                     mediaSource.endOfStream();
130
131                     assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], 'mediaSource.activeSourceBuffers[0]');
132                     assertBufferedEquals(mediaSource.activeSourceBuffers[1], '{ }', 'mediaSource.activeSourceBuffers[1]');
133                     assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
134
135                     test.done();
136                 });
137             }, 'Demuxed content with an empty buffered range on one SourceBuffer');
138
139             mediasource_test(function(test, mediaElement, mediaSource)
140             {
141                 mediaElement.pause();
142                 test.failOnEvent(mediaElement, 'error');
143                 test.endOnEvent(mediaElement, 'ended');
144
145                 MediaSourceUtil.fetchManifestAndData(test, subType + '/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json', function(type, data)
146                 {
147                     var sourceBuffer = mediaSource.addSourceBuffer(type);
148                     test.expectEvent(sourceBuffer, 'update');
149                     test.expectEvent(sourceBuffer, 'updateend');
150                     sourceBuffer.appendBuffer(data.subarray(0, 4052));
151
152                     test.waitForExpectedEvents(function()
153                     {
154                         assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{ }', 'mediaSource.activeSourceBuffers[0]');
155                         assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
156
157                         mediaSource.endOfStream();
158
159                         assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{ }', 'mediaSource.activeSourceBuffers[0]');
160                         assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
161
162                         test.done();
163                     });
164                 });
165             }, 'Muxed content empty buffered ranges.');
166
167             mediasource_test(function(test, mediaElement, mediaSource)
168             {
169                 mediaElement.pause();
170                 test.failOnEvent(mediaElement, 'error');
171                 test.endOnEvent(mediaElement, 'ended');
172
173                 var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
174                 
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');
179                 test.done();
180
181             }, 'Get buffered range when sourcebuffer is empty.');
182
183             mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
184             {
185                 var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
186                 
187                 test.expectEvent(sourceBuffer, 'updateend', 'initSegment append ended.');
188                 sourceBuffer.appendBuffer(initSegment);                
189                 test.waitForExpectedEvents(function()
190                 {
191                     assertBufferedEquals(mediaSource.sourceBuffers[0], '{ }', 'mediaSource.sourceBuffers[0]');
192                     assertBufferedEquals(mediaSource.activeSourceBuffers[0], '{ }', 'mediaSource.activeSourceBuffers[0]');
193                     assertBufferedEquals(mediaElement, '{ }', 'mediaElement.buffered');
194                     test.done();
195                 });
196
197             }, 'Get buffered range when only initsegment is appended.');
198
199             mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, 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 InvalidStateError.');
209                     test.done();
210                 });
211             }, 'Get buffered range after removing sourcebuffer.');
212         </script>
213     </body>
214 </html>