/// <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; }
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; } } }
/// <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; }