|
|
@ -301,10 +301,22 @@ export class MasterPlaylistController extends videojs.EventTarget { |
|
|
|
const nextPlaylist = this.selectPlaylist(); |
|
|
|
|
|
|
|
if (this.shouldSwitchToMedia_(nextPlaylist)) { |
|
|
|
this.masterPlaylistLoader_.media(nextPlaylist); |
|
|
|
this.switchMedia_(nextPlaylist, 'abr'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
switchMedia_(playlist, cause, delay) { |
|
|
|
const oldMedia = this.media(); |
|
|
|
const oldId = oldMedia && (oldMedia.id || oldMedia.uri); |
|
|
|
const newId = playlist.id || playlist.uri; |
|
|
|
|
|
|
|
if (oldId && oldId !== newId) { |
|
|
|
this.logger_(`switch media ${oldId} -> ${newId} from ${cause}`); |
|
|
|
this.tech_.trigger({type: 'usage', name: `vhs-rendition-change-${cause}`}); |
|
|
|
} |
|
|
|
this.masterPlaylistLoader_.media(playlist, delay); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Start a timer that periodically calls checkABR_ |
|
|
|
* |
|
|
@ -416,7 +428,7 @@ export class MasterPlaylistController extends videojs.EventTarget { |
|
|
|
|
|
|
|
this.initialMedia_ = selectedMedia; |
|
|
|
|
|
|
|
this.masterPlaylistLoader_.media(this.initialMedia_); |
|
|
|
this.switchMedia_(this.initialMedia_, 'initial'); |
|
|
|
|
|
|
|
// Under the standard case where a source URL is provided, loadedplaylist will
|
|
|
|
// fire again since the playlist will be requested. In the case of vhs-json
|
|
|
@ -617,7 +629,7 @@ export class MasterPlaylistController extends videojs.EventTarget { |
|
|
|
const nextPlaylist = this.selectPlaylist(); |
|
|
|
|
|
|
|
if (this.shouldSwitchToMedia_(nextPlaylist)) { |
|
|
|
this.masterPlaylistLoader_.media(nextPlaylist); |
|
|
|
this.switchMedia_(nextPlaylist, 'bandwidthupdate'); |
|
|
|
} |
|
|
|
|
|
|
|
this.tech_.trigger('bandwidthupdate'); |
|
|
@ -743,7 +755,7 @@ export class MasterPlaylistController extends videojs.EventTarget { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
this.masterPlaylistLoader_.media(media); |
|
|
|
this.switchMedia_(media, 'smooth-quality'); |
|
|
|
|
|
|
|
this.mainSegmentLoader_.resetLoader(); |
|
|
|
// don't need to reset audio as it is reset when media changes
|
|
|
@ -763,7 +775,7 @@ export class MasterPlaylistController extends videojs.EventTarget { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
this.masterPlaylistLoader_.media(media); |
|
|
|
this.switchMedia_(media, 'fast-quality'); |
|
|
|
|
|
|
|
// Delete all buffered data to allow an immediate quality switch, then seek to give
|
|
|
|
// the browser a kick to remove any cached frames from the previous rendtion (.04 seconds
|
|
|
@ -1118,7 +1130,7 @@ export class MasterPlaylistController extends videojs.EventTarget { |
|
|
|
(Date.now() - nextPlaylist.lastRequest) <= delayDuration; |
|
|
|
|
|
|
|
// delay if it's a final rendition or if the last refresh is sooner than half targetDuration
|
|
|
|
return this.masterPlaylistLoader_.media(nextPlaylist, isFinalRendition || shouldDelay); |
|
|
|
return this.switchMedia_(nextPlaylist, 'exclude', isFinalRendition || shouldDelay); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|