FAQ
If the problem is related to FairPlay, have you read the tutorial?
Not applicable
What version of Shaka Player are you using?
v4.8.5 (originally discovered), verified present in v4.16.29, v5.1.2, and main
Can you reproduce the issue with our latest release version?
Yes
Can you reproduce the issue with the latest code from main?
Yes
Are you using the demo app or your own custom app?
Custom app
What browser and OS are you using?
Chromium-based embedded browser on Fire OS (Amazon Fire TV). Bug is platform-independent — reproducible anywhere the preload API is used with a reused Player instance.
For embedded devices (smart TVs, etc.), what model and firmware version are you using?
Amazon Fire TV (Vega platform), but not device-specific
What are the manifest and license server URIs?
Any DASH or HLS manifest with multiple bitrate variants. The bug is content-independent — it occurs on any preload-based
load on a reused shaka.Player instance. No specific URI needed to reproduce.
What configuration are you using? What is the output of player.getNonDefaultConfiguration()?
Default configuration (default abrFactory). The bug requires that abrFactory is a stable reference across loads so that the
factory-identity check in load() retains the existing AbrManager.
What did you do?
- Create a shaka.Player instance and attach it to a video element
- Preload and load an asset using player.preload(uri) then player.load(preloadManager)
- Playback works, ABR adapts normally
- Unload the player (player.unload())
- Preload and load a second asset on the same player instance using player.preload(uri2) then player.load(preloadManager2)
- Observe that ABR never switches variants on the second load, even with fluctuating bandwidth
What did you expect to happen?
ABR adaptation should work on every load, regardless of whether the Player instance is reused or whether the preload API is
used. SimpleAbrManager.segmentDownloaded should call suggestStreams_() when bandwidth data is available and switching is
allowed.
Root cause: SimpleAbrManager.stop() sets this.lastTimeChosenMs_ = null during unload. On the next preload-based load, the
Player retains its existing AbrManager (because the factory-identity check this.abrManagerFactory_ != abrFactory is false with
default config). loadInner_ skips chooseVariant_() when a prefetchedVariant is provided, so lastTimeChosenMs_ is never re-
initialized. The guard in segmentDownloaded — if (allowSwitch && (this.lastTimeChosenMs_ != null) && this.enabled_) — then
blocks all calls to suggestStreams_() indefinitely.
Suggested fix: Call this.abrManager_.trySuggestStreams() in Player.loadInner_ after accepting a prefetched variant. This
sets lastTimeChosenMs_ = Date.now() and mirrors what the non-preload path achieves implicitly through chooseVariant_() →
chooseVariant().
What actually happened?
After the first preload-based load on a reused Player, ABR adaptation permanently stops. The player stays locked on the
initial variant chosen by the PreloadManager.
Are you planning to send a PR to add it?
TBD
FAQ
If the problem is related to FairPlay, have you read the tutorial?
Not applicable
What version of Shaka Player are you using?
v4.8.5 (originally discovered), verified present in v4.16.29, v5.1.2, and main
Can you reproduce the issue with our latest release version?
Yes
Can you reproduce the issue with the latest code from
main?Yes
Are you using the demo app or your own custom app?
Custom app
What browser and OS are you using?
Chromium-based embedded browser on Fire OS (Amazon Fire TV). Bug is platform-independent — reproducible anywhere the preload API is used with a reused Player instance.
For embedded devices (smart TVs, etc.), what model and firmware version are you using?
Amazon Fire TV (Vega platform), but not device-specific
What are the manifest and license server URIs?
Any DASH or HLS manifest with multiple bitrate variants. The bug is content-independent — it occurs on any preload-based
load on a reused shaka.Player instance. No specific URI needed to reproduce.
What configuration are you using? What is the output of
player.getNonDefaultConfiguration()?Default configuration (default abrFactory). The bug requires that abrFactory is a stable reference across loads so that the
factory-identity check in load() retains the existing AbrManager.
What did you do?
What did you expect to happen?
ABR adaptation should work on every load, regardless of whether the Player instance is reused or whether the preload API is
used. SimpleAbrManager.segmentDownloaded should call suggestStreams_() when bandwidth data is available and switching is
allowed.
Root cause: SimpleAbrManager.stop() sets this.lastTimeChosenMs_ = null during unload. On the next preload-based load, the
Player retains its existing AbrManager (because the factory-identity check this.abrManagerFactory_ != abrFactory is false with
default config). loadInner_ skips chooseVariant_() when a prefetchedVariant is provided, so lastTimeChosenMs_ is never re-
initialized. The guard in segmentDownloaded — if (allowSwitch && (this.lastTimeChosenMs_ != null) && this.enabled_) — then
blocks all calls to suggestStreams_() indefinitely.
Suggested fix: Call this.abrManager_.trySuggestStreams() in Player.loadInner_ after accepting a prefetched variant. This
sets lastTimeChosenMs_ = Date.now() and mirrors what the non-preload path achieves implicitly through chooseVariant_() →
chooseVariant().
What actually happened?
After the first preload-based load on a reused Player, ABR adaptation permanently stops. The player stays locked on the
initial variant chosen by the PreloadManager.
Are you planning to send a PR to add it?
TBD