Skip to content

Commit

Permalink
Merge remote-tracking branch 'mangui/dev' into dev
Browse files Browse the repository at this point in the history
Conflicts:
	.gitignore
	bin/debug/flashls.swc
	bin/debug/flashlsChromeless.swf
	bin/debug/flashlsFlowPlayer.swf
	bin/debug/flashlsOSMF.swc
	bin/debug/flashlsOSMF.swf
	bin/release/flashls.swc
	bin/release/flashlsChromeless.swf
	bin/release/flashlsFlowPlayer.swf
	bin/release/flashlsOSMF.swc
	bin/release/flashlsOSMF.swf
  • Loading branch information
jlacivita committed Sep 16, 2015
2 parents ee5ed3e + 494f4f4 commit 1e4e51e
Show file tree
Hide file tree
Showing 8 changed files with 324 additions and 80 deletions.
15 changes: 15 additions & 0 deletions src/org/mangui/chromeless/ChromelessPlayer.as
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,18 @@ package org.mangui.chromeless {
_trigger("switch", event.level);
};

protected function _fpsDropHandler(event : HLSEvent) : void {
_trigger("fpsDrop", event.level);
};

protected function _fpsDropLevelCappingHandler(event : HLSEvent) : void {
_trigger("fpsDropLevelCapping", event.level);
};

protected function _fpsDropSmoothLevelSwitchHandler(event : HLSEvent) : void {
_trigger("fpsDropSmoothLevelSwitch");
};

