Skip to content

Commit

Permalink
abr-controller: use fragment total processing time instead of loading…
Browse files Browse the repository at this point in the history
… time for bw estimation
  • Loading branch information
mangui committed Oct 20, 2016
1 parent 04783d9 commit d9ab613
Showing 1 changed file with 18 additions and 15 deletions.
33 changes: 18 additions & 15 deletions src/controller/abr-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class AbrController extends EventHandler {
constructor(hls) {
super(hls, Event.FRAG_LOADING,
Event.FRAG_LOADED,
Event.FRAG_BUFFERED,
Event.ERROR);
this.lastLoadedFragLevel = 0;
this._autoLevelCapping = -1;
Expand Down Expand Up @@ -128,21 +129,6 @@ class AbrController extends EventHandler {
onFragLoaded(data) {
let frag = data.frag;
if (frag.type === 'main') {
let stats = data.stats;
// only update stats on first frag loading
// if same frag is loaded multiple times, it might be in browser cache, and loaded quickly
// and leading to wrong bw estimation
if (stats.aborted === undefined && frag.loadCounter === 1) {
let fragLoadingDurationMs = stats.tload - stats.trequest;
this.bwEstimator.sample(fragLoadingDurationMs,stats.loaded);
// if fragment has been loaded to perform a bitrate test, (hls.startLevel = -1), store bitrate test delay duration
if (frag.bitrateTest) {
this.bitrateTestDelay = fragLoadingDurationMs/1000;
} else {
this.bitrateTestDelay = 0;
}
}

// stop monitoring bw once frag loaded
this.clearTimer();
// store level id after successful fragment load
Expand All @@ -152,6 +138,23 @@ class AbrController extends EventHandler {
}
}

onFragBuffered(data) {
var stats = data.stats, frag = data.frag;
// only update stats on first frag buffering
// if same frag is loaded multiple times, it might be in browser cache, and loaded quickly
// and leading to wrong bw estimation
if (stats.aborted !== true && frag.loadCounter === 1 && frag.type === 'main') {
let fragLoadingProcessingMs = stats.tbuffered - stats.trequest;
this.bwEstimator.sample(fragLoadingProcessingMs,stats.loaded);
// if fragment has been loaded to perform a bitrate test, (hls.startLevel = -1), store bitrate test delay duration
if (frag.bitrateTest) {
this.bitrateTestDelay = fragLoadingProcessingMs/1000;
} else {
this.bitrateTestDelay = 0;
}
}
}

onError(data) {
// stop timer in case of frag loading error
switch(data.details) {
Expand Down

0 comments on commit d9ab613

Please sign in to comment.