4 <script src="/media-resources/video-test.js"></script>
5 <script src="/media/resources/media-source/webm/segment-info.js"></script>
6 <script src="webkitmediasource-util.js"></script>
8 var segmentHelper = new MediaSourceTest.SegmentHelper(WebMSegmentInfo.testWebM);
11 function appendMediaSegmentsForSeek(segmentSeekTime)
13 var index = segmentHelper.getMediaSegmentIndexForTimestamp(segmentSeekTime);
14 var endIndex = index + 2;
15 var totalMediaSegments = segmentHelper.mediaSegments.length;
17 for (; (index < endIndex) && (index < totalMediaSegments); index++) {
18 segmentHelper.appendMediaSegment(index);
21 if (index >= totalMediaSegments) {
22 mediaSource.endOfStream();
27 function onSourceEvent(event)
29 consoleWrite('EVENT(' + event.type + ') : ' + event.target.readyState);
32 function onFirstSourceOpen(event)
34 consoleWrite("onFirstSourceOpen");
36 // This is the first time the source is opened. We just want to append
37 // the initialization segment and all media segments until the end of stream.
38 // This is testing the
39 // "closed" -> "open" -> "ended" transition path.
41 var mediaSource = event.target;
42 mediaSource.removeEventListener('webkitsourceopen', onFirstSourceOpen);
43 segmentHelper.addSourceBuffer();
45 MediaSourceTest.expectSourceState(mediaSource, "open");
47 segmentHelper.appendInitSegment();
49 mediaSource.addEventListener('webkitsourceended', onFirstSourceEnded);
51 // Start appending media segments.
52 segmentHelper.appendUntilEndOfStream(0);
55 function onFirstSourceEnded(event)
57 consoleWrite("onFirstSourceEnded");
59 var mediaSource = event.target;
60 mediaSource.removeEventListener('webkitsourceended', onFirstSourceEnded);
62 MediaSourceTest.expectSourceState(mediaSource, "ended");
64 video.addEventListener('playing', triggerFirstSeek);
67 function triggerFirstSeek(event)
69 consoleWrite("triggerFirstSeek");
71 var videoTag = event.target;
72 videoTag.removeEventListener('playing', triggerFirstSeek);
74 // Now that we have appended all of the media segments and ended the stream,
75 // lets do a seek to make sure we stay in the "ended" state.
76 videoTag.addEventListener('seeking', onFirstSeeking);
77 videoTag.addEventListener('seeked', onFirstSeeked);
78 videoTag.currentTime = seekTime;
81 function onFirstSeeking(event)
83 consoleWrite("onFirstSeeking");
85 var videoTag = event.target;
86 videoTag.removeEventListener('seeking', onFirstSeeking);
88 MediaSourceTest.expectSourceState(mediaSource, "ended");
90 // Start appending media segments.
91 appendMediaSegmentsForSeek(videoTag.currentTime);
93 // Verify that the source state transitioned to open after the append.
94 MediaSourceTest.expectSourceState(mediaSource, "open");
97 function onFirstSeeked(event)
99 consoleWrite("onFirstSeeked");
101 var videoTag = event.target;
102 videoTag.removeEventListener('seeked', onFirstSeeked);
104 MediaSourceTest.expectSourceState(mediaSource, "open");
106 // Now it is time to test seeking while still in "open".
107 videoTag.addEventListener('seeking', onSecondSeeking);
108 videoTag.addEventListener('seeked', onSecondSeeked);
109 videoTag.currentTime = seekTime;
112 function onSecondSeeking(event)
114 consoleWrite("onSecondSeeking");
116 var videoTag = event.target;
117 videoTag.removeEventListener('seeking', onSecondSeeking);
119 MediaSourceTest.expectSourceState(mediaSource, "open");
121 // Start appending media segments.
122 appendMediaSegmentsForSeek(videoTag.currentTime);
125 function onSecondSeeked(event)
127 consoleWrite("onSecondSeeked");
129 var videoTag = event.target;
130 videoTag.removeEventListener('seeked', onSecondSeeked);
132 MediaSourceTest.expectSourceState(mediaSource, "open");
134 // Test "open" -> "closed" -> "open" transition path.
135 mediaSource.addEventListener('webkitsourceclose', onFirstSourceClose);
136 MediaSourceTest.setSrcToMediaSourceTestURL(videoTag);
139 function onFirstSourceClose(event)
141 consoleWrite("onFirstSourceClose");
143 var mediaSource = event.target;
144 mediaSource.removeEventListener('webkitsourceclose', onFirstSourceClose);
146 MediaSourceTest.expectSourceState(mediaSource, "closed");
148 mediaSource.addEventListener('webkitsourceopen', onSecondSourceOpen);
151 function onSecondSourceOpen(event)
153 consoleWrite("onSecondSourceOpen");
155 var mediaSource = event.target;
156 mediaSource.removeEventListener('webkitsourceopen', onSecondSourceOpen);
157 segmentHelper.addSourceBuffer();
159 MediaSourceTest.expectSourceState(mediaSource, "open");
161 segmentHelper.appendInitSegment();
163 mediaSource.addEventListener('webkitsourceended', onSecondSourceEnded);
165 // Start appending media segments.
166 segmentHelper.appendUntilEndOfStream(0);
169 function onSecondSourceEnded(event)
171 consoleWrite("onSecondSourceEnded");
173 var mediaSource = event.target;
174 mediaSource.removeEventListener('webkitsourceended', onSecondSourceEnded);
176 MediaSourceTest.expectSourceState(mediaSource, "ended");
177 //MediaSourceTest.expectReadyState(videoTag, HTMLMediaElement.HAVE_NOTHING);
179 video.addEventListener('playing', triggerSecondSourceClose);
182 function triggerSecondSourceClose(event)
184 consoleWrite("triggerSecondSourceClose");
186 var videoTag = event.target;
187 videoTag.removeEventListener('playing', triggerSecondSourceClose);
189 // Test "ended" -> "closed" -> "open" transition path.
190 mediaSource.addEventListener('webkitsourceclose', onSecondSourceClose);
191 MediaSourceTest.setSrcToMediaSourceTestURL(videoTag);
194 function onSecondSourceClose(event)
196 consoleWrite("onSecondSourceClose");
198 var mediaSource = event.target;
199 mediaSource.removeEventListener('webkitsourceclose', onSecondSourceClose);
200 MediaSourceTest.expectSourceState(mediaSource, "closed");
202 mediaSource.addEventListener('webkitsourceopen', onThirdSourceOpen);
205 function onThirdSourceOpen(event)
207 consoleWrite("onThirdSourceOpen");
209 var mediaSource = event.target;
210 mediaSource.removeEventListener('webkitsourceopen', onThirdSourceOpen);
211 segmentHelper.addSourceBuffer();
213 MediaSourceTest.expectSourceState(mediaSource, "open");
222 mediaSource = new WebKitMediaSource();
224 waitForEventAndFail('error');
225 waitForEvent('seeking');
226 waitForEvent('seeked');
227 waitForEvent('ended');
228 waitForEvent('emptied');
230 mediaSource.addEventListener('webkitsourceopen', onSourceEvent);
231 mediaSource.addEventListener('webkitsourceended', onSourceEvent);
232 mediaSource.addEventListener('webkitsourceclose', onSourceEvent);
234 mediaSource.addEventListener('webkitsourceopen', onFirstSourceOpen);
236 MediaSourceTest.logSourceState(mediaSource);
237 segmentHelper.init(video, function(success)
240 failTest("Failed to load segment data");
244 MediaSourceTest.setSrcToMediaSourceTestURL(video);
249 <body onload="onLoad()">
250 <video autoplay> </video>
251 <p>Tests MediaSource API state transitions.</p>