467fa2fe by Tom Johnson

update intra segment seek to use pts for millisecond level accuracy

1 parent 3c5fb8b7
...@@ -296,8 +296,8 @@ hls.FlvTag = function(type, extraData) { ...@@ -296,8 +296,8 @@ hls.FlvTag = function(type, extraData) {
296 296
297 // trim down the byte buffer to what is actually being used 297 // trim down the byte buffer to what is actually being used
298 this.bytes = this.bytes.subarray(0, this.length); 298 this.bytes = this.bytes.subarray(0, this.length);
299 this.frameTime = hls.FlvTag.frameTime(this.bytes);
299 console.assert(this.bytes.byteLength === this.length); 300 console.assert(this.bytes.byteLength === this.length);
300
301 return this; 301 return this;
302 }; 302 };
303 }; 303 };
......
...@@ -80,6 +80,7 @@ var ...@@ -80,6 +80,7 @@ var
80 mediaSource = new videojs.MediaSource(), 80 mediaSource = new videojs.MediaSource(),
81 segmentParser = new videojs.hls.SegmentParser(), 81 segmentParser = new videojs.hls.SegmentParser(),
82 player = this, 82 player = this,
83 tech,
83 extname, 84 extname,
84 srcUrl, 85 srcUrl,
85 86
...@@ -109,33 +110,27 @@ var ...@@ -109,33 +110,27 @@ var
109 return 1; // HAVE_METADATA 110 return 1; // HAVE_METADATA
110 }; 111 };
111 112
112 player.currentTime = function(value) { 113 player.on('ready', function() {
113 var returnValue; 114 player.muted(true);
115 tech = player.el().querySelector('.vjs-tech');
116 tech.vjs_setProperty('playerId', player.P);
117 });
114 118
115 if(value) { 119 player.on('seeking', function() {
116 try { 120 var seekValue = tech.vjs_getProperty('lastSeekedTime');
117 player.el().getElementsByClassName('vjs-tech')[0].vjs_setProperty('currentTime', value); 121 player.hls.mediaIndex = player.hls.getSegmentIndexByTime(seekValue);
118 player.el().getElementsByClassName('vjs-tech')[0].vjs_setProperty('appendBytesAction', 'resetSeek'); 122 fillBuffer(seekValue*1000);
119 player.el().getElementsByClassName('vjs-tech')[0].vjs_setProperty('appendBytesAction', 'resetBegin'); 123 });
120 } catch(err) {
121 124
122 } 125 player.on('waiting', function() {
123 player.hls.sourceBuffer.appendBuffer(segmentParser.getFlvHeader()); 126 if(player.currentTime() >= player.duration() && player.hls.isLastSegment()) {
124 player.hls.mediaIndex = player.hls.selectSegmentIndexByTime(value); 127 player.pause();
125 fillBuffer(value-player.hls.getSegmentByTime(value).timeRange.start); 128 player.trigger('ended');
126 } else { 129 }
127 try { 130 });
128 returnValue = player.el().getElementsByClassName('vjs-tech')[0].vjs_getProperty('currentTime'); 131
129 if(returnValue > player.duration()) { 132 player.hls.isLastSegment = function() {
130 returnValue = player.duration(); 133 return player.hls.mediaIndex === player.hls.selectPlaylist().segments.length;
131 } else if (returnValue < 0) {
132 returnValue = 0;
133 }
134 return returnValue;
135 } catch(err) {
136 return 0;
137 }
138 }
139 }; 134 };
140 135
141 player.hls.getSegmentByTime = function(time) { 136 player.hls.getSegmentByTime = function(time) {
...@@ -151,9 +146,8 @@ var ...@@ -151,9 +146,8 @@ var
151 } 146 }
152 }; 147 };
153 148
154 player.hls.selectSegmentIndexByTime = function(time) { 149 player.hls.getSegmentIndexByTime = function(time) {
155 var index, currentSegment; 150 var index, currentSegment;
156
157 if (player.hls.media && player.hls.media.segments) { 151 if (player.hls.media && player.hls.media.segments) {
158 for (index = 0; index < player.hls.media.segments.length; index++) { 152 for (index = 0; index < player.hls.media.segments.length; index++) {
159 currentSegment = player.hls.media.segments[index]; 153 currentSegment = player.hls.media.segments[index];
...@@ -299,18 +293,21 @@ var ...@@ -299,18 +293,21 @@ var
299 * Determines whether there is enough video data currently in the buffer 293 * Determines whether there is enough video data currently in the buffer
300 * and downloads a new segment if the buffered time is less than the goal. 294 * and downloads a new segment if the buffered time is less than the goal.
301 */ 295 */
302 fillBuffer = function(intrasegmentSecond) { 296 fillBuffer = function(millisecond) {
303 var 297 var
304 buffered = player.buffered(), 298 buffered = player.buffered(),
305 bufferedTime = 0, 299 bufferedTime = 0,
306 segment = player.hls.media.segments[player.hls.mediaIndex], 300 segment = player.hls.media.segments[player.hls.mediaIndex],
307 segmentUri, 301 segmentUri,
308 gotoSecond, 302 desiredMillisecond,
309 startTime; 303 startTime,
304 targetTag,
305 tagIndex,
306 bleedIndex = 0;
310 307
311 if(intrasegmentSecond) 308 if(millisecond)
312 { 309 {
313 gotoSecond = intrasegmentSecond; 310 desiredMillisecond = millisecond;
314 } 311 }
315 312
316 // if there is a request already in flight, do nothing 313 // if there is a request already in flight, do nothing
...@@ -351,19 +348,16 @@ var ...@@ -351,19 +348,16 @@ var
351 // transmux the segment data from MP2T to FLV 348 // transmux the segment data from MP2T to FLV
352 segmentParser.parseSegmentBinaryData(new Uint8Array(segmentXhr.response)); 349 segmentParser.parseSegmentBinaryData(new Uint8Array(segmentXhr.response));
353 350
354 if(gotoSecond!==null && gotoSecond>0) 351 if(desiredMillisecond!==null && desiredMillisecond>0)
355 { 352 {
356 var seekToTagIndex = parseInt((segmentParser.getTags().length/player.hls.selectPlaylist().segments[player.hls.mediaIndex].duration)*gotoSecond,10); 353 for(tagIndex = 0; tagIndex < segmentParser.getTags().length-1; tagIndex++) {
357 var seekToTagCounter = 0; 354 if(segmentParser.getTags()[tagIndex].pts <= desiredMillisecond && segmentParser.getTags()[tagIndex+1].pts > desiredMillisecond) {
358 355 targetTag = tagIndex;
359 //console.log('Go to:', gotoSecond); 356 }
360 //console.log('tag index:', seekToTagIndex); 357 }
361 358 while(bleedIndex < targetTag) {
362 //drain until where you want in the buffer 359 segmentParser.getNextTag();
363 while(seekToTagCounter<seekToTagIndex) 360 bleedIndex++;
364 {
365 segmentParser.getNextTag();
366 seekToTagCounter++;
367 } 361 }
368 } 362 }
369 363
...@@ -371,18 +365,6 @@ var ...@@ -371,18 +365,6 @@ var
371 player.hls.sourceBuffer.appendBuffer(segmentParser.getNextTag().bytes, player); 365 player.hls.sourceBuffer.appendBuffer(segmentParser.getNextTag().bytes, player);
372 } 366 }
373 367
374 /*
375 if(player.hls.mediaIndex === player.hsl.selectPlaylist.segments.length-1)
376 {
377 try {
378 // TODO - Still need to test this. This tells the Flash Player the stream is over
379 // player.el().getElementsByClassName('vjs-tech')[0].vjs_setProperty('appendBytesAction', 'endSequence');
380 } catch(err) {
381
382 }
383 }
384 */
385
386 segmentXhr = null; 368 segmentXhr = null;
387 player.hls.mediaIndex++; 369 player.hls.mediaIndex++;
388 370
......