# Dolby OptiView Player
> Dolby OptiView Player (formerly THEOplayer) enables you to deploy cutting-edge video playback experiences on any device. Use the basic default UI, customize your player with Open Video UI's ready-made components, or build a complete UI from scratch with the chromeless player.
# OptiView Player
> **OptiView Rebranding**
>
> OptiView Player is the new name for THEOplayer as part of the OptiView product suite. During the transition, you may still see references to THEOplayer. OptiView Player and THEOplayer refer to the same product.
Dolby OptiView Player is the universal video player solution from Dolby. It offers support for HLS, MPEG-DASH, advertisements, DRM and much more.
On these pages, you'll learn how to get started with Dolby OptiView Player, how to use the various features, and explore the many examples.
## [OptiView Player Web SDK](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/web.md)
[For desktop and mobile web browsers, and smart TVs like Tizen and WebOS](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/web.md)
## [OptiView Player Android SDK](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/android.md)
[For smartphones, tablets and Android TVs](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/android.md)
## [OptiView Player iOS & tvOS SDK](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/ios.md)
[For iPhone, iPad and Apple TV](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/ios.md)
## [OptiView Player React Native SDK](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/react-native.md)
[For cross-platform apps targeting web, Android and iOS](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/react-native.md)
## [OptiView Player Flutter SDK](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/flutter.md)
[For cross-platform apps targeting web, Android and iOS](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/flutter.md)
## [OptiView Player Chromecast SDK](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/chromecast.md)
[For custom Chromecast receiver apps](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/chromecast.md)
## [OptiView Player Roku SDK](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/roku.md)
[For Roku smart TVs](https://docs-preview.optiview.dolby.com/pr-932/theoplayer/roku.md)
---
# Changelog
These are the release notes for THEOplayer 11.0.0 and higher. For older versions, see:
* [Version 10.x](https://optiview.dolby.com/docs/theoplayer/v10/changelog/)
* [Version 9.x](https://optiview.dolby.com/docs/theoplayer/v9/changelog/)
* [Version 8.x](https://optiview.dolby.com/docs/theoplayer/v8/changelog/)
* [Version 7.x](https://optiview.dolby.com/docs/theoplayer/v7/changelog/)
* [Version 5.x and 6.x](https://optiview.dolby.com/docs/theoplayer/v6/changelog/)
* [Version 2.x, 3.x and 4.x](https://optiview.dolby.com/docs/theoplayer/v4/changelog/)
## 🚀 11.14.0 (2026/10/20)
### Web
#### ✨ Features
* Added experimental `player.recreateMediaSource()` to rebuild the media pipeline in place, for example after an external ad engine used the decoder on VIZIO.
* Added the `adSystem` property to the OptiView Live Streaming (THEOlive) `Endpoint` API.
#### ⚡ Improvements
* Improved the transitions of OptiView Ads between back-to-back ad breaks with different layouts, such as from a double box to an L-shape.
* Improved the startup time of OptiView Live Streaming DRM streams on Tizen by preferring PlayReady over Widevine when `contentProtection.preferredKeySystems` is not set.
* Improved the performance of the extraction of embedded CEA-608/708 closed captions in HLS and DASH streams.
* HLS variant streams that declare `CLOSED-CAPTIONS=NONE` are no longer scanned for embedded CEA-608/708 closed captions.
* Improved the startup time of DRM-protected HLS streams whose `EXT-X-KEY` or `EXT-X-SESSION-KEY` tags carry the PSSH in a base64 `data:` URI, which is now decoded directly instead of being requested over `fetch` or `XMLHttpRequest`.
* Improved CMCD reporting for Dolby Atmos.
* Made the list of subscribed OptiView Real-time Streaming (Millicast) broadcast events configurable through `connectOptions.events` (and `TheoLiveSource.webrtc.events` for OptiView Live Streaming WebRTC sources). The player always subscribes to the events it needs (`active`, `inactive`, `stopped`, `layers`, `migrate`). Optional events such as `viewercount` and `vad` are no longer subscribed by default; add them from the application when needed, e.g. `connectOptions: { events: ['viewercount'] }`.
#### 🐛 Issues
* Fixed an issue where the player could collapse to a height of 0 when playing an OptiView Ads source. If the size of the player is not determined by its parent element (for example, when only its width is set), the player now sizes to the intrinsic size of the video that is currently playing, either the content or the ad.
* Fixed an issue where TTML `begin` and `end` time expressions on an element inside a timed parent container (e.g. a `
` inside a `
`) were resolved as absolute media times instead of relative to the parent's begin, as required by the TTML specification. Fractional offset-time expressions such as `2.5s` are now also resolved exactly instead of being truncated to whole units.
* Fixed an issue where, after a Google IMA mid-roll, the content resumed at the wrong position, equal to the last ad's duration, on iOS Safari with `allowNativeFullscreen` enabled.
* Fixed an issue where the content kept playing after a blocking ad error when `blockContentIfAdError` is enabled.
* Fixed an issue where `fatalError()` on custom server-side ad integrations would not stop playback.
* Fixed an issue where CEA-608 caption rows could overlap, for example on a small player with a large `textTrackStyle.marginBottom` or on a player wider than 16:9. Captions now move only as far as needed to stay clear of the margins, and the text only gets smaller when the rows would otherwise overlap or not fit between the margins.
* Fixed an issue where seeking to the live point of an LL-HLS stream could cause the latency manager to stop adjusting the latency.
#### ⚠ Known Limitations
* When the size of the player is not determined by its parent element, the player keeps the intrinsic size of the content during OptiView Ads ad breaks that are played through Google IMA (VAST ads), rather than sizing to the ad.
### Android
#### ✨ Features
* Added support for OptiView Live Streaming (THEOlive) distributions protected with Castlabs DRMtoday Widevine.
* Added `src` and `srcType` properties to the OptiView Live Streaming (THEOlive) `Endpoint` API.
* Added `Player.errorObject`, which returns the last error that occurred for the current source as a `THEOplayerException`.
#### ⚡ Improvements
* Improved CMCD reporting for Dolby Atmos.
* Enable adjusting playback rate for low-latency HLS streams provided through OptiView Live sources.
#### 🐛 Issues
* Fixed an issue where casting a DRM-protected source to the OptiView Streaming (THEOplayer) CAF Chromecast receiver failed. The source's DRM configuration is now also sent under the `contentProtection` key, alongside `drm`.
* Fixed an issue where switching rendering targets during playback could cause a decoding error.
* Fixed a `ClassCastException` when creating a `THEOplayerView` in Android Studio's layout editor or a Compose preview.
* Fixed an issue where `TextTrackCue.content` was malformed due to `endTime` being `Double.POSITIVE_INFINITY` for ID3 cues.
### iOS
#### ✨ Features
* Added support for OptiView Live Streaming (THEOlive) distributions protected with Castlabs DRMtoday FairPlay.
* Added `src`, `srcType`, `provider` and `adSystem` properties to the OptiView Live Streaming (THEOlive) `EndpointAPI`.
* Added `errorObject` instance property to `THEOplayer`, which returns the player error for the current source as a `THEOError`.
#### ⚡ Improvements
* Exposed the getter for `SourceLatencyConfiguration.targetOffset`.
* Errors caused by Apple's frameworks now keep Apple's original error as their `cause`, in a `GenericSwiftError`, and their message includes Apple's error domain, code and description. `GenericSwiftError.name` is now `Swift error`.
* The error `AVPlayerItem failed to play to end time.` now includes Apple's error in its message, and keeps Apple's error as its `cause`.
* A failed DRM key request is now always reported as a `ContentProtectionError`, together with a `ContentProtectionErrorEvent`. When a custom DRM integration reports an error for a certificate or license response, the error includes that response's URL, HTTP status, status text and body.
* The error `Something went wrong while trying to play the content.` now includes Apple's error in its message, and keeps Apple's error as its `cause`.
* Improved CMCD reporting for Dolby Atmos.
* The OptiView Player iOS and tvOS SDKs and their integrations are now built with Xcode 26.6 (Swift 6.3) instead of Xcode 26.3 (Swift 6.2.3). This is a build tool update only: the public API, SDK behavior and the minimum supported iOS and tvOS version (15.0) are unchanged. This change is backward compatible with apps built with Xcode 26.3.
* The stall error (`Stalled for more than 10 seconds with N errors.`) now includes the newest fatal error from Apple's error log in its message, and keeps that error as its `cause`.
* Network errors (6000) now include the URL and HTTP status of the request that failed, and Apple's error in their message, and keep Apple's error as their `cause`.
* Errors now use the most precise error code for Apple's error, instead of 5003 for most failures: a playlist that can't be parsed or isn't HLS gives 4002 (`MANIFEST_PARSE_ERROR`), a timeout gives 6001 (`NETWORK_TIMEOUT`), an HTTP or other connection error gives 6000 (`NETWORK_ERROR`), broken media data gives 5002 (`MEDIA_DECODE_ERROR`), an unsupported format gives 5000 (`MEDIA_NOT_SUPPORTED`), and a media services reset or running out of memory gives 5005 (`MEDIA_INTERNAL_ERROR`). Every 6000 error is now a `NetworkError`.
* DRM errors now use the code of the step that failed instead of 7000: 7005 for the certificate, 7004 for the content ID or the license request, 7007 for getting the license, and 7008 when the license isn't accepted. The message says which step failed, for example `Content key error: Failed to get the license.`
* `ErrorEvent.error`, `ErrorEvent.errorObject.message` and `THEOplayer.error` now contain the same, more detailed message.
#### 🐛 Issues
* Fixed a runtime warning on iOS 27 related to the orientation API.
* Fixed casting DRM-protected OptiView Live Streaming (THEOlive) channels to Chromecast CAF receiver from iOS.
* Fixed an issue where one failure could send two or more fatal `ErrorEvent`s. Only the first fatal error for a source is sent now. A network error the player recovers from no longer sets `THEOplayer.error`.
* Fixed an issue where the `ErrorEvent` for a source that failed to load had no `errorObject`. It now has one, with Apple's error as its `cause`.
* Fixed an issue where a failed FairPlay key request was reported as error 7000 without the reason. The error now includes Apple's or the DRM integration's error in its message, and keeps that error as its `cause`.
* Fixed an issue where the FairPlay certificate and license requests made by the SDK accepted a response with HTTP status 400 or higher. The request now fails right away, and the `ContentProtectionError` includes the URL, HTTP status and response.
* Fixed an issue where a playback error on the Chromecast receiver was reported with the unclear message `CC died` and without an error object. It is now reported as error 5001 (`MEDIA_LOAD_ERROR`) with a message that describes the problem, and the Cast details (idle reason and media session ID) are available in the error object's `cause`.
#### 👎 Deprecations
* `ErrorEvent.error` is deprecated, use `ErrorEvent.errorObject.message` instead.
* `ErrorEvent.errorObject` will become non-optional in a future major release.
* `THEOplayer.error` is deprecated, use `THEOplayer.errorObject?.message` instead.
### Chromecast CAF
#### ⚡ Improvements
* Improved CMCD reporting for Dolby Atmos.
### Roku
#### ✨ Features
* The MediaKind connector's session beacon error event now includes all available response details.
* Added support for program end tags for MediaKind streams, filling in previously missing program information for the previous program.
#### ⚡ Improvements
* Improved CMCD reporting for Dolby Atmos.
## 🚀 11.13.0 (2026/10/07)
### Web
#### ✨ Features
* Added `ABRConfiguration.preferredMaximumResolution`, which allows to dynamically cap the resolution selected for OptiView Real-time streams.
* Added support for using `SourceAbrConfiguration.restrictToPlayerSize` with OptiView Real-time streams.
#### ⚡ Improvements
* The player now always wraps its media elements in container elements inside the player element, instead of only for OptiView Ads sources.
* The `theo-ads-sgai-container`, `theo-ads-sgai-content-player` and `theo-ads-sgai-ad-player` classes are still applied while an OptiView Ads source is active.
* When using `ChromelessPlayer`, CSS or scripts that expect the `