/// <summary>
        /// Called when playlist file has been loaded and parsed. This implementation selects a program,
        /// creates a playback wrapper and asynchronously requests first stream to play.
        /// </summary>
        private void Playlist_PlaylistReady(object sender)
        {
            // DoCloseMedia may happend before the PlaylistReady event fired.
            if (_playlist == null) return;

            if (_program == null)
                _program = _playlist.Programs[0];

            if (_playback == null)
                _playback = new HLSPlayback(_program, (IVariantSelector)this);

            lock (_playback)
            {
                if (_openParam.isDownloadAllSubPlayList || null != _playlistOverrideEvent)
                {
                    _playback.OnStartLoadingSubPlayList(_program.Variants.Count);
                    _playback.AllSubPlayListEvent += OnAllSubPlayListLoaded;
                    foreach (HLSVariant hlsVariant in _program.Variants)
                    {
                        hlsVariant.Playback = _playback;
                        hlsVariant.Load();
                    }
                }
                else
                {
                    OnAllSubPlayListLoaded();
                }
            }
        }
        private bool OverridePlaylistIfNecessary(PlayListOverrideInfo overrideInfo)
        {
            bool isOverrided = false;
            if (null != _playlistOverrideEvent)
            {
                HLSExternalPlayListImpl externalPlayLsit = new HLSExternalPlayListImpl();
                if (overrideInfo.reason == PlayListOverrideReason.ePlaylistLoaded)
                {
                    externalPlayLsit.FromHLSPlaylist(_playlist);
                }
                if (_playlistOverrideEvent(externalPlayLsit, overrideInfo))
                {
                    isOverrided = true;
                    _playlist.FromHLSExternalPlaylist(externalPlayLsit);
                    lock (_playback)
                    {
                        _program = _playlist.Programs[0];
                        _playback.Program = _program;
                        _playback.ResetPlayback(_program, _playlist.PlaylistDuration);

                        List<SampleBuffer.TimeLineInfo> timelineInfoList = new List<SampleBuffer.TimeLineInfo>();
                        foreach (TimelineEstablishInfo establishInfo in externalPlayLsit.timelineEstablishInfoList)
                        {
                            timelineInfoList.Add(new SampleBuffer.TimeLineInfo(establishInfo.timelineStartOffset.Ticks, establishInfo.isMonoIncrease));
                        }
                        _videoBuffer.EstablishTimeline(timelineInfoList);
                        _audioBuffer.EstablishTimeline(timelineInfoList);
                    }
                }
            }

            if (!isOverrided && overrideInfo.reason == PlayListOverrideReason.ePlaylistLoaded)
            {
                List<SampleBuffer.TimeLineInfo> timelineInfoList = new List<SampleBuffer.TimeLineInfo>();
                timelineInfoList.Add(new SampleBuffer.TimeLineInfo(0, false));

                _videoBuffer.EstablishTimeline(timelineInfoList);
                _audioBuffer.EstablishTimeline(timelineInfoList);
            }

            _playlistOverrided = isOverrided;
            return isOverrided;
        }
Example #3
0
 public void ResetPlayback(HLSProgram program, TimeSpan duration)
 {
     _program = program;
     _playlist = null;
     _duration = duration;
     _currentPosition = 0;
 }
 /// <summary>
 /// Handler for Close command
 /// </summary>
 private void DoCloseMedia()
 {
     lock (_workQueueThreadLock)
     {
         HLSTrace.WriteLine("DoCloseMedia");
         _bwHistory.Close();
         _playback.AbortStreamDownloads();
         _isWorkQueueThreadStarted = false;
         _workQueueThread = null;
         _workQueue = null;
         _audioBuffer = null;
         _videoBuffer = null;
         _playlist = null;
         _playback = null;
         _program = null;
         if (_demux != null)
         {
             _demux.Dispose();
             _demux = null;
         }
     }
 }
Example #5
0
 /// <summary>
 /// Number of times we have already retried downloading the current stream 
 /// but have failed with a WebException
 /// /// </summary>
 /// <summary>
 /// Default constructor.
 /// </summary>
 /// <param name="program"></param>
 public HLSPlayback(HLSProgram program, IVariantSelector heuristics )
 {
     _program = program;
     _heuristics = heuristics;
 }