package ckaction.player {
	import org.mangui.hls.HLS;
	import org.mangui.hls.event.HLSEvent;
	import org.mangui.hls.utils.Params2Settings;
	import org.mangui.hls.constant.HLSPlayStates;
	import org.mangui.hls.model.Level;
	import flash.display.Stage;
	import flash.events.NetStatusEvent;
	import org.mangui.hls.HLSSettings;
	import flash.media.SoundTransform;
	import ckaction.C.C;
	import flash.events.Event;

	public class httpm3u8 {
		public var videoUrl: String = "";

		public var netStatus: Function = null,
			streamSendOut: Function = null,
			error: Function = null; //发送流状态的函数，发送流的函数，统一用来报错的函数
		public var definitionList: Function = null,
			definitionNow: Function = null;
		public var speedFun:Function=null;
		public var stage: Stage = null;
		public var usehardwareeecoder:Boolean=false;
		private var hls: HLS = null;
		private var isClear: Boolean = false; //默认不清除
		private var vWidth: int = 0,
			vHeight: int = 0,
			time: Number = 0,
			duration: Number = 0,
			bytesTotal: int = 0,
			bytesLoaded: int = 0;
		private var urlArr: Array = [];
		public function httpm3u8() {
			// constructor code
		}
		public function load(eve: Boolean = true): void {
			if (C.CONFIG["flashvars"]["debug"]) {
				org.mangui.hls.HLSSettings.logInfo = true;
				org.mangui.hls.HLSSettings.logDebug2 = true;
				org.mangui.hls.HLSSettings.logWarn = true;
				org.mangui.hls.HLSSettings.logError = true;
			}
			org.mangui.hls.HLSSettings.maxBufferLength = C.CONFIG["config"]["m3u8MaxBufferLength"];
			if (isClear) { //如果已被清除，则不进行下面的动作
				return;
			}
			hls = new HLS();
			hls.stage = stage;
			hls.addEventListener(HLSEvent.PLAYBACK_COMPLETE, completeHandler);
			hls.addEventListener(HLSEvent.ERROR, errorHandler);
			hls.addEventListener(HLSEvent.MANIFEST_LOADED, manifestHandler);
			hls.addEventListener(HLSEvent.MEDIA_TIME, mediaTimeHandler);
			hls.addEventListener(HLSEvent.PLAYBACK_STATE, stateHandler);
			hls.addEventListener(HLSEvent.FRAGMENT_LOADING, fragmentHandler);
			hls.addEventListener(HLSEvent.FRAGMENT_PLAYING, fragmentPlayingHandler);
			hls.addEventListener(HLSEvent.ID3_UPDATED, ID3Handler);
			hls.addEventListener(HLSEvent.FRAGMENT_LOADED, fragmentLoadedHandler);
			hls.addEventListener(HLSEvent.LOADED_BYTES,loadedBytesHandler);
			hls.stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
			try{
				hls.stream.useHardwareDecoder=usehardwareeecoder;
			}
			catch(error:Event){

			}
			hls.load(videoUrl);
		}
		private function fragmentLoadedHandler(event: HLSEvent): void {
			if (bytesLoaded < bytesTotal) {
				bytesLoaded++;
			}
		}
		private function loadedBytesHandler(event: HLSEvent): void {
			trace("加载量：",event.loadedBytes);
			speedFun(event.loadedBytes);
		}
		private function completeHandler(event: HLSEvent): void {
			//trace("hls:completeHandler", event);
		}
		private function errorHandler(event: HLSEvent): void {
			//trace("hls:errorHandler", event);
			error(C.CONFIG["language"]["error"]["streamNotFound"]);
			clear();
		}
		private function manifestHandler(event: HLSEvent): void { //可以播放了
			trace("可以进行播放====");
			var i: int = 0;
			var len: int = event.levels.length;
			while (i < len) {
				//trace("==",event.levels[i].url);
				urlArr.push(event.levels[i].url);
				i++;
			}
			trace(event.levels[hls.startLevel].url);
			if (urlArr.length > 1) {
				definitionList(urlArr, hls.startLevel);
			}
			bytesTotal = event.levels[hls.startLevel].fragments.length;
			if (isClear) {
				return;
			}
			hls.stream.play();
			duration = event.levels[hls.startLevel].duration;
			netStatus("NetConnection.Connect.Success");
		}
		private function mediaTimeHandler(event: HLSEvent): void {
			//监听时间改变
			time = Math.max(0, event.mediatime.position);

		}
		private function stateHandler(event: HLSEvent) {
			if (event.level < urlArr.length - 1) {
				definitionNow(event.level);
			}
			switch (event.state) {
				case HLSPlayStates.PLAYING_BUFFERING:
					break;
				case HLSPlayStates.PAUSED_BUFFERING:
					break;
				case HLSPlayStates.PLAYING:
					break;
				case HLSPlayStates.PAUSED:
					break;
				case HLSPlayStates.IDLE: //播放结束
					netStatus("NetStream.Play.Stop");
					break;
				default:
					break;
			}
		}
		private function fragmentHandler(event: HLSEvent): void {
			//trace("hls:fragmentHandler", event.playMetrics)
		}
		private function ID3Handler(event: HLSEvent) {
			//trace("hls:ID3Handler", event);
		}
		private function netStatusHandler(event: NetStatusEvent): void {
			//trace("========",event.info.code);
			netStatus(event.info.code);
		}
		private function fragmentPlayingHandler(event: HLSEvent): void {
			if (vWidth == 0 && vHeight == 0) {
				vWidth = event.playMetrics.video_width;
				vHeight = event.playMetrics.video_height;
				hls.stream.pause();
				var metaDataObj: Object = {
					netStream: hls.stream,
					type: "[object HLSNetStream]",
					metaData: {
						width: vWidth,
						height: vHeight,
						duration: duration,
						bytesTotal: bytesTotal

					}
				};
				//模拟发送监听状态
				netStatus("NetStream.Play.Start");
				streamSendOut(metaDataObj);
			}
			trace("hls:fragmentPlayingHandler", event);

		}
		public function videoVolume(val: Number = 0): void { //修改音量
			var v: SoundTransform = hls.stream.soundTransform;
			v.volume = val;
			if (hls.stream) {
				hls.stream.soundTransform = v;
			}

		}
		public function videoSeek(time: Number = 0): void {
			if (hls.stream) {
				var n: int = time/(duration / bytesTotal);
				if (bytesLoaded < n) {
					bytesLoaded = n;
				}
				hls.stream.seek(time);
			}
		}
		//提供给外部调用使用
		public function getTime(): Number {
			return time;
		}
		public function getDuration(): Number {
			return duration;
		}
		public function getBytesLoaded(): Number {
			return bytesLoaded;
		}
		public function getBytesTotal(): Number {
			return bytesTotal;
		}
		public function getBufferTime(): Number {
			if (hls.stream != null) {
				return hls.stream.bufferTime;
			}
			return 0;
		}
		public function getBufferLength(): Number {
			if (hls.stream != null) {
				return hls.stream.bufferLength;
			}
			return 0;
		}
		public function videoPlay(): void {
			trace("==执行了m3u8-videoPlay");
			if (hls.stream != null) {
				hls.stream.resume();
			}
		}
		public function videoPause(): void {
			if (hls.stream != null) {
				hls.stream.pause();
			}
		}
		//提供给外部调用结束
		public function clear(): void {
			isClear = true;
			if (hls) {
				hls.removeEventListener(HLSEvent.PLAYBACK_COMPLETE, completeHandler);
				hls.removeEventListener(HLSEvent.ERROR, errorHandler);
				hls.removeEventListener(HLSEvent.MANIFEST_LOADED, manifestHandler);
				hls.removeEventListener(HLSEvent.MEDIA_TIME, mediaTimeHandler);
				hls.removeEventListener(HLSEvent.PLAYBACK_STATE, stateHandler);
				hls.removeEventListener(HLSEvent.FRAGMENT_LOADING, fragmentHandler);
				hls.removeEventListener(HLSEvent.FRAGMENT_PLAYING, fragmentPlayingHandler);
				hls.removeEventListener(HLSEvent.ID3_UPDATED, ID3Handler);
				hls.removeEventListener(HLSEvent.FRAGMENT_LOADED, fragmentLoadedHandler);
				hls.removeEventListener(HLSEvent.LOADED_BYTES,loadedBytesHandler);
				hls.stream.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
				hls.stream.close();
				hls = null;
			}

		}
	}

}