protected function _audioTracksListChange(event : HLSEvent) : void {
_trigger("audioTracksListChange", _getAudioTrackList());
}
Expand Down Expand Up @@ -495,6 +507,9 @@ package org.mangui.chromeless {
_hls.addEventListener(HLSEvent.AUDIO_TRACKS_LIST_CHANGE, _audioTracksListChange);
_hls.addEventListener(HLSEvent.AUDIO_TRACK_SWITCH, _audioTrackChange);
_hls.addEventListener(HLSEvent.ID3_UPDATED, _id3Updated);
_hls.addEventListener(HLSEvent.FPS_DROP, _fpsDropHandler);
_hls.addEventListener(HLSEvent.FPS_DROP_LEVEL_CAPPING, _fpsDropLevelCappingHandler);
_hls.addEventListener(HLSEvent.FPS_DROP_SMOOTH_LEVEL_SWITCH, _fpsDropSmoothLevelSwitchHandler);

if (available && stage.stageVideos.length > 0) {
_stageVideo = stage.stageVideos[0];
Expand Down
26 changes: 24 additions & 2 deletions src/org/mangui/hls/HLS.as
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ package org.mangui.hls {
import flash.net.NetStream;
import flash.net.URLLoader;
import flash.net.URLStream;
import org.mangui.hls.constant.HLSSeekStates;
import org.mangui.hls.controller.AudioTrackController;
import org.mangui.hls.controller.LevelController;
import org.mangui.hls.event.HLSEvent;
Expand Down Expand Up @@ -135,8 +136,11 @@ package org.mangui.hls {
/* instant quality level switch (-1 for automatic level selection) */
public function set currentLevel(level : int) : void {
_manual_level = level;
_streamBuffer.flushBuffer();
_hlsNetStream.seek(position);
// don't flush and seek if never seeked or if end of stream
if(seekState != HLSSeekStates.IDLE) {
_streamBuffer.flushBuffer();
_hlsNetStream.seek(position);
}
};

/* set quality level for next loaded fragment (-1 for automatic level selection) */
Expand Down Expand Up @@ -180,6 +184,16 @@ package org.mangui.hls {
return _streamBuffer.position;
};

/** Return the live main playlist sliding in seconds since previous out of buffer seek(). **/
public function get liveSlidingMain() : Number {
return _streamBuffer.liveSlidingMain;
}

/** Return the live altaudio playlist sliding in seconds since previous out of buffer seek(). **/
public function get liveSlidingAltAudio() : Number {
return _streamBuffer.liveSlidingAltAudio;
}

/** Return the current playback state. **/
public function get playbackState() : String {
return _hlsNetStream.playbackState;
Expand Down Expand Up @@ -269,5 +283,13 @@ package org.mangui.hls {
public function get stats() : Stats {
return _statsHandler.stats;
}

/* start/restart playlist/fragment loading.
this is only effective if MANIFEST_PARSED event has been triggered already */
public function startLoad() : void {
if(levels && levels.length) {
this.dispatchEvent(new HLSEvent(HLSEvent.LEVEL_SWITCH, startLevel));
}
}
}
}
13 changes: 13 additions & 0 deletions src/org/mangui/hls/HLSSettings.as
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@ package org.mangui.hls {
import org.mangui.hls.constant.HLSMaxLevelCappingMode;

public final class HLSSettings extends Object {
/**
* autoStartLoad
*
* if set to true,
* start level playlist and first fragments will be loaded automatically,
* after triggering of HlsEvent.MANIFEST_PARSED event
* if set to false,
* an explicit API call (hls.startLoad()) will be needed
* to start quality level/fragment loading.
*
* Default is true
*/
public static var autoStartLoad : Boolean = true;
/**
* capLevelToStage
*
Expand Down
17 changes: 12 additions & 5 deletions src/org/mangui/hls/controller/LevelController.as
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ package org.mangui.hls.controller {
public function LevelController(hls : HLS) : void {
_hls = hls;
_fpsController = new FPSController(hls);
_hls.addEventListener(HLSEvent.MANIFEST_PARSED, _manifestParsedHandler);
/* low priority listener, so that other listeners with default priority
could seamlessly set hls.startLevel in their HLSEvent.MANIFEST_PARSED listener */
_hls.addEventListener(HLSEvent.MANIFEST_PARSED, _manifestParsedHandler, false, int.MIN_VALUE);
_hls.addEventListener(HLSEvent.MANIFEST_LOADED, _manifestLoadedHandler);
_hls.addEventListener(HLSEvent.FRAGMENT_LOADED, _fragmentLoadedHandler);
_hls.addEventListener(HLSEvent.FRAGMENT_LOAD_EMERGENCY_ABORTED, _fragmentLoadedHandler);
Expand All @@ -69,8 +71,10 @@ package org.mangui.hls.controller {
}

private function _manifestParsedHandler(event : HLSEvent) : void {
// upon manifest parsed event, trigger a level switch to load startLevel playlist
_hls.dispatchEvent(new HLSEvent(HLSEvent.LEVEL_SWITCH, _hls.startLevel));
if(HLSSettings.autoStartLoad) {
// upon manifest parsed event, trigger a level switch to load startLevel playlist
_hls.dispatchEvent(new HLSEvent(HLSEvent.LEVEL_SWITCH, startLevel));
}
}

private function _manifestLoadedHandler(event : HLSEvent) : void {
Expand Down Expand Up @@ -292,6 +296,9 @@ package org.mangui.hls.controller {
return 0;
}

public function isStartLevelSet() : Boolean {
return (_startLevel >=0);
}

/* set the quality level used when starting a fresh playback */
public function set startLevel(level : int) : void {
Expand Down Expand Up @@ -371,8 +378,8 @@ package org.mangui.hls.controller {
var seek_level : int = -1;
var levels : Vector.<Level> = _hls.levels;
if (HLSSettings.seekFromLevel == -1) {
// keep last level
return _hls.loadLevel;
// keep last level, but don't exceed _maxLevel
return Math.min(_hls.loadLevel,_maxLevel);
}

// set up seek level as being the lowest non-audio level.
Expand Down
25 changes: 17 additions & 8 deletions src/org/mangui/hls/loader/FragmentLoader.as
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,13 @@ package org.mangui.hls.loader {
if (_manifestJustLoaded) {
level = _hls.startLevel;
} else {
level = _hls.seekLevel;
if(_hls.stream.bufferLength) {
// if buffer not empty, select level from heuristics
level = _levelController.getnextlevel(_hls.loadLevel, _hls.stream.bufferLength);
} else {
// if buffer empty, retrieve seek level
level = _hls.seekLevel;
}
}
} else {
level = _hls.manualLevel;
Expand Down Expand Up @@ -317,6 +323,7 @@ package org.mangui.hls.loader {
_fragmentFirstLoaded = false;
_fragPrevious = null;
_fragSkipping = false;
_levelNext = -1;
_timer.start();
}

Expand Down Expand Up @@ -927,6 +934,7 @@ package org.mangui.hls.loader {
return;
var hlsError : HLSError;
var fragData : FragmentData = _fragCurrent.data;
var fragLevelIdx : int = _fragCurrent.level;
if ((_demux.audioExpected && !fragData.audio_found) && (_demux.videoExpected && !fragData.video_found)) {
hlsError = new HLSError(HLSError.FRAGMENT_PARSING_ERROR, _fragCurrent.url, "error parsing fragment, no tag found");
_hls.dispatchEvent(new HLSEvent(HLSEvent.ERROR, hlsError));
Expand All @@ -953,12 +961,12 @@ package org.mangui.hls.loader {

if (_manifestJustLoaded) {
_manifestJustLoaded = false;
if (HLSSettings.startFromLevel === -1 && HLSSettings.startFromBitrate === -1 && _levels.length > 1) {
if (HLSSettings.startFromLevel === -1 && HLSSettings.startFromBitrate === -1 && _levels.length > 1 && !_levelController.isStartLevelSet()) {
// check if we can directly switch to a better bitrate, in case download bandwidth is enough
var bestlevel : int = _levelController.getbestlevel(_metrics.bandwidth);
if (bestlevel > _hls.loadLevel) {
if (bestlevel > fragLevelIdx) {
CONFIG::LOGGING {
Log.info("enough download bandwidth, adjust start level from " + _hls.loadLevel + " to " + bestlevel);
Log.info("enough download bandwidth, adjust start level from 0 to " + bestlevel);
}
// dispatch event for tracking purpose
_hls.dispatchEvent(new HLSEvent(HLSEvent.FRAGMENT_LOADED, _metrics));
Expand All @@ -967,7 +975,7 @@ package org.mangui.hls.loader {
_loadingState = LOADING_IDLE;
_switchLevel = true;
_demux = null;
_hls.dispatchEvent(new HLSEvent(HLSEvent.LEVEL_SWITCH, _hls.loadLevel));
_hls.dispatchEvent(new HLSEvent(HLSEvent.LEVEL_SWITCH, fragLevelIdx));
// speed up loading of new playlist
_timer.start();
return;
Expand All @@ -978,14 +986,15 @@ package org.mangui.hls.loader {
try {
_switchLevel = false;
_levelNext = -1;
var fragLevel : Level = _levels[fragLevelIdx];
CONFIG::LOGGING {
Log.debug("Loaded " + _fragCurrent.seqnum + " of [" + (_levels[_hls.loadLevel].start_seqnum) + "," + (_levels[_hls.loadLevel].end_seqnum) + "],level " + _hls.loadLevel + " m/M PTS:" + fragData.pts_min + "/" + fragData.pts_max);
Log.debug("Loaded " + _fragCurrent.seqnum + " of [" + (fragLevel.start_seqnum) + "," + (fragLevel.end_seqnum) + "],level " + fragLevelIdx + " m/M PTS:" + fragData.pts_min + "/" + fragData.pts_max);
}
if (fragData.audio_found || fragData.video_found) {
_levels[_hls.loadLevel].updateFragment(_fragCurrent.seqnum, true, fragData.pts_min, fragData.pts_max + fragData.tag_duration);
fragLevel.updateFragment(_fragCurrent.seqnum, true, fragData.pts_min, fragData.pts_max + fragData.tag_duration);
// set pts_start here, it might not be updated directly in updateFragment() if this loaded fragment has been removed from a live playlist
fragData.pts_start = fragData.pts_min;
_hls.dispatchEvent(new HLSEvent(HLSEvent.PLAYLIST_DURATION_UPDATED, _levels[_hls.loadLevel].duration));
_hls.dispatchEvent(new HLSEvent(HLSEvent.PLAYLIST_DURATION_UPDATED, fragLevel.duration));
if (fragData.tags.length) {
if (fragData.metadata_tag_injected == false) {
fragData.tags.unshift(_fragCurrent.getMetadataTag());
Expand Down
Loading

0 comments on commit 1e4e51e

Please sign in to comment.