1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

update components

This commit is contained in:
Luke Pulverenti 2016-03-17 01:06:37 -04:00
parent d004fd3960
commit 2fa1b14785
15 changed files with 179 additions and 86 deletions

View file

@ -11,7 +11,7 @@ import LevelHelper from '../helper/level-helper';
import {ErrorTypes, ErrorDetails} from '../errors';
const State = {
ERROR : 'ERROR',
STOPPED : 'STOPPED',
STARTING : 'STARTING',
IDLE : 'IDLE',
PAUSED : 'PAUSED',
@ -21,7 +21,8 @@ const State = {
WAITING_LEVEL : 'WAITING_LEVEL',
PARSING : 'PARSING',
PARSED : 'PARSED',
ENDED : 'ENDED'
ENDED : 'ENDED',
ERROR : 'ERROR'
};
class StreamController extends EventHandler {
@ -30,6 +31,7 @@ class StreamController extends EventHandler {
super(hls,
Event.MEDIA_ATTACHED,
Event.MEDIA_DETACHING,
Event.MANIFEST_LOADING,
Event.MANIFEST_PARSED,
Event.LEVEL_LOADED,
Event.KEY_LOADED,
@ -48,17 +50,23 @@ class StreamController extends EventHandler {
}
destroy() {
this.stop();
this.stopLoad();
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
EventHandler.prototype.destroy.call(this);
this.state = State.IDLE;
this.state = State.STOPPED;
}
startLoad() {
startLoad(startPosition=0) {
if (this.levels) {
var media = this.media, lastCurrentTime = this.lastCurrentTime;
this.stop();
this.stopLoad();
this.demuxer = new Demuxer(this.hls);
this.timer = setInterval(this.ontick, 100);
if (!this.timer) {
this.timer = setInterval(this.ontick, 100);
}
this.level = -1;
this.fragLoadError = 0;
if (media && lastCurrentTime) {
@ -69,19 +77,18 @@ class StreamController extends EventHandler {
}
this.state = State.IDLE;
} else {
this.lastCurrentTime = this.startPosition ? this.startPosition : 0;
this.lastCurrentTime = this.startPosition ? this.startPosition : startPosition;
this.state = State.STARTING;
}
this.nextLoadPosition = this.startPosition = this.lastCurrentTime;
this.tick();
} else {
logger.warn('cannot start loading as manifest not parsed yet');
this.state = State.STOPPED;
}
}
stop() {
this.bufferRange = [];
this.stalled = false;
stopLoad() {
var frag = this.fragCurrent;
if (frag) {
if (frag.loader) {
@ -90,16 +97,11 @@ class StreamController extends EventHandler {
this.fragCurrent = null;
}
this.fragPrevious = null;
logger.log('trigger BUFFER_RESET');
this.hls.trigger(Event.BUFFER_RESET);
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
if (this.demuxer) {
this.demuxer.destroy();
this.demuxer = null;
}
this.state = State.STOPPED;
}
tick() {
@ -703,7 +705,7 @@ class StreamController extends EventHandler {
}
this.media = null;
this.loadedmetadata = false;
this.stop();
this.stopLoad();
}
onMediaSeeking() {
@ -750,6 +752,14 @@ class StreamController extends EventHandler {
}
onManifestLoading() {
// reset buffer on manifest loading
logger.log('trigger BUFFER_RESET');
this.hls.trigger(Event.BUFFER_RESET);
this.bufferRange = [];
this.stalled = false;
}
onManifestParsed(data) {
var aac = false, heaac = false, codec;
data.levels.forEach(level => {
@ -1111,6 +1121,7 @@ _checkBuffer() {
if (this.stalled && playheadMoving) {
this.stalled = false;
logger.log(`playback not stuck anymore @${currentTime}`);
}
// check buffer upfront
// if less than 200ms is buffered, and media is expected to play but playhead is not moving,
@ -1121,8 +1132,8 @@ _checkBuffer() {
jumpThreshold = 0;
} else {
// playhead not moving AND media expected to play
logger.log(`playback seems stuck @${currentTime}`);
if(!this.stalled) {
logger.log(`playback seems stuck @${currentTime}`);
this.hls.trigger(Event.ERROR, {type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_STALLED_ERROR, fatal: false});
this.stalled = true;
}