Ejemplo n.º 1
0
 public void ResetPlayback(HLSProgram program, TimeSpan duration)
 {
     _program = program;
     _playlist = null;
     _duration = duration;
     _currentPosition = 0;
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Internal handler for playlist load event
        /// </summary>
        internal void PlaylistLoadEnded()
        {
            if (_pendingSubPlayListCount > 0)
            {
                lock (this)
                {
                    _pendingSubPlayListCount --;
                    if (0 == _pendingSubPlayListCount)
                    {
                        if (null != _allSubPlayListEvent)
                        {
                            _allSubPlayListEvent();
                        }
                    }
                }
            }
            else
            {
                if (IsEndList || _playlist.PlaylistDuration > _liveDvrMinDuration)
                    _duration = _playlist.PlaylistDuration;

                _LastSubPlaylistLoaded = _playlist;

                if (_asyncResult != null && _asyncResult.Purpose == HLSCallbackPurpose.WaitForPlaylist)
                {
                    if (!IsEndList
                          && ( CurrentMediaSequenceNumber > CurrentStream.SequenceNumber )
                          && !HLSPlaylist.IsSequenceNubmerRollback( CurrentStream.SequenceNumber, _playlist.Streams.Count, CurrentMediaSequenceNumber ) )
                    {
                        _asyncResult.Purpose = HLSCallbackPurpose.WaitForPlaylist;
                        _playlist.Reload();
                    }
                    else if (!BeginLoadingNextStream())
                    {
                        _asyncResult.CompleteWithAsyncState(null);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Asynchronous public API for getting next stream to play.
        /// </summary>
        /// <param name="callback"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public IAsyncResult BeginGetNextStream(AsyncCallback callback, Object state)
        {
            if (_program == null)
                throw new InvalidOperationException("program not set");

            if ( IsWebRequestPending() )
                throw new InvalidOperationException("operation is already in progress");

            _asyncResult = new HLSCallbackImpl(callback);

            if (_playlist == null)
            {
                _playlist = SelectNextVariant();
                _playlist.Playback = this;
                _currentPosition = 0;
                _currentMediaSequenceNumber = 0;
                _discontinuity = true;

                if (IsEndList || _playlist.PlaylistDuration > _liveDvrMinDuration)
                    _duration = _playlist.PlaylistDuration;

                if (_downloadBitrateChanged != null)
                    _downloadBitrateChanged(this, _playlist.Bitrate);
            }
            else
            {
                _currentPosition++;
                _currentMediaSequenceNumber++;

                HLSPlaylistImpl newPlaylist = SelectNextVariant();

                if (newPlaylist != _playlist)
                {
                    _discontinuity = true;

                    if (_downloadBitrateChanged != null &&
                        newPlaylist.Bitrate != _playlist.Bitrate)
                        _downloadBitrateChanged(this, newPlaylist.Bitrate);

                    _playlist.Playback = null;
                    _playlist = newPlaylist;
                    _playlist.Playback = this;

                }
                else
                {
                    _discontinuity = false;
                }
            }

            if (!_playlist.IsLoaded)
            {
                _asyncResult.Purpose = HLSCallbackPurpose.WaitForPlaylist;
                _playlist.Load();
                return _asyncResult;
            }
            bool a = _playlist.IsDueForReload;
            if (!IsEndList && ((_currentPosition >= _playlist.Streams.Count) || a))
            {
                _asyncResult.Purpose = HLSCallbackPurpose.WaitForPlaylist;
                _playlist.Reload();
                return _asyncResult;
            }

            if (!BeginLoadingNextStream())
            {
                _asyncResult.Dispose();
                _asyncResult = null;
            }

            return _asyncResult;
        }