Changelog
These are the release notes for THEOplayer 10.0.0 and higher. For older versions, see:
🚀 10.12.1 (2026/03/17)
iOS
⚡ Improvements
- Improved startup time for HESP-enabled OptiView Live streams on slower networks.
🐛 Issues
- Fixed an issue where the first video frame would appear stuck for a while when starting playback of an HESP OptiView Live stream.
🚀 10.12.0 (2026/03/12)
Web
✨ Features
- Added default values for the
mptandmpvad tag parameters for Google DAI. - Added the
AdBreak.idAPI. - Added the experimental
View.playerproperty to the MultiView API to access the player underlying that view.
🐛 Issues
- Fixed an issue where the player would not parse Nielsen cues when playing an OptiView Live stream.
- Fixed an issue where the player would not dispatch ad events when playing a Google DAI DASH live stream.
- Fixed an issue in HLS streams with TS segments where setting a
targetQualitycould sometimes cause an infinite loop. - Fixed an issue where the player would still receive id3 events from the previous Google DAI source after resetting the source to a non Google DAI source.
- Fixed an issue where, when playing an OptiView Ads enabled stream, subsequent switches from ad to content would take longer and longer each time.
- Fixed an issue where the backdrop doesn't respect the aspect ratio when an ad is played with another aspect ratio in an OptiView Ads stream.
- Fixed an issue where the player would not pause the content in double box layout when clicking on an ad clickthrough for an OptiView Ads stream.
- Fixed an issue where OptiView Live streaming fallback functionality was not behaving as expected when playing HESP streams.
- Fixed an issue where the player would sometimes play a Google IMA preroll ad again when switching from ad to content while playing an OptiView Ads stream in native fullscreen or native PiP.
- Fixed an issue where the content would be paused when playing an OptiView Ads double-box advertisement.
- Fixed an issue where the double box layout would not dismiss when the VAST ad creative was unavailable for OptiView Ads.
- Fixed an issue where the player would sometimes not play the VAST ad unmuted on iOS Safari for an OptiView Ads stream.
⚠ Known Limitations
- Using OptiView Ads with Picture-in-Picture (PiP) on Firefox is not supported. The default PiP button will be hidden in this scenario to discourage usage.
Android
💥 Breaking Changes
LatencyManager.currentLatencynow returnsnullwhen the player is not actively playing.
✨ Features
- Added default values for the
mptandmpvad tag parameters for Google DAI. - Added the
AdBreak.idAsStringAPI. - Added
Logger.HESPlogging tag for debugging HESP playback issues.
👎 Deprecations
- Deprecated
MediaTailorAdAvail.idin favor ofAdBreak.idAsString.
iOS
✨ Features
- Added the
bytesproperty to theCachingTaskAPI which estimates the total amount of bytes that the task will download. - Added the
AdBreak.idAPI. - Added default values for the
mptandmpvad tag parameters for Google DAI. - Added better error handling for HESP loading during startup with bad network conditions.
⚡ Improvements
- Improved performance when accessing the
bytesCachedproperty ofCachingTask. - Improved error handling during ABR switches when playing OptiView Live sources.
- Improve error details (error code and message) when storage is low during a caching task. In a future major version, we will send better error metadata where possible: ie. send
THEOErrorCode.CACHE_SOURCE_ERRORinstead ofTHEOErrorCode.NETWORK_ERROR.
🐛 Issues
- Fixed an issue where text tracks were not synced properly with Chromecast.
- Fixed an issue where HESP playout would occasionally fail to start or stall shortly after startup.
- Fixed an issue where a
CastErrorwas thrown during Chromecast connection establishment. - Fixed an issue where retrying segment downloads for OptiView Live sources in bad network conditions would cause a fallback instead of continuing with the retried segment download.
- Fixed an issue where autoplay would not work when setting Millicast sources.
- Fixed an issue where setting
mutedon the player before setting aMillicastSourcewould be ignored. - Fixed an issue where a quality switch on an OptiView Live HESP source caused unintended fallbacks.
- Fixed an issue where the ABR controller would switch up too fast after startup or after a previous quality switch.
- Fixed an issue during HESP playback where sometimes a
playingevent would be missing after resuming playback.
Roku
✨ Features
- Added the
AdBreak.idAPI. - Added default values for the
mptandmpvad tag parameters for Google DAI.
⚡ Improvements
- Updated the Mux SDK in the THEOMuxConnector to 2.6.0.
🐛 Issues
- Fixed an issue in the THEOMuxConnector where the poster URL was not being recorded.
🚀 10.11.1 (2026/03/05)
Web
🐛 Issues
- Fixed an issue where versions 10.10.0 to 10.11.0 of the
@theoplayer/basic-hlsvariant were published with an incorrect feature set. - Fixed an issue where setting a second OptiView Live source in a row would sometimes cause the stream to fail to start.
🚀 10.11.0 (2026/02/25)
Web
⚡ Improvements
- Updated the OptiView Real-time streaming retry logic. Minimum backoff time for a OptiView Real-time source is now 1 second.
- OptiView Live streams played on mobile Safari will fallback faster when segments would be unavailable.
- Improved the resiliency for MPEG-DASH Content Steering when the steering server is unstable.
🐛 Issues
- Fixed an issue where a PS4 WebMAF app could freeze when autoplay is enabled.
- Fixed an issue where autoplay on an ended stream could fire a play event before the sourcechange event, causing duplicate analytics sessions.
- Fixed an issues in MPEG-DASH Content Steering where successful manifest location downloads were reported in the
_DASH_pathwaysearch param. - Fixed an issue where layer configuration passed in
MillicastSource.connectOptionswas not kept into account when switching layers after the source had been set.
⚠ Known Limitations
@theoplayer/basic-hlsversion 10.11.0 was incorrectly published with thebasic-dashfeature set. If you're using this variant, please update to version 10.11.1 or higher for the correct feature set.
Android
⚡ Improvements
- Updated Media3 to version 1.9.2.
🐛 Issues
- Fixed an issue where ABR was not switching to a lower quality on very low bandwidth.
- Fixed an issue where
TextTrackStyle.fontSizewas not correctly applied to TTML subtitles with atts:fontSizeattribute. - Fixed an issue where changing the
player.textTrackStyleof one player could accidentally also change the text track style of other players. - Fixed an issue where using Picture-in-Picture with
PiPType.ACTIVITYon apps withoutTheme.AppCompattheme could crash the application. - Fixed an issue where autoplay on an ended stream could fire a play event before the sourcechange event, causing duplicate analytics sessions.
- Updated the Millicast SDK to version 2.5.3, which adds a necessary consumer ProGuard rule to prevent a missing symbol crash from occurring when enabling minification.
- Fixed an issue where the backdrop would not be visible for OptiView Ads.
- Fixed an issue where the player would restart a VOD source when a scheduled interstitial would not have a resume time for OptiView Ads.
- Fixed an issue where the target latency was not applied for OptiView Live v1 channels.
iOS
✨ Features
- Added mobile layout support for OptiView Ads to override the ad layout when playing on iOS.
⚡ Improvements
- Bumped the Millicast SDK version to 2.5.3
🐛 Issues
- Fixed an issue where playing OptiView Live streams would cause an initial audio stutter.
- Fixed an issue in OptiView Ads where subsequent adbreak requests on monetized streams would fail after receiving an ad error.
- Fixed an issue where playing a VAST ad pod would only play the first ad for OptiView Ads.
- Fixed an issue in OptiView ads where the player would pause instead of playing the main content when an ad fails to load.
- Fixed an issue where the target latency was not applied for OptiView Live v1 channels.
Roku
👎 Deprecations
- Deprecated the
bitratechangeevent in favor of theactivequalitychangedevent.
🚀 10.10.1 (2026/02/25)
Web
🐛 Issues
- Fixed an issue in HLS streams with TS segments where setting a
targetQualitycould sometimes cause an infinite loop.
⚠ Known Limitations
@theoplayer/basic-hlsversion 10.10.1 was incorrectly published with thebasic-dashfeature set. If you're using this variant, please update to version 10.11.1 or higher for the correct feature set.
🚀 10.10.0 (2026/02/11)
General
✨ Features
- Added the
distributionloadedevent to theplayer.theoliveAPI.
Web
🐛 Issues
- Fixed an issue where DRM-enabled HLS streams could error on rendition switches due to missing keys.
- Fixed an issue where quality changes during HLS playback could cause an error on low-end devices.
- Fixed an issue where an HESP source with a relative manifest URL could not be played.
- Fixed an issue on Safari where sometimes the
endedevent would not be fired when the player reaches the end of a stream. - Fixed an issue where multiple subtitle cues within a segment would not display correctly.
- Fixed an issue where an HLS live stream would not start playback after a pre-roll ad on iOS Safari.
- Fixed an issue where the player would dispatch the
pauseandendedevent in an incorrect order when seeking to the end of a stream. - Fixed an issue where a track's
activeQualitycould beundefinedon a playing event with OptiView Live streams. - Fixed an issue where an OptiView Ads stream with disabled VPAID ads could cause the player to stop serving ads.
- Fixed an issue where playing ads using Google IMA and OptiView Ads together could cause the Google IMA ad to not play.
- Fixed an issue where an incorrect waiting event could be dispatched during an ad break to ad break transition on an OptiView Ads stream.
⚠ Known Limitations
@theoplayer/basic-hlsversion 10.10.0 was incorrectly published with thebasic-dashfeature set. If you're using this variant, please update to version 10.11.1 or higher for the correct feature set.
Android
✨ Features
- Added
NetworkConfigurationsupport for retries for OptiView Real-time streams.
🐛 Issues
- Fixed an issue where the bandwidth caching parameter was ignored when caching DRM-protected streams.
- Fixed an issue during offline playback where playing a not fully downloaded content-protected (DRM) stream could cause a crash.
- Fixed an issue where a stall during playback on Chromecast for OptiView Live streams was not handled correctly.
iOS
✨ Features
- Made the
contentProtectionproperty public on theEndpointAPIprotocol.
⚡ Improvements
- Fixed an issue where recovery from network errors while playing and OptiView Live stream could take longer than expected due to platform limitations.
🐛 Issues
- Fixed an issue where using
player.ads.schedule(adDescription:)API did not trigger an ad playback. - Fixed an issue where the recovery logic during playback of OptiView Live streams could check incorrect endpoints.
- Fixed an issue where playback was stuck when receiving an empty VAST for OptiView Ads.
- Fixed a bug that reset the
autoplayflag whenever an integration was added to the player. - Fixed an issue where OptiView Ads with VAST would not play in picture-in-picture mode.
- Fixed an issue where track selection was not respected during Chromecast.
🚀 10.9.0 (2026/01/29)
Web
✨ Features
- Added
DashPlaybackConfiguration.contentSteeringto control whether content steering is enabled in MPEG-DASH streams.
⚡ Improvements
- Added the ability to set a
RetryConfigurationon a per-source basis.
🐛 Issues
- Fixed an issue for OptiView Ads where the layout could be incorrect when playing a VAST ad in double box or L-shape layout.
- Fixed an issue where the player could not switch sources after a DAI stream errored.
- Fixed an issue where a WideVine L1 protected DASH stream would occasionally fail to play on certain Android FireTV models (AFTSS & AFTSSS).
- Fixed an issue where an
#EXT-X-KEYwith a base64data:URI was sometimes parsed incorrectly from the HLS playlist. - Fixed an issue where playback of subsequent OptiView Live sources would cause incorrect endpoints to be selected.
- Fixed an issue where MPEG-DASH content steering was sometimes not switching to a different
serviceLocationwhen segment downloads failed. - Fixed an issue where a PS4 WebMAF app could freeze upon requesting a media segment.
- Fixed an issue where the timecode text track would not be present on HESP streams that contain SEI timecodes.
- Fixed an issue in MPEG-DASH Content Steering where the
Retry-Afterheader was not respected when the server returned status code429. - Fixed an issue where a crash would occur when playing an unsupported VPAID ad during native fullscreen on iOS Safari for an OptiView Ads stream.
- Fixed an issue in MPEG-DASH Content Steering where the
_DASH_throughputand_DASH_pathwayquery parameters only supported a single pathway. - Fixed an issue in MPEG-DASH Content Steering where sometimes a
serviceLocationwas chosen that was outside the providedPATHWAY-PRIORITYlist. - Fixed an issue in MPEG-DASH Content Steering where
_DASH_throughputwould report a pathway that was not actually downloaded. - Fixed an issue in MPEG-DASH Content Steering where the default serviceLocation was not respected with
queryBeforeStart="false". - Fixed an issue where the player would dispatch play/pause events incorrectly when playing ad break to ad break on an OptiView Ads stream.
- Fixed an issue for OptiView Ads where an IMA ad break could error when playing in iOS Safari native fullscreen.
- Fixed an issue for OptiView Ads where the audio could play multiple times for a VAST ad in Picture-in-Picture.
- Fixed an issue for OptiView Ads where the same ad could sometimes be scheduled multiple times.
- Fixed an issue where the
playingevent was sometimes not dispatched when resuming playback after fallback of an OptiView Live stream.
Android
⚡ Improvements
- The player will now automatically switch to a different quality when the current quality needs a DRM key that is missing in the DRM license. (Previously, the player would crash with a
MediaCodec.CryptoExceptioninstead.)
🐛 Issues
- Fixed an issue where
Ads.getCurrentAds()could containnullads. - Fixed an issue where
player.durationwas incorrectly reported asInfinityfor MP3 files when using theHttpEnginenetwork stack. - Fixed an issue where
TrackListChangeEventwas not triggered when the subtitles were turned off. - Fixed an issue where the subtitle state was not maintained between the sender and receiver apps.
⚠ Known Limitations
- When the player's ABR strategy is set to
QUALITY, but the highest quality is missing a required DRM key, the player will fall back to any other quality (not necessarily the highest quality with an available DRM key).
iOS
✨ Features
- Added a
LatencyManagerto control offset from live in HLS livestreams.
Roku
✨ Features
- Created the THEOMuxConnector to enable Mux analytics in the THEO Roku SDK.
🐛 Issues
- Fixed an issue where Comscore and Adobe connectors could spawn multiple lingering task threads after multiple instantiations.
- Fixed an issue where VOD Google SSAI assets would not play.
- Fixed an issue where the stall detection would wrongly say a stream with no audio was stalled.
🚀 10.8.0 (2026/01/15)
Web
✨ Features
- Added support for MPEG-DASH content steering.
- Added support for
player.metrics.bufferedSegmentswhen playing an HLS stream.
⚡ Improvements
- OptiView Streaming sources now support more
TypedSourceproperties, such asTypedSource.abrandTypedSource.crossOrigin.
🐛 Issues
- Fixed an issue where some HLS live streams could stall indefinitely when playing over an
#EXT-X-DISCONTINUITYon Samsung Tizen devices. - Fixed an issue where the
player.currentTimecould be incorrect after playing a CSAI ad with OptiView Ads. - Fixed an issue where
player.metrics.currentBandwidthEstimatewas not set when playing an HESP stream. - Fixed an issue where the player would sometimes jump back to the first ad of an OptiView Ads break instead of continuing with the second ad of that break.
- Fixed an issue for OptiView Ads where a VAST ad break in Safari native fullscreen could stutter.
iOS
✨ Features
- Added the
NetworkAPI toCachingTaskto help enable media playlist interception.
🐛 Issues
- Fixed an issue where seeking to the live point could cause unnecessary buffering on OptiView Streaming (THEOlive) sources.
👎 Deprecations
- Deprecated
DeveloperSettings&ManifestInterceptorin favor ofNetworkAPI. You can access the network API fromplayer.networkorcachingTask.network. For a comprehensive guide, please refer to our documentation.
Roku
🐛 Issues
- Fixed an issue where OptiView Live streams would not properly fall back to a backup feed in case of a streaming error.
- Fixed an issue where OptiView Live streams could experience endless buffering without recovering.
🚀 10.7.2 (2026/01/27)
Web
🐛 Issues
- Fixed an issue where HLS playback on lower spec devices could error on a quality change between qualities with identical initializers.
🚀 10.7.1 (2026/01/26)
Web
🐛 Issues
- Fixed an issue where HLS playback on lower spec devices could error on a quality change briefly after starting playback.
🚀 10.7.0 (2025/12/16)
Web
✨ Features
- Added the ability to override connect options for OptiView Real-time streams.
- Added support for casting token-protected OptiView Live DVR streams to Chromecast.
- Added Millicast connect options to the OptiView Live discovery response.
⚡ Improvements
- Added
RetryConfigurationsupport for OptiView Real-time streams. - Improved OptiView Real-time stream stability by automatically attempting to reconnect when errors occur mid-stream.
🐛 Issues
- Fixed an issue where the player would not play from the live point when exiting an errored casting session.
- Fixed an issue for OptiView Ads where using a CSAI adbreak would not be handled properly when going into PiP or native fullscreen.
- Fixed a regression where
currentProgramDateTimewas no longer returningnullfor non-DVR streams without program date time information. - Fixed an issue with consecutive ad breaks on an OptiView Ads Stream where the second ad break would not play if its duration was smaller than the preceding ad break.
- Fixed an issue where the player would play a CSAI ad break muted in a double box layout for an Optiview Ads stream.
- Fixed an issue where pausing OptiView Real-time streams would show a frozen frame on browsers on Android devices.
- Fixed an issue where CEA-608 captions from the content continued showing during an SSAI ad break.
Android
✨ Features
- Added
DRMConfiguration.multiSessionto enable multi-session support for streams that require different key requests for different qualities, or for streams that use key rotation. - Added support for casting token-protected OptiView Live DVR streams to Chromecast.
- Added the ability to override connect options for OptiView Real-time streams.
🐛 Issues
- Fixed an issue where subtitles could not be turned off while using Chromecast.
- Fixed an issue where failover of OptiView Live sources during HLS playback would return the player to non-HLS playback.
👎 Deprecations
- Deprecated
THEOplayerConfig.isMultiSession, useDRMConfiguration.multiSessioninstead.
iOS
✨ Features
- Added Chromecast support for DVR-enabled OptiView Live streams.
- Added the ability to override connect options for OptiView Real-time streams.
🐛 Issues
- Fixed a regression where PiP was not retained when the
retainPresentationModeOnSourceChangesetting was enabled in thePipConfiguration. - Fixed an issue where the auth token was not being passed correctly with DVR enabled OptiView Live streams.
Roku
🐛 Issues
- Fixed an issue where closed captions would be disabled when destroying the player while buffering.
🚀 10.6.1 (2025/12/02)
Android
🐛 Issues
- Fixed an issue where ID3 metadata from an HLS alternative audio rendition was not being parsed.
🚀 10.6.0 (2025/12/02)
Web
✨ Features
- Added a fallback to the Google DAI server-side beaconing stream when an OptiView Ads stream or OptiView Live stream with ads enabled is played via Airplay and a
daiAssetKeyis defined. - Added support for personalized discovery call responses by configuring the
profileproperty on an OptiView Live source.
⚡ Improvements
- Added
ActiveQualityChangedevent for OptiView RealTime streams. - Improved HLS segment selection on ABR changes to not download segments that had already been buffered in a different quality.
- The query parameters on the endpoint license acquisition URL of a DRM protected OptiView Live stream now take precedence over the query parameters that are defined in
contentProtection.queryParametersor in the corresponding key system configuration. - The
player.ads.daiAPI is now undefined when there the DAI library is not loaded.
🐛 Issues
- Fixed an issue where the player would always preload the Google DAI manifest when setting a Google DAI source.
- Fixed an issue where audio labels would not default to the language for HESP streams.
- Fixed an issue where the player could stall shortly on a discontinuity switch if the stream contained a small gap.
- Fixed issue where failover of OptiView Live sources during HLS playback would return the player to non-HLS playback.
👎 Deprecations
- Deprecated
preloadPublicationson the THEOliveAPI. This will be removed in a future version.
Android
✨ Features
- Added Chromecast support for DVR-enabled OptiView Live streams.
- Added support for personalized discovery call responses by configuring the
profileproperty on an OptiView Live source.
⚡ Improvements
- The query parameters on the endpoint license acquisition URL of a DRM protected OptiView Live stream now take precedence over the query parameters that are defined in
contentProtection.queryParametersor in the corresponding key system configuration.
👎 Deprecations
- Deprecated
preloadPublicationson the THEOliveAPI. This will be removed in a future version.
iOS
💥 Breaking Changes
- THEOplayer SDK and all its integrations frameworks will now be built with Xcode 16 instead of 15. We expect no impact on applications since Apple enforced the policy of building with Xcode 16 to publish to the app store since April 24, 2025. Categorizing this as "Breaking change" since the compiler is bumped from Swift 5.10 to 6.0 with the Xcode version bump.
✨ Features
- Added
targetQualitiesproperty toMediaTrackAPI. Only supported for THEOlive. - Added support for personalized discovery call responses by configuring the
profileproperty on an OptiView Live source. - Added a new experimental pipeline for chromecast, which enables new features, i.e. OptiView Live DVR. To use the new pipeline enable the
enableExperimentalPipelineon theCastConfigurationobject when creating the CastIntegration.
🐛 Issues
- Fixed an issue where sometimes playback would pause after ending an OptiView Ads ad break on iPadOS.
- Fixed an issue where
player.bufferedwould return the same asplayer.seekable. - Fixed an issue where adding multiple drm query parameters would not work as expected.
👎 Deprecations
- Deprecated
preloadPublicationson the THEOliveAPI. This will be removed in a future version.
Roku
✨ Features
- Added support for personalized discovery call responses by configuring the
profileproperty on an OptiView Live source.
🚀 10.5.1 (2025/11/26)
Web
🐛 Issues
- Fixed an issue where seeking back in an OptiView Live stream with a DVR window on iOS Safari would make the player jump to the live edge instead of the desired time.
- Fixed an issue where the current time was incorrect when returning from casting a DVR asset.
Android
🐛 Issues
- Removed dependency on
kotlinx-datetimelibrary from OptiView Ads integration.
🚀 10.5.0 (2025/11/19)
Web
✨ Features
- Added support for targeted bitrate limiting on OptiView Live streams with OptiView Ads enabled.
- Added the
fallbackevent to thetheoadsAPI to indicate when the player falls back to Google DAI when OptiView Ads is not supported or blocked. - Added support for configuring query parameters that are common to multiple key system configurations. The parameters defined in
contentProtection.queryParameterswill be merged with any query parameters that are explicitly defined on a key system configuration, whereby the latter takes precedence.
⚡ Improvements
- Updated OptiView Ads overlays to be available during the whole DVR range instead of being removed after it was shown.
- Improved the transition from content to ad on Safari for OptiView Ads.
🐛 Issues
- Fixed an issue for OptiView Ads where the player could get stuck when scheduling multiple ad breaks close together.
- Fixed an issue where the player would not dispatch an
AdErrorEventwhen failing to play an ad during an OptiView Ads stream. - Fixed a regression since 10.2.0 for OptiView Ads where a scheduled overlay could be rendered multiple times.
- Fixed an issue where incorrect events were dispatched when transitioning between content and ads for OptiView Ads.
- Fixed an issue where the cues of text tracks would never be pruned on HLS live streams.
- Fixed an issue where the player would sometimes throw a media decode error on PS5 when playing multi period DASH streams.
- Fixed an issue where the Uplynk UI was creating unnecessary DOM nodes on every
timeupdateevent, even when the Uplynk integration was not in use. - Fixed an issue for OptiView Ads where L-Shape ad breaks on iOS would show the content instead of the backdrop.
- Fixed an issue where multiple quartile events could be dispatched when playing a Google DAI source.
Android
✨ Features
- Added
TheoAdsFallbackEventto indicate when the player falls back to Google DAI when OptiView Ads is not supported or blocked. - Added support for targeted bitrate limiting on OptiView Live streams with OptiView Ads enabled.
- Added support for configuring query parameters that are common to multiple key system configurations. The parameters defined in
contentProtection.queryParameterswill be merged with any query parameters that are explicitly defined on a key system configuration, whereby the latter takes precedence.
🐛 Issues
- Fixed an issue where an
InterstitialErrorevent was incorrectly emitted for single ads in OptiView Ads. - Fixed an issue where the
AddAdBreakEventwould fire multiple times while playing a Google DAI ad. - Fixed an issue on OptiView Ads where an additional
AdBeginevent was fired in case of an ad error or very short slate. - Fixed an issue where the player did not always fall back to a configured Google DAI stream when it encounters a problem with the main OptiView Ads stream.
- Fixed an issue where
AdBreakBeginEventwas fired at the start of each ad in a Google IMA/DAI ad break, instead of just once at the start of the ad break. - Fixed an issue where a crash could occur due to locally stored bandwidth properties being null unexpectedly.
- Fixed an issue where
AdBreak.timeOffsetwas always 0 for midrolls in a Google DAI livestream. - Fixed an issue where different midroll ad breaks in a Google DAI livestream were incorrectly represented by the same
AdBreakobject. - Fixed an issue where ad breaks in a Google DAI livestream were never removed from the Ads API after being played.
- Fixed an issue where OptiView Live was incorrectly skipping endpoints with higher priority.
iOS
✨ Features
- Added
THEOadsFallbackEventto indicate when the player falls back to Google DAI when OptiView Ads is not supported or blocked. - Added support for targeted bitrate limiting on OptiView Live streams with OptiView Ads enabled.
- Added support for configuring query parameters that are common to multiple key system configurations. The parameters defined in
DRMConfiguration.queryParameterswill be merged with any query parameters that are explicitly defined on a key system configuration, whereby the latter takes precedence.
🐛 Issues
- Fixed an issue where both SGAI and SSAI were enabled for a SSAI only OptiView Live stream.
- Fixed an issue where accessing the ad break of a Google DAI ad would crash the application.
- Fixed an issue where playback would not automatically start when setting a new source and calling play after connecting to AirPlay.
- Fixed an issue where the picture-in-picture presentation mode was not preserved when an adbreak ended for OptiView Ads.
- Fixed an issue where player controls and API's were broken when returning from a Chromecast session.
👎 Deprecations
- Deprecated the
adBreakproperty of theAdprotocol, this property can still be used but will become optional with the next major version.
Chromecast
🐛 Issues
- Fixed an issue where a mismatch could occur between enabled tracks on the sender versus the receiver, causing unexpected behaviour in audio track selection.
Chromecast CAF
✨ Features
- Added support for configuring query parameters that are common to multiple key system configurations.
Roku
✨ Features
- Added support for targeted bitrate limiting on OptiView Live streams with OptiView Ads enabled.
🐛 Issues
- Fixed an issue where a crash could occur due to event listener cleanup during player destruction.
🚀 10.4.1 (2025/11/14)
Web
⚡ Improvements
- Improved the performance of CEA-608 parsing and rendering.
🐛 Issues
- Fixed an issue where the cues of text tracks would never be pruned on HLS live streams.
iOS
🐛 Issues
- Fixed an issue where accessing the ad break of a Google DAI ad would crash the application.
- Fixed an issue where unmuting the player on iOS failed after muting a stream that contains an IMA ad.
- Fixed an issue where after loading a VMAP ad, additional VMAP ads would fail to load and playout would be broken.
👎 Deprecations
- Deprecated the
adBreakproperty of theAdprotocol, this property can continue to be used but will become optional with the next major version.
🚀 10.4.0 (2025/11/05)
General
⚡ Improvements
- Aligned the position of the video during an OptiView Ads L-Shape interstitial to be consistent across SDKs.
Web
✨ Features
- Added DVR switching for OptiView Live streams so users can seek between live sources (HESP/Millicast) and DVR sources (HLS) on DVR-enabled channels.
- Added support for DAI SSAI as the primary stream for OptiView Live streaming.
🐛 Issues
- Fixed an issue for OptiView Ads where Overlay interstitials did not update during an ad break interstitial where the content continues playing.
- Fixed an issue for OptiView Ads where the backdrop set in the source description wasn't used correctly.
Android
🐛 Issues
- Fixed a regression where
TheoLiveSource.headerswere no longer being passed to the discovery call for OptiView Live streams. - Fixed an issue where sideloaded WebVTT chapters and thumbnails tracks could not both be enabled at the same time.
- Fixed an issue where ad configuration parameters were not being applied to DAI OptiView Live streams.
- Fixed an issue where the player could crash while loading an OptiView Live channel that is unavailable.
👎 Deprecations
- Deprecated
TheoAdsErrorEvent. Use theAdErrorEventon the Ads API instead.
iOS
✨ Features
- Added a convenience initializer to
GoogleDAITypedSourceto enable DRM with Google DAI. - Added support for DAI SSAI as the primary stream for OptiView Live streaming.
🐛 Issues
- Fixed an issue for OptiView Ads where the backdrop set in the source description wasn't used correctly.
Roku
🐛 Issues
- Added protection against unexpected values being set for
encoding_typeon Conviva metadata.
🚀 10.3.0 (2025/10/23)
Web
🐛 Issues
- Fixed an issue where embedded subtitles could sometimes disappear after repeatedly seeking back and forth in an MPEG-DASH stream.
- Fixed an issue where disconnecting a headset while playing an MPEG-DASH live stream causes the player to stall.
Android
✨ Features
- Added SSAI fallback through DAI for OptiView Ads if an ad blocker prevents ads from playing when using OptiView Streaming.
- Added support for
adTagParametersongamPropertiesfor overlays andbackdropURIGamPropertiesfor backdrops on OptiView Ads. - Added support for DAI SSAI as a primary stream source via OptiView Streaming.
🐛 Issues
- Fixed an issue where EZDRM ClearKey license responses were not correctly handled and could result in playback failures.
- Fixed an issue where HLS streams with gzip compressed playlists failed to play on older Android devices when the HTTP response contains a
Content-Encodingheader with a lowercased header name (i.e.content-encoding). - Fixed an issue where OptiView Ads playback was broken after the application comes back from background.
👎 Deprecations
- Deprecated
THEOplayerConfig.getPipConfiguration(), useTHEOplayerConfig.getPip()instead. - Deprecated
THEOplayerConfig.getNetworkConfiguration(), useTHEOplayerConfig.getNetwork()instead. - Deprecated
THEOplayerConfig.getTHEOLiveConfiguration(), useTHEOplayerConfig.getTheoLive()instead. - Deprecated
THEOplayerConfig.castConfiguration, useTHEOplayerConfig.castinstead. - Deprecated
THEOplayerConfig.googleImaConfiguration, useTHEOplayerConfig.googleImainstead.
iOS
✨ Features
- Added support for
adTagParametersongamPropertiesfor overlays andbackdropURIGamPropertiesfor backdrops on OptiView Ads. - Added
averageBandwidthproperty to theQualityAPI. - Added
activeQualityproperty to theMediaTrackAPI. - Deprecated
activeQualityBandwidthproperty from theMediaTrackAPI, useactiveQualityinstead. To access the bandwidth value, use thebandwidthproperty ofactiveQuality. - Added
Ad.isSlateAPI to indicate whether the ad is slate or not. - Added
playerMetricsAPI withdroppedVideoFramesproperty. - Added
renderedFramerateproperty toMetricsAPI.
⚡ Improvements
- Improved ad break reporting for Google DAI by already creating an ad break when not all information is known from Google DAI. We will dispatch
UpdateAdBreakEventwhen more information is known from Google DAI.
🐛 Issues
- Fixed an issue where the
player.mutedandplayer.volumeproperties were not preserved when setting a source when OptiView Ads is included. - Fixed an issue where
player.ads.playingwould returnfalsewhen joining a Google DAI stream in the middle of an advertisement. - Fixed an issue where the
TextTrackListEventTypes.REMOVE_TRACKevent listener would not trigger. - Fixed an issue where the
aspectRatioandvideoRectAPIs were not working correctly.
👎 Deprecations
- Deprecated return type of
metricsAPI. The type will change fromAny?toMetricswith the next major version.
Roku
✨ Features
- Added Google DAI support for OptiView Live streams.
🚀 10.2.2 (2025/10/14)
Web
🐛 Issues
- Fixed an issue where the
TheoAdDescription.adTagParameterswere not used for interstitial with theLSHAPE_CONTENTlayout on OptiView Ads.
Android
🐛 Issues
- Fixed an issue where the second and following Ad breaks were not playing for Optiview Ads.
iOS
🐛 Issues
- Fixed an issue where playing OptiView Streaming (THEOlive) streams could crash due to a race condition.
🚀 10.2.1 (2025/10/13)
Web
🐛 Issues
- Fixed an issue where the
TheoAdDescription.adTagParameterswere not used for backdrops on OptiView Ads. - Fixed a regression in Chromium-based browsers on macOS where HESP streams would sometimes fail to start.
- Fixed an issue where the player would not play any ads after the player has errored on playing a l-shape content interstitial during native fullscreen for an OptiView Ads stream.
- Fixed an issue where the player would show a black screen during native fullscreen when the player already errored on playing a l-shape content interstitial during native fullscreen and then switched back to inline playback for an OptiView Ads stream.
iOS
🐛 Issues
- Fixed an issue where the
THEOAdDescription.adTagParameterswere not used for backdrops on OptiView Ads.
🚀 10.2.0 (2025/10/09)
Web
✨ Features
- Added VAST ad support for Smart TVs with OptiView Ads.
- Added support for adding an authToken to OptiView live streams when casting (given that a cast receiver is used with the useShakaForHls flag set).
- The
@theoplayer/extendedpackage on npm now also supports OptiView Live streams. - Added support for adTagParameters on gamProperties for Overlays and backdropURIGamProperties for backdrops on OptiView Ads.
⚡ Improvements
- Improved the startup times on certain smart TVs.
- Improved the ABR to select higher resolutions on smart TVs whose
devicePixelRatiois greater than1.0. InterceptableRequest.redirect()and.respondWith()now accept iterables and nativeHeadersobjects when replacing the request/response headers.
🐛 Issues
- Fixed an issue where a VAST ad could be invisible in combination with OptiView Ads.
- Fixed an issue where the player shows a black screen when it tries to load an l-shape content interstitial during native fullscreen or native picture-in-picture for an OptiView Ads stream.
- Fixed an issue where the player would sometimes show a black screen instead of video while falling back on OptiView live streams.
- Fixed an issue where the seekable was not correct on certain HLS streams.
- Fixed an issue where the player would sometimes stall for a very short time on Safari right after starting playback on some HLS streams.
- Fixed an issue where old devices without WebAssembly support could not transmux MPEG-TS segments.
- Fixed an issue where an HLS live stream with a very short DVR window would stall immediately on iOS Safari when initiating playback.
- Fixed an issue where the player would not switch back to the content after playing back to back l-shape content interstitials on an OptiView Ads stream.
- Fixed an issue where OptiView live streams didn't start playing after a channel transitioned from offline to playing.
Android
✨ Features
- Added
Player.posterAPI for displaying the poster image in the player. - Added
CurrentSourceChangeEvent, which is dispatched when the player receives a new source fromSourceDescripion.sources. - Allow overriding
adTagParametersfor an individual overlay interstitial.
⚡ Improvements
- Increased the maximum number of HTTP 3xx redirects to follow to 20, to align with standard browser behavior.
🐛 Issues
- Setting
SourceDescription.posterwill now display the poster both in the player UI and when casting to Chromecast. - Fixed an issue where live streams on Chromecast would start at the beginning of their DVR window if the current time was unknown.
- Fixed an issue for OptiView Ads where the current time was incorrect during an ad break with
DOUBLElayout. - Fixed an issue where the
Content-Lengthheader was not available inHTTPResponse.headerswhen using the new default network stack. Note that when the response body is compressed, this header will still be unavailable. - Fixed an occasional
InterruptedExceptionbeing logged to Logcat while playing an LL-HLS stream when theLogger.Media3logs are enabled. - Fixed an issue where SVG overlay images might not be visible in an OptiView Ads stream.
- Fixed a regression where
Player.readyStatewas not updated while playing a Google IMA ad. - Fixed an issue where the selected text track would get disabled on multi-period DASH streams if the codec of the text tracks between the periods were different.
iOS
✨ Features
- Added
QualityandVideoQualityprotocols.ActiveQualityChangedEventnow has aqualityproperty. - Added the option to override
adTagParametersfor an individual overlay interstitial. - Added the CurrentSourceChangeEvent, which is dispatched when the player starts playing a new source.
- Added
qualitiesproperty toMediaTrack. - The player now dispatches
EncryptedEventandContentProtectionSuccessEventduring a DRM flow.EncryptedEventindicates the start of a DRM flow, whileContentProtectionSuccessEventindicates the success. UsePlayerEventTypes.ENCRYPTEDandPlayerEventTypes.CONTENT_PROTECTION_SUCCESSto listen to these events.
⚡ Improvements
- Reporting errors for THEOlive (OptiView Streaming) streams via CMCD headers
🐛 Issues
- Fixed an issue where THEOlive (OptiView Streaming) would not start playing after coming back from the background.
- Fixed an issue where deinitializing the player during the loading of a THEOlive (OptiView Streaming) stream would cause a crash.
Chromecast CAF
✨ Features
- Added support for adTagParameters on gamProperties for Overlays on OptiView Ads.
Roku
⚡ Improvements
- Improved URL rewriting in
THEOM3u8TagRemoverso relative URLs that begin with a slash are handled correctly.
🚀 10.1.1 (2025/09/30)
Web
🐛 Issues
- Fixed an issue where the player would run into a fatal decode error on HESP streams on Chromium based browsers without hardware acceleration.
🚀 10.1.0 (2025/09/24)
General
✨ Features
- Added the
adTagParametersproperty to OptiViewInterstitial.
Web
⚡ Improvements
- Added
segmenterrorandmanifesterrorevents to be used for detecting offline status.
🐛 Issues
- Fixed an issue where live streams on Chromecast would start at the beginning of their DVR window if the current time was unknown.
- Fixed an issue where the player would sometimes stall about 10 seconds after stream start on devices with slow appends on certain HLS streams.
👎 Deprecations
- Deprecated the
segmentnotfound,manifestnotfound,offline, andonlineevents. Use the newmanifesterrorandsegmenterrorevents to detect offline status. Use themanifestupdateevent to detect online status.
Android
✨ Features
- Added Google IMA VAST support to OptiView Ads.
🐛 Issues
- Fixed an issue where the player would crash with an
IllegalArgumentExceptionwhen playing certain low-latency HLS streams. - Fixed an issue where the player could stall indefinitely when enabling an embedded subtitle track containing no actual subtitles.
- Fixed an issue where some HLS streams with gzip compressed playlists failed to play when using the new default network stack on Android 14 or higher (or when using Cronet).
iOS
🐛 Issues
- Fixed an issue where the quartile events would not be dispatched for OptiView Ads.
- Fixed an issue where the player would not switch to the next adbreak when playing adbreak to adbreak with OptiView Ads.
- Fixed an issue that causes a crash after listening to
TextTrackListEventTypes.ADD_TRACKand loading webVTT subtitles in an app that is compiled using Swift 6 and is using@preconcurrency import THEOplayerSDK. - Fixed an issue where Dolby OptiView Streams would crash in a rare race condition during playback.
Roku
✨ Features
- Made the Conviva connector able take a new player instance after the previous instance was destroyed.
- Added
encoding_typeto custom metadata sent to Conviva.
🚀 10.0.1 (2025/09/16)
Android
🐛 Issues
- Fixed an issue where HTTP POST requests made by the player (such as DRM license requests) failed to be sent using the new default network stack on Android 14 or higher (or when using Cronet).
- Fixed
MillicastSourcereferencing types from the native Millicast SDK that were not correctly included in the published API of the Millicast integration.
🚀 10.0.0 (2025/09/12)
Announcing THEOplayer 10.0
We are happy to announce the tenth major version of THEOplayer, releasing all the improvements and developments our team has achieved since version 9.0.
THEOplayer 10.0 includes some breaking changes per SDK. Please review them carefully in the respective changelog for your SDK.
-
On Android, THEOplayer now always uses the Media3 pipeline for all playback, bringing bug fixes, performance improvements and increased stability across a wider range of devices! Check out our Media3 guide for more information.
-
The Android SDK will now automatically use modern network stacks with HTTP/2 and HTTP/3 support when available, optimizing media delivery to your viewers.
-
OptiView Ads is now fully supported on iOS. This brings our personalized advertising solution to all major platforms.
For more info on navigating our breaking changes, take a look at our migration guides for Web, Android, iOS and React Native.
Web
💥 Breaking Changes
- Removed
AdBreakEvent.ad, useAdBreakEvent.adBreakinstead. - Removed
THEOplayerAdDescriptiontype, useCsaiAdDescriptioninstead. - Removed
WebVTTRegion.identifier, useWebVTTRegion.idinstead. - Removed
PlayerConfiguration.vr. This configuration was already ignored since version 9.0.0, because the player always uses WebXR.- Note that
SourceDescription.vris not affected, and is still required to play a virtual reality source.
- Note that
- Removed
MediaTailorSource.adParams, useMediaTailorSource.adsParamsinstead. - Removed
PlayerConfiguration.verizonMedia, usePlayerConfiguration.uplynkinstead. - Removed
'verizon-media'as a valid source integration ID for Uplynk sources (previously Verizon Media). Uplynk sources must now have theirintegrationset to'uplynk'instead. - Removed THEOlive publication events (
publicationloadstart,publicationloadedandpublicationoffline), use the equivalent distribution events instead (distributionloadstart,endpointloadedanddistributionofflinerespectively). - Enabled
GoogleImaConfiguration.useAdUiElementForSsaiby default, allowing Google DAI to show additional ad UI elements on top of the player if needed (such as a skip button for skippable ads). - Removed support for THEOlive sources using
source.integration = 'theolive'. THEOlive sources must now have theirtypeset to'theolive'instead.
Android
💥 Breaking Changes
- Updated
minSdkto API 23 ("Marshmallow"). This aligns with other Android Jetpack libraries requiring API 23 as of June 2025. - Updated to target Kotlin 2.0 language level, to align with AndroidX Core 1.17.0. This requires Kotlin Gradle Plugin 2.0.0 or newer.
- Removed support for the legacy playback pipeline (using
TypedSource.playbackPipeline = PlaybackPipeline.LEGACY). The player will now always use the Media3 playback pipeline.- This brings down the
.aarsize of the Core SDK from ~33 MB to ~2 MB (excluding dependencies).
- This brings down the
- Removed support for the legacy cache backend (using
CachingParameters.storageType = CacheStorageType.LEGACY). All caching tasks will now use the Media3 cache backend, and any previously cached streams that used the legacy backend will need to be re-downloaded. - Changed
NetworkConfiguration.useHttpEngineto be enabled by default, allowing the player to switch to a modern network stack with HTTP/2 and HTTP/3 support if available. - Removed unused
GoogleDaiConfiguration.format. - Removed
MediaTailorSource.adParams, useMediaTailorSource.adsParamsinstead. - Removed the
DashPlaybackConfiguration.ignoreAvailabilityWindow()method, use the.ignoreAvailabilityWindowproperty instead. - Removed
KeySystemConfiguration.isUseCredentials, useKeySystemConfiguration.useCredentialsinstead. - Removed
ConaxDRMConfiguration.Builder.fairPlay(), useConaxDRMConfiguration.Builder.fairplay()instead. - Removed THEOlive publication events (
PublicationLoadStartEvent,PublicationLoadedEventandPublicationOfflineEvent), use the equivalent distribution events instead (DistributionLoadStartEvent,EndpointLoadedEventandDistributionOfflineEventrespectively). - Removed
THEOplayerGlobal.playbackSettings. This API is not supported in the Media3 playback pipeline. - Removed
SourceChangeEvent.playbackPipeline.
🐛 Issues
- Fixed an issue where a THEOlive stream would not start playing on
play()after first playing a different stream.
iOS
💥 Breaking Changes
- In an effort to align with the changes made by Apple regarding the App Store publishing policy, starting from THEOplayer 10.0 we will distribute our SDK builds using Xcode 16. Effectively, this means that developing a client application using THEOplayer iOS/tvOS SDK will require a minimum version of Xcode 16.
- Removed the flag
useLegacyPlaybackEnginein the initializer ofTHEOliveConfiguration. - Removed THEOlive publication events (
PublicationLoadStartEvent,PublicationLoadedEventandPublicationOfflineEvent), use the equivalent distribution events instead (DistributionLoadStartEvent,EndpointLoadedEventandDistributionOfflineEventrespectively). - Removed the
destroymethod. Instead, destroy the player by removing its referenceself.player = nil. - Removed the
setfrom the subscript of theTextTrackListAPI. TheTextTrackListis a read-only list.
✨ Features
- Added Google IMA VAST support to OptiView Ads.
Roku
💥 Breaking Changes
- Removed the
getHeadermethod from the Network API in favor of the newgetHeadersmethod.
⚡ Improvements
- Added the
getHeadersmethod to Network API. - Added protection against race conditions during destruction of the player.