Changeset 807


Ignore:
Timestamp:
01/26/10 21:36:50 (3 years ago)
Author:
pablo
Message:
  • Fixed some bugs in RTMP dynamic / load balanced streams
  • Prevent fullscreen events from firing multiple resizes
  • PlaylistItemLevels can include streamer
Location:
trunk/fl5
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/fl5/src/com/longtailvideo/jwplayer/media/RTMPMediaProvider.as

    r806 r807  
    4141                /** The currently playing RTMP stream. **/ 
    4242                private var _currentFile:String; 
    43                 /** The currently active RTMP stream. **/ 
    44                 private var _currentStream:String; 
    4543        /** ID for the position interval. **/ 
    4644        private var _positionInterval:Number; 
    47         /** Loader instance that loads the XML file. **/ 
    48         private var _xmlLoader:AssetLoader; 
     45        /** Loaders for loading SMIL files. **/ 
     46        private var _xmlLoaders:Dictionary; 
    4947        /** NetStream instance that handles the stream IO. **/ 
    5048        private var _stream:NetStream; 
     
    7977            _connection.objectEncoding = ObjectEncoding.AMF0; 
    8078            _connection.client = new NetClient(this); 
    81             _xmlLoader = new AssetLoader(); 
    82             _xmlLoader.addEventListener(Event.COMPLETE, loaderHandler); 
    83             _xmlLoader.addEventListener(ErrorEvent.ERROR, errorHandler); 
     79                        _xmlLoaders = new Dictionary(); 
    8480            _transformer = new SoundTransform(); 
    8581            _video = new Video(320, 240); 
     
    126122            Configger.saveCookie('bandwidth', bdw); 
    127123            if (item.levels.length > 0 && item.getLevel(config.bandwidth, config.width) != item.currentLevel) { 
    128                                 item.setLevel(item.getLevel(config.bandwidth, config.width)); 
    129124                swap(item.currentLevel); 
    130125            } 
     
    152147            _position = 0; 
    153148                        _bufferFull = false; 
    154             if (item.levels.length > 0) { 
    155                 loadLevelSync(); 
    156             } 
    157149            _timeoffset = item.start; 
     150                        if (item.levels.length > 0) { item.setLevel(item.getLevel(config.bandwidth, config.width)); } 
    158151            clearInterval(_positionInterval); 
    159152                        setState(PlayerState.BUFFERING); 
    160153                        sendBufferEvent(0); 
    161154            if (getConfigProperty('loadbalance')) { 
    162                                 if (!item.hasOwnProperty('smil')) { item.smil = []; } 
    163                                 item.smilIndex = item.levels.length > 0 ? item.currentLevel : 0;  
    164                 item.smil[item.smilIndex] = item.file; 
    165                 _xmlLoader.load(item.file, XML); 
    166             } else { 
     155                                loadSmil(); 
     156                        } else { 
    167157                                finishLoad(); 
    168             } 
    169         } 
    170  
     158                        } 
     159        } 
     160 
     161                /** Load a SMIL file for load-balancing **/ 
     162                private function loadSmil():void { 
     163                        if (!item.hasOwnProperty('smil')) {  
     164                                item.smil = [];                          
     165                                if (item.levels.length > 0) { 
     166                                        for (var i:Number = 0; i < item.levels.length; i++) { 
     167                                                item.smil[i] = (item.levels[i] as PlaylistItemLevel).file; 
     168                                        } 
     169                                } else { 
     170                                        item.smil[0] = item.file; 
     171                                } 
     172                        }  
     173                         
     174                        var smilFile:String = item.levels.length > 0 ? item.smil[item.currentLevel] : item.smil[0]; 
     175                         
     176                        var loader:AssetLoader = new AssetLoader(); 
     177                        loader.addEventListener(Event.COMPLETE, loaderHandler); 
     178                        loader.addEventListener(ErrorEvent.ERROR, errorHandler); 
     179                        _xmlLoaders[loader] = smilFile; 
     180                        loader.load(smilFile, XML); 
     181                } 
     182                 
    171183                /** Finalizes the loading process **/ 
    172184                private function finishLoad():void { 
    173                         var ext:String = item.file.substr(-4); 
    174                         if (ext == '.mp3'){ 
     185                        if (item.file.substr(-4) == '.mp3') { 
    175186                                media = null; 
    176                         } else { 
     187                        } else if (!media) { 
    177188                                media = _video; 
    178189                        } 
    179                         if (item.streamer != _currentStream || !_isStreaming) { 
    180                                 _currentStream = item.streamer; 
    181                                 sendMediaEvent(MediaEvent.JWPLAYER_MEDIA_LOADED); 
    182                                 _connection.connect(item.streamer); 
    183                         } else { 
    184                                 seek(_timeoffset); 
    185                         } 
    186                 } 
    187                  
    188         /** Make sure the selected level is actually the item.file. **/ 
    189         private function loadLevelSync():void { 
    190             for (var i:Number = 0; i < item.levels.length; i++) { 
    191                 if (item.file == (item.levels[i] as PlaylistItemLevel).file) { 
    192                     item.setLevel(i); 
    193                     break; 
    194                 } 
    195             } 
    196         } 
    197  
     190                        sendMediaEvent(MediaEvent.JWPLAYER_MEDIA_LOADED); 
     191                        _connection.connect(item.streamer); 
     192                } 
     193                 
    198194        /** Get the streamer / file from the loadbalancing XML. **/ 
    199195        private function loaderHandler(evt:Event):void { 
    200196            var xml:XML = XML((evt.target as AssetLoader).loadedObject); 
    201             item.streamer = xml.head.meta.@base.toString(); 
    202197                        var fileLocation:String = xml.body.video.@src.toString(); 
     198                        var smilLocation:String = _xmlLoaders[evt.target]; 
     199                        delete _xmlLoaders[evt.target]; 
    203200                        if (item.levels.length > 0) { 
    204                                 (item.levels[item.smilIndex] as PlaylistItemLevel).file = fileLocation; 
     201                                var level:PlaylistItemLevel = item.levels[(item.smil as Array).indexOf(smilLocation)] as PlaylistItemLevel;  
     202                                level.streamer = xml.head.meta.@base.toString(); 
     203                                level.file = fileLocation; 
    205204                        } else { 
    206                 item.file = fileLocation; 
     205                                item.streamer = xml.head.meta.@base.toString(); 
     206                        item.file = fileLocation; 
    207207                        } 
    208208                        finishLoad(); 
     
    239239                setStream(); 
    240240            } 
    241             if (dat.code == 'NetStream.Play.TransitionComplete'|| (dat.code == 'NetStream.Play.Transition' && dat.reason == 'NetStream.Transition.Success')) { 
     241            if (dat.code == 'NetStream.Play.TransitionComplete') { 
    242242                                if (_transitionLevel >= 0) { 
    243                                         Logger.log("Transition to level " + item.currentLevel + "complete"); 
     243                                        Logger.log("Transition to level " + item.currentLevel + " complete"); 
    244244                        _transitionLevel = -1; 
    245245                                } 
     
    256256                         
    257257                        clearInterval(_positionInterval); 
    258                         setState(PlayerState.PAUSED); 
     258                        super.pause(); 
    259259            if (_stream) {  
    260260                                Logger.log("NetStream.pause()"); 
     
    265265        /** Resume playing. **/ 
    266266        override public function play():void { 
    267             if (_stream) { 
     267                        clearInterval(_positionInterval); 
     268            if (state == PlayerState.PAUSED) { 
    268269                                Logger.log("NetStream.resume()"); 
    269270                                _stream.resume();                                
    270271                        } 
    271                         clearInterval(_positionInterval); 
    272             _positionInterval = setInterval(positionInterval, 100); 
    273                         setState(PlayerState.PLAYING); 
     272                        super.play(); 
     273                        _positionInterval = setInterval(positionInterval, 100); 
    274274        } 
    275275 
     
    307307                        if (state == PlayerState.PLAYING) { 
    308308                if (item.levels.length > 0 && item.currentLevel != item.getLevel(config.bandwidth, config.width)) { 
    309                                         item.setLevel(item.getLevel(config.bandwidth, config.width)); 
    310309                        if (_dynamic) { 
    311                             swap(item.currentLevel); 
     310                            swap(item.getLevel(config.bandwidth, config.width)); 
    312311                        } else { 
    313312                            seek(position); 
     
    319318        /** Seek to a new position. **/ 
    320319        override public function seek(pos:Number):void { 
    321             _timeoffset = pos; 
     320            super.seek(pos); 
    322321            _transitionLevel = -1; 
     322                        _timeoffset = pos; 
    323323            clearInterval(_positionInterval); 
    324324            clearInterval(_bandwidthInterval); 
     
    331331                } 
    332332            } 
    333                         if (state != PlayerState.PLAYING) { 
     333                        if (state == PlayerState.PAUSED) { 
    334334                                play(); 
    335335                        } 
     
    343343                                        try { 
    344344                        _stream.play(getID(item.file)); 
    345                                         } catch(e:Error) {} 
     345                                        } catch(e:Error) { 
     346                                                Logger.log("Error: " + e.message); 
     347                                        } 
    346348                } 
    347                 if (_timeoffset >= 0 || state == PlayerState.IDLE) { 
     349                if (_timeoffset > 0 || state == PlayerState.IDLE) { 
    348350                    if (_stream) { 
    349351                                                Logger.log("NetStream.seek(" + _timeoffset + ")"); 
     
    378380                case 'NetConnection.Connect.Success': 
    379381                    if (evt.info.secureToken != undefined) { 
    380                         _connection.call("secureTokenResponse", null, TEA.decrypt(evt.info.secureToken, 
    381                                                                                  config.token)); 
     382                        _connection.call("secureTokenResponse", null, TEA.decrypt(evt.info.secureToken, 
     383                                                                                  config.token)); 
    382384                    } 
    383385                    if (evt.info.data) { 
     
    389391                    } else { 
    390392                        if (item.levels.length > 0) { 
    391                             if (_dynamic || _bandwidthInterval) { 
     393                            if (_dynamic || _bandwidthChecked) { 
    392394                                setStream(); 
    393395                            } else { 
     
    478480                                /** Replace file values with original redirects **/ 
    479481                                if (item.levels.length > 0) { 
    480                                         for (var i:Number = 0; i < item.levels.length; i++) { 
    481                                                 if (i < item.smil.length && item.smil[i]) { 
    482                                                         (item.levels[i] as PlaylistItemLevel).file = item.smil[i]; 
     482                                        for each (var level:PlaylistItemLevel in item.levels) {  
     483                                                for (var i:Number = 0; i < (item.smil as Array).length; i++) { 
     484                                                        level.file = item.smil[i]; 
    483485                                                } 
    484486                                        } 
     
    503505            } else { 
    504506                _transitionLevel = newLevel; 
    505                 Logger.log('transition to level ' + item.currentLevel + ' initiated'); 
     507                                item.setLevel(newLevel); 
     508                Logger.log('transition to level ' + newLevel + ' initiated'); 
    506509                var nso:NetStreamPlayOptions = new NetStreamPlayOptions(); 
    507510                nso.streamName = getID(item.file); 
     
    519522                _stream.soundTransform = _transformer; 
    520523            } 
     524                         
     525                        super.setVolume(vol); 
    521526        } 
    522527                 
  • trunk/fl5/src/com/longtailvideo/jwplayer/model/PlaylistItem.as

    r805 r807  
    1515                public var mediaid:String               = ""; 
    1616                public var start:Number                 = 0; 
    17                 public var streamer:String              = ""; 
    1817                public var tags:String                  = ""; 
    1918                public var title:String                 = ""; 
     
    2120                 
    2221                protected var _file:String                      = ""; 
     22                protected var _streamer:String          = ""; 
    2323                protected var _currentLevel:Number      = -1; 
    2424                protected var _levels:Array                     = []; 
     
    3232                                        for each (var level:Object in levels) { 
    3333                                                if (level['file'] && level['bitrate'] && level['width']) { 
    34                                                         addLevel(new PlaylistItemLevel(level['file'], level['bitrate'], level['width'])); 
     34                                                        addLevel(new PlaylistItemLevel(level['file'], level['bitrate'], level['width'], level['streamer'])); 
    3535                                                } 
    3636                                        } 
     
    4444                public function get file():String { 
    4545                        if (_levels.length > 0 && _currentLevel > -1 && _currentLevel < _levels.length) { 
    46                                 return (_levels[_currentLevel] as PlaylistItemLevel).file; 
     46                                var level:PlaylistItemLevel = _levels[_currentLevel] as PlaylistItemLevel;  
     47                                return level.file ? level.file : _file; 
    4748                        } else { 
    4849                                return _file; 
     
    5354                public function set file(f:String):void { 
    5455                        _file = f; 
     56                } 
     57                 
     58                /** Streamer property is now a getter, to take levels into account **/ 
     59                public function get streamer():String { 
     60                        if (_levels.length > 0 && _currentLevel > -1 && _currentLevel < _levels.length) { 
     61                                var level:PlaylistItemLevel = _levels[_currentLevel] as PlaylistItemLevel;  
     62                                return level.streamer ? level.streamer : _streamer; 
     63                        } else { 
     64                                return _streamer; 
     65                        } 
     66                } 
     67                 
     68                /** Streamer setter.  Note, if levels are defined, this will be ignored. **/ 
     69                public function set streamer(s:String):void { 
     70                        _streamer = s; 
    5571                } 
    5672                 
  • trunk/fl5/src/com/longtailvideo/jwplayer/model/PlaylistItemLevel.as

    r805 r807  
    66                public var bitrate:Number       = 0; 
    77                public var width:Number         = 0; 
     8                public var streamer:String      = ""; 
    89                 
    910                /** 
     
    1213                 * @param width - The width of the file 
    1314                 */ 
    14                 public function PlaylistItemLevel(file:String, bitrate:Number, width:Number) { 
     15                public function PlaylistItemLevel(file:String, bitrate:Number, width:Number, streamer:String="") { 
    1516                        this.file = file; 
     17                        this.streamer = streamer; 
    1618                        this.bitrate = bitrate; 
    1719                        this.width = width; 
  • trunk/fl5/src/com/longtailvideo/jwplayer/player/PlayerVersion.as

    r806 r807  
    33         
    44        public class PlayerVersion { 
    5                 protected static var _version:String = "5.1.806"; 
     5                protected static var _version:String = "5.1.807"; 
    66                 
    77                public static function get version():String { 
  • trunk/fl5/src/com/longtailvideo/jwplayer/utils/NetClient.as

    r806 r807  
    9595                 
    9696                /** Receive NetStream playback codes. **/ 
    97                 public function onPlayStatus(dat:Object):void { 
    98                         if (dat.code == "NetStream.Play.Complete") { 
    99                                 forward(dat, 'complete'); 
    100                         } else { 
    101                                 forward(dat, 'playstatus'); 
     97                public function onPlayStatus(... rest):void { 
     98                        for each (var dat:Object in rest) { 
     99                                if (dat && dat.hasOwnProperty('code')) { 
     100                                        if (dat.code == "NetStream.Play.Complete") { 
     101                                                forward(dat, 'complete'); 
     102                                        } else { 
     103                                                forward(dat, 'playstatus'); 
     104                                        } 
     105                                } 
    102106                        } 
    103107                } 
  • trunk/fl5/src/com/longtailvideo/jwplayer/view/View.as

    r805 r807  
    133133                        setupComponents(); 
    134134 
    135                         RootReference.stage.addEventListener(Event.FULLSCREEN, resizeHandler); 
    136135                        RootReference.stage.addEventListener(Event.RESIZE, resizeHandler); 
    137136 
     
    244243 
    245244                protected function resizeHandler(event:Event):void { 
    246                         redraw(); 
    247  
    248245                        var currentFSMode:Boolean = (RootReference.stage.displayState == StageDisplayState.FULL_SCREEN); 
    249246                        if (_model.fullscreen != currentFSMode) { 
    250247                                dispatchEvent(new ViewEvent(ViewEvent.JWPLAYER_VIEW_FULLSCREEN, currentFSMode)); 
    251248                        } 
     249 
     250                        redraw(); 
    252251                } 
    253252 
Note: See TracChangeset for help on using the changeset viewer.