home *** CD-ROM | disk | FTP | other *** search
Text File | 2010-06-23 | 51.0 KB | 1,808 lines |
- package mx.controls.videoClasses
- {
- import flash.events.Event;
- import flash.events.NetStatusEvent;
- import flash.events.ProgressEvent;
- import flash.events.TimerEvent;
- import flash.media.SoundTransform;
- import flash.media.Video;
- import flash.utils.Timer;
- import mx.core.mx_internal;
- import mx.events.MetadataEvent;
- import mx.events.VideoEvent;
- import mx.resources.IResourceManager;
- import mx.resources.ResourceManager;
-
- use namespace mx_internal;
-
- public class VideoPlayer extends Video
- {
- mx_internal static const VERSION:String = "3.5.0.12683";
-
- public static const DISCONNECTED:String = "disconnected";
-
- public static const STOPPED:String = "stopped";
-
- public static const PLAYING:String = "playing";
-
- public static const PAUSED:String = "paused";
-
- public static const BUFFERING:String = "buffering";
-
- public static const LOADING:String = "loading";
-
- public static const CONNECTION_ERROR:String = "connectionError";
-
- public static const REWINDING:String = "rewinding";
-
- public static const SEEKING:String = "seeking";
-
- public static const RESIZING:String = "resizing";
-
- public static const EXEC_QUEUED_CMD:String = "execQueuedCmd";
-
- private static const BUFFER_EMPTY:String = "bufferEmpty";
-
- private static const BUFFER_FULL:String = "bufferFull";
-
- private static const BUFFER_FLUSH:String = "bufferFlush";
-
- public static const DEFAULT_UPDATE_TIME_INTERVAL:Number = 250;
-
- public static const DEFAULT_UPDATE_PROGRESS_INTERVAL:Number = 250;
-
- public static const DEFAULT_IDLE_TIMEOUT_INTERVAL:Number = 300000;
-
- public static const AUTO_RESIZE_INTERVAL:Number = 100;
-
- public static const AUTO_RESIZE_PLAYHEAD_TIMEOUT:Number = 0.5;
-
- public static const AUTO_RESIZE_METADATA_DELAY_MAX:Number = 5;
-
- public static const FINISH_AUTO_RESIZE_INTERVAL:Number = 250;
-
- public static const RTMP_DO_STOP_AT_END_INTERVAL:Number = 500;
-
- public static const RTMP_DO_SEEK_INTERVAL:Number = 100;
-
- public static const HTTP_DO_SEEK_INTERVAL:Number = 250;
-
- public static const HTTP_DO_SEEK_MAX_COUNT:Number = 4;
-
- public static const CLOSE_NS_INTERVAL:Number = 0.25;
-
- public static const HTTP_DELAYED_BUFFERING_INTERVAL:Number = 100;
-
- public static var DEFAULT_INCMANAGER:Class = NCManager;
-
- public var autoBandWidthDetection:Boolean = false;
-
- private var rtmpDoStopAtEndTimer:Timer;
-
- private var currentPos:Number;
-
- private var bufferState:String;
-
- private var _volume:Number;
-
- public var ncMgrClassName:Class;
-
- private var _visible:Boolean;
-
- private var cachedPlayheadTime:Number;
-
- private var _ncMgr:INCManager;
-
- private var _soundTransform:SoundTransform;
-
- private var prevVideoHeight:Number = -1;
-
- private var _isLive:Boolean;
-
- private var idleTimeoutTimer:Timer;
-
- private var sawPlayStop:Boolean;
-
- private var lastUpdateTime:Number;
-
- private var invalidSeekTime:Boolean;
-
- private var autoPlay:Boolean;
-
- private var _priorBytesLoaded:int = -1;
-
- private var httpDoSeekCount:Number;
-
- private var streamLength:Number;
-
- private var _metadata:Object;
-
- private var cachedState:String;
-
- private var _state:String;
-
- private var startingPlay:Boolean;
-
- private var readyDispatched:Boolean;
-
- private var internalVideoHeight:Number = -1;
-
- private var atEnd:Boolean;
-
- private var sawSeekNotify:Boolean;
-
- private var prevVideoWidth:Number = -1;
-
- private var updateTimeTimer:Timer;
-
- private var finishAutoResizeTimer:Timer;
-
- private var _url:String;
-
- private var httpDoSeekTimer:Timer;
-
- private var rtmpDoSeekTimer:Timer;
-
- private var resourceManager:IResourceManager = ResourceManager.getInstance();
-
- private var internalVideoWidth:Number = -1;
-
- private var autoResizeTimer:Timer;
-
- private var invalidSeekRecovery:Boolean;
-
- private var ns:VideoPlayerNetStream;
-
- private var delayedBufferingTimer:Timer;
-
- private var updateProgressTimer:Timer;
-
- private var _bufferTime:Number;
-
- private var _autoRewind:Boolean;
-
- private var cmdQueue:Array;
-
- public function VideoPlayer(param1:uint, param2:uint, param3:Class = null)
- {
- super(param1,param2);
- _state = DISCONNECTED;
- cachedState = _state;
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- cachedPlayheadTime = 0;
- _metadata = null;
- startingPlay = false;
- invalidSeekTime = false;
- invalidSeekRecovery = false;
- currentPos = 0;
- atEnd = false;
- cmdQueue = [];
- readyDispatched = false;
- lastUpdateTime = -1;
- sawSeekNotify = false;
- param3 = param3 == null ? DEFAULT_INCMANAGER : param3;
- updateTimeTimer = new Timer(DEFAULT_UPDATE_TIME_INTERVAL);
- updateTimeTimer.addEventListener(TimerEvent.TIMER,doUpdateTime);
- updateProgressTimer = new Timer(DEFAULT_UPDATE_PROGRESS_INTERVAL);
- updateProgressTimer.addEventListener(TimerEvent.TIMER,doUpdateProgress);
- idleTimeoutTimer = new Timer(DEFAULT_IDLE_TIMEOUT_INTERVAL,1);
- idleTimeoutTimer.addEventListener(TimerEvent.TIMER,doIdleTimeout);
- autoResizeTimer = new Timer(AUTO_RESIZE_INTERVAL);
- autoResizeTimer.addEventListener(TimerEvent.TIMER,doAutoResize);
- rtmpDoStopAtEndTimer = new Timer(RTMP_DO_STOP_AT_END_INTERVAL);
- rtmpDoStopAtEndTimer.addEventListener(TimerEvent.TIMER,rtmpDoStopAtEnd);
- rtmpDoSeekTimer = new Timer(RTMP_DO_SEEK_INTERVAL);
- rtmpDoSeekTimer.addEventListener(TimerEvent.TIMER,doSeek);
- httpDoSeekTimer = new Timer(HTTP_DO_SEEK_INTERVAL);
- httpDoSeekTimer.addEventListener(TimerEvent.TIMER,doSeek);
- finishAutoResizeTimer = new Timer(FINISH_AUTO_RESIZE_INTERVAL,1);
- finishAutoResizeTimer.addEventListener(TimerEvent.TIMER,finishAutoResize);
- delayedBufferingTimer = new Timer(HTTP_DELAYED_BUFFERING_INTERVAL);
- delayedBufferingTimer.addEventListener(TimerEvent.TIMER,doDelayedBuffering);
- httpDoSeekCount = 0;
- _isLive = false;
- autoPlay = true;
- _autoRewind = true;
- _bufferTime = 0.1;
- _volume = 100;
- _soundTransform = new SoundTransform(_volume);
- _visible = true;
- _url = "";
- }
-
- public function get playheadTime() : Number
- {
- var _loc1_:Number = ns == null ? currentPos : Number(ns.time);
- if(Boolean(_metadata) && Boolean(_metadata.audiodelay))
- {
- _loc1_ -= _metadata.audiodelay;
- if(_loc1_ < 0)
- {
- _loc1_ = 0;
- }
- }
- return _loc1_;
- }
-
- public function set playheadTime(param1:Number) : void
- {
- seek(param1);
- }
-
- public function stop() : void
- {
- if(!isXnOK())
- {
- if(_state == CONNECTION_ERROR || _ncMgr == null || _ncMgr.netConnection == null)
- {
- throw new VideoError(VideoError.NO_CONNECTION);
- }
- return;
- }
- if(_state == EXEC_QUEUED_CMD)
- {
- _state = cachedState;
- }
- else
- {
- if(!stateResponsive)
- {
- queueCmd(VideoPlayerQueuedCommand.STOP);
- return;
- }
- execQueuedCmds();
- }
- if(_state == STOPPED || ns == null)
- {
- return;
- }
- if(_ncMgr.isRTMP())
- {
- if(_autoRewind && !_isLive)
- {
- currentPos = 0;
- _play(0,0);
- _state = STOPPED;
- setState(REWINDING);
- }
- else
- {
- closeNS();
- setState(STOPPED);
- }
- }
- else
- {
- _pause(true);
- if(_autoRewind)
- {
- _seek(0);
- _state = STOPPED;
- setState(REWINDING);
- }
- else
- {
- setState(STOPPED);
- }
- }
- }
-
- override public function get videoWidth() : int
- {
- if(internalVideoWidth > 0)
- {
- return internalVideoWidth;
- }
- if(metadata != null && !isNaN(metadata.width) && !isNaN(metadata.height))
- {
- if(metadata.width == metadata.height && readyDispatched)
- {
- return super.videoWidth;
- }
- return int(metadata.width);
- }
- if(readyDispatched)
- {
- return super.videoWidth;
- }
- return -1;
- }
-
- public function get progressInterval() : uint
- {
- return updateProgressTimer.delay;
- }
-
- private function _play(... rest) : void
- {
- var _loc2_:String = null;
- rtmpDoStopAtEndTimer.reset();
- startingPlay = true;
- switch(rest.length)
- {
- case 0:
- ns.play(_ncMgr.streamName);
- break;
- case 1:
- ns.play(_ncMgr.streamName,rest[0]);
- break;
- case 2:
- ns.play(_ncMgr.streamName,rest[0],rest[1]);
- break;
- default:
- _loc2_ = resourceManager.getString("controls","badArgs");
- throw new ArgumentError(_loc2_);
- }
- }
-
- public function setScale(param1:Number, param2:Number) : void
- {
- if(param1 == super.scaleX && param2 == super.scaleY)
- {
- return;
- }
- super.scaleX = param1;
- super.scaleY = param2;
- }
-
- public function get volume() : Number
- {
- return _volume;
- }
-
- public function get soundTransform() : SoundTransform
- {
- return _soundTransform;
- }
-
- public function doUpdateTime(param1:Event) : void
- {
- var _loc3_:VideoEvent = null;
- var _loc2_:Number = playheadTime;
- switch(_state)
- {
- case STOPPED:
- case PAUSED:
- case DISCONNECTED:
- case CONNECTION_ERROR:
- if(param1 != null)
- {
- updateTimeTimer.reset();
- }
- }
- if(lastUpdateTime != _loc2_)
- {
- _loc3_ = new VideoEvent(VideoEvent.PLAYHEAD_UPDATE);
- _loc3_.state = _state;
- _loc3_.playheadTime = _loc2_;
- dispatchEvent(_loc3_);
- lastUpdateTime = _loc2_;
- }
- }
-
- public function get ncMgr() : INCManager
- {
- if(_ncMgr == null)
- {
- createINCManager();
- }
- return _ncMgr;
- }
-
- public function set progressInterval(param1:uint) : void
- {
- updateProgressTimer.delay = param1;
- }
-
- public function get stateResponsive() : Boolean
- {
- switch(_state)
- {
- case DISCONNECTED:
- case STOPPED:
- case PLAYING:
- case PAUSED:
- case BUFFERING:
- return true;
- default:
- return false;
- }
- }
-
- public function get bufferTime() : Number
- {
- return _bufferTime;
- }
-
- private function doAutoResize(param1:Event) : void
- {
- if(param1 != null)
- {
- switch(_state)
- {
- case RESIZING:
- case LOADING:
- break;
- case DISCONNECTED:
- case CONNECTION_ERROR:
- autoResizeTimer.reset();
- return;
- default:
- if(!stateResponsive)
- {
- return;
- }
- break;
- }
- if(!(videoWidth != prevVideoWidth || videoHeight != prevVideoHeight || bufferState == BUFFER_FULL || bufferState == BUFFER_FLUSH || (!!ns ? ns.time > AUTO_RESIZE_PLAYHEAD_TIMEOUT : false)))
- {
- return;
- }
- internalVideoWidth = videoWidth;
- internalVideoHeight = videoHeight;
- autoResizeTimer.reset();
- }
- setState(cachedState);
- }
-
- public function get metadata() : Object
- {
- return _metadata;
- }
-
- public function set volume(param1:Number) : void
- {
- if(param1 >= 0 && param1 <= 1)
- {
- _volume = param1;
- }
- else if(param1 < 0)
- {
- _volume = 0;
- }
- else
- {
- _volume = 1;
- }
- _soundTransform.volume = _volume;
- if(ns != null)
- {
- ns.soundTransform = _soundTransform;
- }
- }
-
- public function get isLive() : Boolean
- {
- return _isLive;
- }
-
- public function set soundTransform(param1:SoundTransform) : void
- {
- _soundTransform = param1;
- _volume = _soundTransform.volume;
- ns.soundTransform = _soundTransform;
- }
-
- public function play(param1:String = null, param2:Boolean = false, param3:Number = -1) : void
- {
- if(param1 != null)
- {
- if(_state == EXEC_QUEUED_CMD)
- {
- _state = cachedState;
- }
- else
- {
- if(!stateResponsive)
- {
- queueCmd(VideoPlayerQueuedCommand.PLAY,param1,param2,param3);
- return;
- }
- execQueuedCmds();
- }
- autoPlay = true;
- _load(param1,param2,param3);
- return;
- }
- if(!isXnOK())
- {
- if(_state == CONNECTION_ERROR || _ncMgr == null || _ncMgr.netConnection == null)
- {
- throw new VideoError(VideoError.NO_CONNECTION);
- }
- flushQueuedCmds();
- queueCmd(VideoPlayerQueuedCommand.PLAY);
- setState(LOADING);
- cachedState = LOADING;
- _ncMgr.reconnect();
- return;
- }
- if(_state == EXEC_QUEUED_CMD)
- {
- _state = cachedState;
- }
- else
- {
- if(!stateResponsive)
- {
- queueCmd(VideoPlayerQueuedCommand.PLAY,null,param2);
- return;
- }
- execQueuedCmds();
- }
- if(ns == null)
- {
- createStream();
- attachNetStream(ns);
- }
- switch(_state)
- {
- case BUFFERING:
- if(_ncMgr.isRTMP())
- {
- _play(0);
- if(atEnd)
- {
- atEnd = false;
- currentPos = 0;
- setState(REWINDING);
- }
- else if(currentPos > 0)
- {
- _seek(currentPos);
- currentPos = 0;
- }
- }
- case PLAYING:
- return;
- case STOPPED:
- if(_ncMgr.isRTMP())
- {
- if(param2)
- {
- _play(-1);
- setState(BUFFERING);
- }
- else
- {
- _play(0);
- if(atEnd)
- {
- atEnd = false;
- currentPos = 0;
- _state = BUFFERING;
- setState(REWINDING);
- }
- else if(currentPos > 0)
- {
- _seek(currentPos);
- currentPos = 0;
- setState(BUFFERING);
- }
- else
- {
- setState(BUFFERING);
- }
- }
- }
- else
- {
- _pause(false);
- if(atEnd)
- {
- atEnd = false;
- _seek(0);
- _state = BUFFERING;
- setState(REWINDING);
- }
- else if(bufferState == BUFFER_EMPTY)
- {
- setState(BUFFERING);
- }
- else
- {
- setState(PLAYING);
- }
- }
- break;
- case PAUSED:
- _pause(false);
- if(!_ncMgr.isRTMP())
- {
- if(bufferState == BUFFER_EMPTY)
- {
- setState(BUFFERING);
- }
- else
- {
- setState(PLAYING);
- }
- }
- else
- {
- setState(BUFFERING);
- }
- }
- }
-
- public function onCuePoint(param1:Object) : void
- {
- var _loc2_:MetadataEvent = new MetadataEvent(MetadataEvent.CUE_POINT);
- _loc2_.info = param1;
- dispatchEvent(_loc2_);
- }
-
- public function ncReconnected() : void
- {
- if(_ncMgr == null || _ncMgr.netConnection == null)
- {
- setState(CONNECTION_ERROR);
- }
- else
- {
- ns = null;
- _state = STOPPED;
- execQueuedCmds();
- }
- }
-
- private function recoverInvalidSeek() : void
- {
- setStateFromCachedState();
- invalidSeekTime = false;
- invalidSeekRecovery = true;
- seek(playheadTime);
- }
-
- public function rtmpOnStatus(param1:NetStatusEvent) : void
- {
- if(_state == CONNECTION_ERROR)
- {
- return;
- }
- switch(param1.info.code)
- {
- case "NetStream.Play.Stop":
- if(startingPlay)
- {
- return;
- }
- switch(_state)
- {
- case RESIZING:
- case LOADING:
- case STOPPED:
- case PAUSED:
- break;
- default:
- sawPlayStop = true;
- }
- break;
- case "NetStream.Buffer.Empty":
- switch(bufferState)
- {
- case BUFFER_FULL:
- if(sawPlayStop)
- {
- rtmpDoStopAtEnd(null);
- }
- else if(_state == PLAYING)
- {
- setState(BUFFERING);
- }
- }
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- break;
- case "NetStream.Buffer.Flush":
- if(sawSeekNotify && _state == SEEKING)
- {
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- setStateFromCachedState();
- doUpdateTime(null);
- }
- if(sawPlayStop && (bufferState == BUFFER_EMPTY || _bufferTime <= 0.1 && ns.bufferLength <= 0.1))
- {
- cachedPlayheadTime = playheadTime;
- rtmpDoStopAtEndTimer.start();
- }
- switch(bufferState)
- {
- case BUFFER_EMPTY:
- if(_state == LOADING && cachedState == PLAYING || _state == BUFFERING)
- {
- setState(PLAYING);
- }
- else if(cachedState == BUFFERING)
- {
- cachedState = PLAYING;
- }
- bufferState = BUFFER_FLUSH;
- break;
- default:
- if(_state == BUFFERING)
- {
- setStateFromCachedState();
- }
- }
- break;
- case "NetStream.Buffer.Full":
- if(sawSeekNotify && _state == SEEKING)
- {
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- setStateFromCachedState();
- doUpdateTime(null);
- }
- switch(bufferState)
- {
- case BUFFER_EMPTY:
- bufferState = BUFFER_FULL;
- if(_state == LOADING && cachedState == PLAYING || _state == BUFFERING)
- {
- setState(PLAYING);
- }
- else if(cachedState == BUFFERING)
- {
- cachedState = PLAYING;
- }
- if(rtmpDoStopAtEndTimer.running)
- {
- sawPlayStop = true;
- rtmpDoStopAtEndTimer.reset();
- }
- break;
- case BUFFER_FLUSH:
- bufferState = BUFFER_FULL;
- if(rtmpDoStopAtEndTimer.running)
- {
- sawPlayStop = true;
- rtmpDoStopAtEndTimer.reset();
- }
- }
- if(_state == BUFFERING)
- {
- setStateFromCachedState();
- }
- break;
- case "NetStream.Pause.Notify":
- break;
- case "NetStream.Unpause.Notify":
- if(_state == PAUSED)
- {
- _state = PLAYING;
- setState(BUFFERING);
- }
- else
- {
- cachedState = PLAYING;
- }
- break;
- case "NetStream.Play.Start":
- rtmpDoStopAtEndTimer.reset();
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- if(startingPlay)
- {
- startingPlay = false;
- cachedPlayheadTime = playheadTime;
- }
- else if(_state == PLAYING)
- {
- setState(BUFFERING);
- }
- break;
- case "NetStream.Play.Reset":
- rtmpDoStopAtEndTimer.reset();
- if(_state == REWINDING)
- {
- rtmpDoSeekTimer.reset();
- if(playheadTime == 0 || playheadTime < cachedPlayheadTime)
- {
- setStateFromCachedState();
- }
- else
- {
- cachedPlayheadTime = playheadTime;
- rtmpDoSeekTimer.start();
- }
- }
- break;
- case "NetStream.Seek.Notify":
- if(playheadTime != cachedPlayheadTime)
- {
- setStateFromCachedState();
- doUpdateTime(null);
- }
- else
- {
- sawSeekNotify = true;
- if(!rtmpDoSeekTimer.running)
- {
- rtmpDoSeekTimer.start();
- }
- }
- break;
- case "Netstream.Play.UnpublishNotify":
- case "Netstream.Play.PublishNotify":
- break;
- case "NetStream.Play.StreamNotFound":
- if(!_ncMgr.connectAgain())
- {
- setState(CONNECTION_ERROR);
- }
- break;
- case "NetStream.Play.Failed":
- case "NetStream.Failed":
- setState(CONNECTION_ERROR);
- }
- }
-
- public function get totalTime() : Number
- {
- return streamLength;
- }
-
- public function get autoRewind() : Boolean
- {
- return _autoRewind;
- }
-
- override public function set height(param1:Number) : void
- {
- setSize(width,param1);
- }
-
- private function createINCManager() : void
- {
- var _loc1_:Class = ncMgrClassName == null ? DEFAULT_INCMANAGER : ncMgrClassName;
- _ncMgr = new _loc1_();
- _ncMgr.videoPlayer = this;
- }
-
- private function setState(param1:String) : void
- {
- if(param1 == _state)
- {
- return;
- }
- cachedState = _state;
- cachedPlayheadTime = playheadTime;
- _state = param1;
- var _loc2_:String = _state;
- var _loc3_:VideoEvent = new VideoEvent(VideoEvent.STATE_CHANGE);
- _loc3_.state = _loc2_;
- _loc3_.playheadTime = playheadTime;
- dispatchEvent(_loc3_);
- if(!readyDispatched)
- {
- switch(_loc2_)
- {
- case STOPPED:
- case PLAYING:
- case PAUSED:
- case BUFFERING:
- readyDispatched = true;
- _loc3_ = new VideoEvent(VideoEvent.READY);
- _loc3_.state = _loc2_;
- _loc3_.playheadTime = playheadTime;
- dispatchEvent(_loc3_);
- }
- }
- switch(cachedState)
- {
- case REWINDING:
- _loc3_ = new VideoEvent(VideoEvent.REWIND);
- _loc3_.state = _loc2_;
- _loc3_.playheadTime = playheadTime;
- dispatchEvent(_loc3_);
- if(_ncMgr.isRTMP() && _loc2_ == STOPPED)
- {
- closeNS();
- }
- }
- switch(_loc2_)
- {
- case STOPPED:
- case PAUSED:
- if(_ncMgr.isRTMP() && !idleTimeoutTimer.running)
- {
- idleTimeoutTimer.start();
- }
- break;
- case SEEKING:
- case REWINDING:
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- case PLAYING:
- case BUFFERING:
- if(!updateTimeTimer.running)
- {
- updateTimeTimer.start();
- }
- case LOADING:
- case RESIZING:
- idleTimeoutTimer.reset();
- }
- execQueuedCmds();
- }
-
- public function httpOnStatus(param1:NetStatusEvent) : void
- {
- switch(param1.info.code)
- {
- case "NetStream.Play.Stop":
- delayedBufferingTimer.reset();
- if(invalidSeekTime)
- {
- recoverInvalidSeek();
- }
- else
- {
- switch(_state)
- {
- case PLAYING:
- case BUFFERING:
- case SEEKING:
- httpDoStopAtEnd();
- }
- }
- break;
- case "NetStream.Seek.InvalidTime":
- if(invalidSeekRecovery)
- {
- invalidSeekTime = false;
- invalidSeekRecovery = false;
- setState(cachedState);
- seek(0);
- }
- else
- {
- recoverInvalidSeek();
- }
- break;
- case "NetStream.Buffer.Empty":
- bufferState = BUFFER_EMPTY;
- if(_state == PLAYING)
- {
- delayedBufferingTimer.start();
- }
- break;
- case "NetStream.Buffer.Full":
- case "NetStream.Buffer.Flush":
- delayedBufferingTimer.reset();
- bufferState = BUFFER_FULL;
- if(_state == LOADING && cachedState == PLAYING || _state == BUFFERING)
- {
- setState(PLAYING);
- }
- else if(cachedState == BUFFERING)
- {
- cachedState = PLAYING;
- }
- break;
- case "NetStream.Seek.Notify":
- invalidSeekRecovery = false;
- switch(_state)
- {
- case SEEKING:
- case REWINDING:
- if(!httpDoSeekTimer.running)
- {
- httpDoSeekCount = 0;
- httpDoSeekTimer.start();
- }
- }
- break;
- case "NetStream.Play.StreamNotFound":
- setState(CONNECTION_ERROR);
- }
- }
-
- public function set bufferTime(param1:Number) : void
- {
- _bufferTime = param1;
- if(ns != null)
- {
- ns.bufferTime = _bufferTime;
- }
- }
-
- public function onMetaData(param1:Object) : void
- {
- if(_metadata != null)
- {
- return;
- }
- _metadata = param1;
- if(isNaN(streamLength) || streamLength <= 0)
- {
- streamLength = param1.duration;
- }
- if(isNaN(internalVideoWidth) || internalVideoWidth <= 0)
- {
- internalVideoWidth = param1.width;
- }
- if(isNaN(internalVideoHeight) || internalVideoHeight <= 0)
- {
- internalVideoHeight = param1.height;
- }
- var _loc2_:MetadataEvent = new MetadataEvent(MetadataEvent.METADATA_RECEIVED);
- _loc2_.info = param1;
- dispatchEvent(_loc2_);
- }
-
- private function setStateFromCachedState() : void
- {
- switch(cachedState)
- {
- case PLAYING:
- case PAUSED:
- setState(cachedState);
- break;
- case BUFFERING:
- if(bufferState == BUFFER_EMPTY)
- {
- setState(BUFFERING);
- }
- else
- {
- setState(cachedState);
- }
- break;
- default:
- setState(STOPPED);
- }
- }
-
- public function get bytesLoaded() : int
- {
- if(ns == null || _ncMgr.isRTMP())
- {
- return -1;
- }
- return ns.bytesLoaded;
- }
-
- private function doIdleTimeout(param1:Event) : void
- {
- idleTimeoutTimer.reset();
- close();
- }
-
- private function doDelayedBuffering(param1:Event) : void
- {
- switch(_state)
- {
- case LOADING:
- case RESIZING:
- break;
- case PLAYING:
- delayedBufferingTimer.reset();
- setState(BUFFERING);
- break;
- default:
- delayedBufferingTimer.reset();
- }
- }
-
- public function get url() : String
- {
- return _url;
- }
-
- private function queueCmd(param1:uint, param2:String = null, param3:Boolean = false, param4:Number = 0) : void
- {
- cmdQueue.push(new VideoPlayerQueuedCommand(param1,param2,param3,param4));
- }
-
- override public function get visible() : Boolean
- {
- _visible = super.visible;
- return _visible;
- }
-
- private function rtmpDoSeek() : void
- {
- if(_state != REWINDING && _state != SEEKING)
- {
- rtmpDoSeekTimer.reset();
- sawSeekNotify = false;
- }
- else if(playheadTime != cachedPlayheadTime)
- {
- rtmpDoSeekTimer.reset();
- sawSeekNotify = false;
- setStateFromCachedState();
- doUpdateTime(null);
- }
- }
-
- private function setUpStream() : void
- {
- if(!isNaN(_ncMgr.streamLength) && _ncMgr.streamLength >= 0)
- {
- streamLength = _ncMgr.streamLength;
- }
- if(!isNaN(_ncMgr.streamWidth) && _ncMgr.streamWidth >= 0)
- {
- internalVideoWidth = _ncMgr.streamWidth;
- }
- else
- {
- internalVideoWidth = -1;
- }
- if(!isNaN(_ncMgr.streamHeight) && _ncMgr.streamHeight >= 0)
- {
- internalVideoHeight = _ncMgr.streamHeight;
- }
- else
- {
- internalVideoHeight = -1;
- }
- if(autoPlay)
- {
- if(!_ncMgr.isRTMP())
- {
- cachedState = BUFFERING;
- _play();
- }
- else if(_isLive)
- {
- cachedState = BUFFERING;
- _play(-1);
- }
- else
- {
- cachedState = BUFFERING;
- _play(0);
- }
- }
- else
- {
- cachedState = STOPPED;
- if(_ncMgr.isRTMP())
- {
- _play(-2,0);
- }
- else
- {
- _play();
- _pause(true);
- _seek(0);
- }
- }
- autoResizeTimer.reset();
- autoResizeTimer.start();
- }
-
- public function seek(param1:Number) : void
- {
- if(invalidSeekTime)
- {
- return;
- }
- if(isNaN(param1) || param1 < 0)
- {
- throw new VideoError(VideoError.INVALID_SEEK);
- }
- if(!isXnOK())
- {
- if(_state == CONNECTION_ERROR || _ncMgr == null || _ncMgr.netConnection == null)
- {
- throw new VideoError(VideoError.NO_CONNECTION);
- }
- flushQueuedCmds();
- queueCmd(VideoPlayerQueuedCommand.SEEK,null,false,param1);
- setState(LOADING);
- cachedState = LOADING;
- _ncMgr.reconnect();
- return;
- }
- if(_state == EXEC_QUEUED_CMD)
- {
- _state = cachedState;
- }
- else
- {
- if(!stateResponsive)
- {
- queueCmd(VideoPlayerQueuedCommand.SEEK,null,false,param1);
- return;
- }
- execQueuedCmds();
- }
- if(ns == null)
- {
- createStream();
- attachNetStream(ns);
- }
- if(atEnd && param1 <= playheadTime)
- {
- atEnd = false;
- }
- switch(_state)
- {
- case PLAYING:
- _state = BUFFERING;
- case BUFFERING:
- case PAUSED:
- _seek(param1);
- setState(SEEKING);
- break;
- case STOPPED:
- if(_ncMgr.isRTMP())
- {
- _play(0);
- _pause(true);
- }
- _seek(param1);
- _state = PAUSED;
- setState(SEEKING);
- }
- }
-
- public function doUpdateProgress(param1:Event) : void
- {
- if(ns == null)
- {
- return;
- }
- if(ns.bytesTotal >= 0 && ns.bytesLoaded != _priorBytesLoaded)
- {
- dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS,false,false,ns.bytesLoaded,ns.bytesTotal));
- }
- if(_state == DISCONNECTED || _state == CONNECTION_ERROR || ns.bytesLoaded == ns.bytesTotal)
- {
- updateProgressTimer.reset();
- }
- _priorBytesLoaded = ns.bytesLoaded;
- }
-
- override public function get videoHeight() : int
- {
- if(internalVideoHeight > 0)
- {
- return internalVideoHeight;
- }
- if(metadata != null && !isNaN(metadata.width) && !isNaN(metadata.height))
- {
- if(metadata.width == metadata.height && readyDispatched)
- {
- return super.videoHeight;
- }
- return int(metadata.height);
- }
- if(readyDispatched)
- {
- return super.videoHeight;
- }
- return -1;
- }
-
- override public function set width(param1:Number) : void
- {
- setSize(param1,height);
- }
-
- private function _seek(param1:Number) : void
- {
- rtmpDoStopAtEndTimer.reset();
- var _loc2_:Number = Math.round(param1 * 1000) / 1000;
- if(_metadata && _metadata.audiodelay && param1 + _metadata.audiodelay < streamLength)
- {
- param1 += _metadata.audiodelay;
- }
- ns.seek(param1);
- invalidSeekTime = false;
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- sawSeekNotify = false;
- }
-
- public function get isRTMP() : Boolean
- {
- if(_ncMgr == null)
- {
- return true;
- }
- return _ncMgr.isRTMP();
- }
-
- public function get state() : String
- {
- return _state;
- }
-
- public function get bytesTotal() : int
- {
- if(ns == null || _ncMgr.isRTMP())
- {
- return -1;
- }
- return ns.bytesTotal;
- }
-
- public function set autoRewind(param1:Boolean) : void
- {
- _autoRewind = param1;
- }
-
- override public function set scaleX(param1:Number) : void
- {
- setScale(param1,this.scaleY);
- }
-
- private function finishAutoResize(param1:Event) : void
- {
- finishAutoResizeTimer.reset();
- if(stateResponsive)
- {
- return;
- }
- super.visible = _visible;
- _soundTransform.volume = _volume;
- ns.soundTransform = _soundTransform;
- if(autoPlay)
- {
- if(_ncMgr.isRTMP())
- {
- if(!_isLive)
- {
- currentPos = 0;
- _play(0);
- }
- if(_state == RESIZING)
- {
- setState(LOADING);
- cachedState = PLAYING;
- }
- }
- else
- {
- _pause(false);
- cachedState = PLAYING;
- }
- }
- else
- {
- setState(STOPPED);
- }
- }
-
- private function isXnOK() : Boolean
- {
- if(_state == LOADING)
- {
- return true;
- }
- if(_state == CONNECTION_ERROR)
- {
- return false;
- }
- if(_state != DISCONNECTED)
- {
- if(_ncMgr == null || _ncMgr.netConnection == null || !_ncMgr.netConnection.connected)
- {
- setState(DISCONNECTED);
- return false;
- }
- return true;
- }
- return false;
- }
-
- private function doSeek(param1:Event) : void
- {
- var _loc2_:Boolean = _state == REWINDING || _state == SEEKING;
- if(_loc2_ && httpDoSeekCount < HTTP_DO_SEEK_MAX_COUNT && (cachedPlayheadTime == playheadTime || invalidSeekTime))
- {
- ++httpDoSeekCount;
- return;
- }
- httpDoSeekCount = 0;
- httpDoSeekTimer.reset();
- if(!_loc2_)
- {
- return;
- }
- if(invalidSeekTime)
- {
- recoverInvalidSeek();
- }
- else
- {
- setStateFromCachedState();
- doUpdateTime(null);
- }
- }
-
- private function createStream() : void
- {
- ns = new VideoPlayerNetStream(_ncMgr.netConnection,this);
- ns.bufferTime = _bufferTime;
- ns.soundTransform = _soundTransform;
- ns.addEventListener(NetStatusEvent.NET_STATUS,_ncMgr.isRTMP() ? rtmpOnStatus : httpOnStatus);
- attachNetStream(ns);
- }
-
- public function setSize(param1:Number, param2:Number) : void
- {
- if(param1 == width && param2 == height)
- {
- return;
- }
- super.width = param1;
- super.height = param2;
- }
-
- private function flushQueuedCmds() : void
- {
- while(cmdQueue.length > 0)
- {
- cmdQueue.pop();
- }
- }
-
- override public function set scaleY(param1:Number) : void
- {
- setScale(this.scaleX,param1);
- }
-
- public function ncConnected() : void
- {
- if(_ncMgr == null || _ncMgr.netConnection == null)
- {
- setState(CONNECTION_ERROR);
- }
- else
- {
- createStream();
- setUpStream();
- }
- }
-
- private function closeNS(param1:Boolean = true) : void
- {
- if(ns != null)
- {
- if(param1)
- {
- updateTimeTimer.reset();
- doUpdateTime(null);
- currentPos = ns.time;
- }
- ns.removeEventListener(NetStatusEvent.NET_STATUS,httpOnStatus);
- ns.removeEventListener(NetStatusEvent.NET_STATUS,rtmpOnStatus);
- ns.close();
- ns = null;
- }
- }
-
- private function rtmpDoStopAtEnd(param1:TimerEvent) : void
- {
- if(param1 != null)
- {
- switch(_state)
- {
- case DISCONNECTED:
- case CONNECTION_ERROR:
- rtmpDoStopAtEndTimer.reset();
- return;
- default:
- if(cachedPlayheadTime != playheadTime)
- {
- cachedPlayheadTime = playheadTime;
- return;
- }
- rtmpDoStopAtEndTimer.reset();
- }
- }
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- atEnd = true;
- setState(STOPPED);
- if(_state != STOPPED)
- {
- return;
- }
- doUpdateTime(null);
- if(_state != STOPPED)
- {
- return;
- }
- var _loc2_:VideoEvent = new VideoEvent(VideoEvent.COMPLETE);
- _loc2_.state = _state;
- _loc2_.playheadTime = playheadTime;
- dispatchEvent(_loc2_);
- if(_state != STOPPED)
- {
- return;
- }
- if(_autoRewind && !_isLive && playheadTime != 0)
- {
- atEnd = false;
- currentPos = 0;
- _play(0,0);
- setState(REWINDING);
- }
- else
- {
- closeNS();
- }
- }
-
- public function set idleTimeout(param1:uint) : void
- {
- idleTimeoutTimer.delay = param1;
- }
-
- public function set playheadUpdateInterval(param1:uint) : void
- {
- updateTimeTimer.delay = param1;
- }
-
- private function _load(param1:String, param2:Boolean, param3:Number) : void
- {
- if(prevVideoWidth == -1)
- {
- if(videoWidth >= 0)
- {
- prevVideoWidth = videoWidth;
- }
- else
- {
- prevVideoWidth = 0;
- }
- }
- if(prevVideoHeight == -1)
- {
- if(videoHeight >= 0)
- {
- prevVideoHeight = videoHeight;
- }
- else
- {
- prevVideoHeight = 0;
- }
- }
- cachedPlayheadTime = 0;
- bufferState = BUFFER_EMPTY;
- sawPlayStop = false;
- _metadata = null;
- startingPlay = false;
- invalidSeekRecovery = false;
- invalidSeekTime = false;
- _isLive = param2;
- _url = param1;
- currentPos = 0;
- streamLength = param3;
- atEnd = false;
- internalVideoWidth = -1;
- internalVideoHeight = -1;
- readyDispatched = false;
- lastUpdateTime = -1;
- sawSeekNotify = false;
- updateTimeTimer.reset();
- updateProgressTimer.reset();
- idleTimeoutTimer.reset();
- autoResizeTimer.reset();
- rtmpDoStopAtEndTimer.reset();
- rtmpDoSeekTimer.reset();
- httpDoSeekTimer.reset();
- finishAutoResizeTimer.reset();
- delayedBufferingTimer.reset();
- closeNS(false);
- if(_ncMgr == null)
- {
- createINCManager();
- }
- var _loc4_:Boolean = _ncMgr.connectToURL(_url);
- setState(LOADING);
- cachedState = LOADING;
- if(_loc4_)
- {
- createStream();
- setUpStream();
- }
- if(!_ncMgr.isRTMP())
- {
- updateProgressTimer.start();
- }
- }
-
- public function get playheadUpdateInterval() : uint
- {
- return updateTimeTimer.delay;
- }
-
- override public function set visible(param1:Boolean) : void
- {
- _visible = param1;
- super.visible = _visible;
- }
-
- public function load(param1:String, param2:Boolean = false, param3:Number = -1) : void
- {
- var _loc4_:String = null;
- if(param1 == null)
- {
- _loc4_ = resourceManager.getString("controls","nullURL");
- throw new ArgumentError(_loc4_);
- }
- if(_state == EXEC_QUEUED_CMD)
- {
- _state = cachedState;
- }
- else
- {
- if(!stateResponsive)
- {
- queueCmd(VideoPlayerQueuedCommand.LOAD,param1,param2,param3);
- return;
- }
- execQueuedCmds();
- }
- autoPlay = false;
- _load(param1,param2,param3);
- }
-
- private function httpDoStopAtEnd() : void
- {
- atEnd = true;
- if(isNaN(streamLength) || streamLength <= 0)
- {
- streamLength = ns.time;
- }
- _pause(true);
- setState(STOPPED);
- if(_state != STOPPED)
- {
- return;
- }
- doUpdateTime(null);
- if(_state != STOPPED)
- {
- return;
- }
- var _loc1_:VideoEvent = new VideoEvent(VideoEvent.COMPLETE);
- _loc1_.state = _state;
- _loc1_.playheadTime = playheadTime;
- dispatchEvent(_loc1_);
- if(_state != STOPPED)
- {
- return;
- }
- if(_autoRewind)
- {
- atEnd = false;
- _pause(true);
- _seek(0);
- setState(REWINDING);
- }
- }
-
- public function get idleTimeout() : uint
- {
- return idleTimeoutTimer.delay;
- }
-
- public function pause() : void
- {
- if(!isXnOK())
- {
- if(_state == CONNECTION_ERROR || _ncMgr == null || _ncMgr.netConnection == null)
- {
- throw new VideoError(VideoError.NO_CONNECTION);
- }
- return;
- }
- if(_state == EXEC_QUEUED_CMD)
- {
- _state = cachedState;
- }
- else
- {
- if(!stateResponsive)
- {
- queueCmd(VideoPlayerQueuedCommand.PAUSE);
- return;
- }
- execQueuedCmds();
- }
- if(_state == PAUSED || _state == STOPPED || ns == null)
- {
- return;
- }
- _pause(true);
- setState(PAUSED);
- }
-
- private function execQueuedCmds() : void
- {
- var _loc1_:VideoPlayerQueuedCommand = null;
- while(cmdQueue.length > 0 && (stateResponsive || _state == CONNECTION_ERROR) && (cmdQueue[0].url != null || _state != DISCONNECTED && _state != CONNECTION_ERROR))
- {
- _loc1_ = cmdQueue.shift();
- cachedState = _state;
- _state = EXEC_QUEUED_CMD;
- switch(_loc1_.type)
- {
- case VideoPlayerQueuedCommand.PLAY:
- play(_loc1_.url,_loc1_.isLive,_loc1_.time);
- break;
- case VideoPlayerQueuedCommand.LOAD:
- load(_loc1_.url,_loc1_.isLive,_loc1_.time);
- break;
- case VideoPlayerQueuedCommand.PAUSE:
- pause();
- break;
- case VideoPlayerQueuedCommand.STOP:
- stop();
- break;
- case VideoPlayerQueuedCommand.SEEK:
- seek(_loc1_.time);
- break;
- }
- }
- }
-
- private function _pause(param1:Boolean) : void
- {
- rtmpDoStopAtEndTimer.reset();
- if(param1)
- {
- ns.pause();
- }
- else
- {
- ns.resume();
- }
- }
-
- public function close() : void
- {
- closeNS();
- if(_ncMgr != null && _ncMgr.isRTMP())
- {
- _ncMgr.close();
- }
- setState(DISCONNECTED);
- var _loc1_:VideoEvent = new VideoEvent(VideoEvent.CLOSE);
- _loc1_.state = _state;
- _loc1_.playheadTime = playheadTime;
- dispatchEvent(_loc1_);
- }
- }
- }
-
- import flash.net.NetConnection;
- import flash.net.NetStream;
-
- dynamic class VideoPlayerNetStream extends NetStream
- {
- private var videoPlayer:VideoPlayer;
-
- public function VideoPlayerNetStream(param1:NetConnection, param2:VideoPlayer)
- {
- super(param1);
- this.videoPlayer = param2;
- }
-
- public function onCuePoint(param1:Object, ... rest) : void
- {
- videoPlayer.onCuePoint(param1);
- }
-
- public function onPlayStatus(... rest) : void
- {
- }
-
- public function onMetaData(param1:Object, ... rest) : void
- {
- videoPlayer.onMetaData(param1);
- }
- }
-