81 lines
3.4 KiB
ActionScript
81 lines
3.4 KiB
ActionScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
package org.mangui.hls.controller {
|
|
import org.mangui.hls.constant.HLSLoaderTypes;
|
|
import org.mangui.hls.event.HLSEvent;
|
|
import org.mangui.hls.event.HLSLoadMetrics;
|
|
import org.mangui.hls.HLS;
|
|
import org.mangui.hls.HLSSettings;
|
|
|
|
CONFIG::LOGGING {
|
|
import org.mangui.hls.utils.Log;
|
|
}
|
|
/** Class that manages buffer threshold values (minBufferLength/lowBufferLength)
|
|
*/
|
|
public class BufferThresholdController {
|
|
/** Reference to the HLS controller. **/
|
|
private var _hls : HLS;
|
|
private var _targetduration : Number;
|
|
private var _minBufferLength : Number;
|
|
|
|
/** Create the loader. **/
|
|
public function BufferThresholdController(hls : HLS) : void {
|
|
_hls = hls;
|
|
_hls.addEventListener(HLSEvent.MANIFEST_LOADED, _manifestLoadedHandler);
|
|
_hls.addEventListener(HLSEvent.TAGS_LOADED, _fragmentLoadedHandler);
|
|
_hls.addEventListener(HLSEvent.FRAGMENT_LOADED, _fragmentLoadedHandler);
|
|
};
|
|
|
|
public function dispose() : void {
|
|
_hls.removeEventListener(HLSEvent.MANIFEST_LOADED, _manifestLoadedHandler);
|
|
_hls.removeEventListener(HLSEvent.TAGS_LOADED, _fragmentLoadedHandler);
|
|
_hls.removeEventListener(HLSEvent.FRAGMENT_LOADED, _fragmentLoadedHandler);
|
|
}
|
|
|
|
public function get minBufferLength() : Number {
|
|
if (HLSSettings.minBufferLength == -1) {
|
|
return _minBufferLength;
|
|
} else {
|
|
return HLSSettings.minBufferLength;
|
|
}
|
|
}
|
|
|
|
public function get lowBufferLength() : Number {
|
|
if (HLSSettings.minBufferLength == -1) {
|
|
// in automode, low buffer threshold should be less than min auto buffer
|
|
return Math.min(minBufferLength / 2, HLSSettings.lowBufferLength);
|
|
} else {
|
|
return HLSSettings.lowBufferLength;
|
|
}
|
|
}
|
|
|
|
private function _manifestLoadedHandler(event : HLSEvent) : void {
|
|
_targetduration = event.levels[_hls.startLevel].targetduration;
|
|
_minBufferLength = _targetduration;
|
|
};
|
|
|
|
private function _fragmentLoadedHandler(event : HLSEvent) : void {
|
|
var metrics : HLSLoadMetrics = event.loadMetrics;
|
|
// only monitor main fragment metrics for buffer threshold computing
|
|
if(metrics.type == HLSLoaderTypes.FRAGMENT_MAIN) {
|
|
/* set min buf len to be the time to process a complete segment, using current processing rate */
|
|
_minBufferLength = metrics.processing_duration * (_targetduration / metrics.duration);
|
|
// avoid min > max
|
|
if (HLSSettings.maxBufferLength) {
|
|
_minBufferLength = Math.min(HLSSettings.maxBufferLength, _minBufferLength);
|
|
}
|
|
|
|
// avoid _minBufferLength > minBufferLengthCapping
|
|
if (HLSSettings.minBufferLengthCapping > 0) {
|
|
_minBufferLength = Math.min(HLSSettings.minBufferLengthCapping, _minBufferLength);
|
|
}
|
|
|
|
CONFIG::LOGGING {
|
|
Log.debug2("AutoBufferController:minBufferLength:" + _minBufferLength);
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|