# 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-962/theoplayer/web.md) [For desktop and mobile web browsers, and smart TVs like Tizen and WebOS](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/web.md) ## [OptiView Player Android SDK](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/android.md) [For smartphones, tablets and Android TVs](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/android.md) ## [OptiView Player iOS & tvOS SDK](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/ios.md) [For iPhone, iPad and Apple TV](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/ios.md) ## [OptiView Player React Native SDK](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/react-native.md) [For cross-platform apps targeting web, Android and iOS](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/react-native.md) ## [OptiView Player Flutter SDK](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/flutter.md) [For cross-platform apps targeting web, Android and iOS](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/flutter.md) ## [OptiView Player Chromecast SDK](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/chromecast.md) [For custom Chromecast receiver apps](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/chromecast.md) ## [OptiView Player Roku SDK](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/roku.md) [For Roku smart TVs](https://docs-preview.optiview.dolby.com/pr-962/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.15.0 (2026/11/04) ### General #### ⚡ Improvements * Renamed the CMCD Dolby audio capability key to `com.dolby.optiview-cap_dac` and reported its values as tokens. ### Web #### ✨ Features * Added the `ad`, `message` and `errorCode` properties to the `aderror` event, exposing information about the erroring ad, when available. * Added support for PATHWAY-CLONES in MPEG-DASH Content Steering. * Added experimental `player.ads.registerClientSideIntegration()` to register a custom client-side ad integration. * The integration schedules ads from a custom `AdDescription` (through the source description or `player.ads.schedule()`) and reports its ads and ad breaks. * The integration can also transform the source description in `setSource()`, in the same way as a custom server-side ad integration. * It plays linear ads either itself or through the player's built-in linear ad player. * An ad description whose `integration` is neither built in nor registered now fires an `aderror` event instead of being ignored. * Added `content` to the controller of custom server-side ad integrations (`player.ads.registerServerSideIntegration()`). It exposes the content's playback state and events, such as `currentTime`, `paused`, `readyState` and `error`. Integrations should use it instead of the top-level `ChromelessPlayer` API, whose state may be different when client-side ads are also in use. * Added `endAdBreak()` to the controller of custom server-side ad integrations. It ends the current ad break without removing it from the schedule. #### ⚡ Improvements * Improved the startup time of DRM-protected HLS streams with `EXT-X-SESSION-KEY` in the multivariant playlist: as is already done for DASH, the key system is set up and the license is requested while the media playlists are still loading. #### 🐛 Issues * Fixed an issue where no OptiView Ads ad break would play when an ID3 or EMSG signalled ad break started during the `initializationDelay`, as the Google DAI ad handler was never configured with the `networkCode` and `customAssetKey`. * The native picture-in-picture window now stays open when the player source changes to another source that is played the same way (for example from one HLS stream to another), and closes when the player stops or fails, on every browser with the standard picture-in-picture API (Safari, Chrome, Edge). * Fixed an issue where adding query parameters to a URL (for example LL-HLS delivery directives) re-encoded the existing query parameters, which could break signed CDN tokens. * Fixed AirPlay not starting for OptiView Live Streaming (THEOlive) channels that offer both HESP and HLS. * Fixed an issue where Google IMA client-side ads were not requested on Tizen, webOS and Vizio, and where Google DAI streams did not play on Vizio. * Fixed an issue where the player could not be created on LG webOS and Samsung Tizen when Google's DAI SDK for CTV (dai\_ctv.js) was loaded without its platform library. The player now logs a warning and falls back to ima3\_dai.js when it is loaded. * Fixed an issue where the player did not switch back to a higher quality after a temporary bandwidth drop on low-latency HLS streams with preload hints, such as OptiView Live Streaming. * Fixed an issue where the latency manager could stop adjusting the latency of an LL-HLS stream for the rest of the session after the player jumped back to the live edge during a stall. * Fixed an issue where an OptiView Live Streaming source with a backup sometimes kept showing a frozen picture instead of switching to the backup when its main stream stopped. * Fixed an issue where the player could keep seeking to the live point many times per second when a live HLS stream stopped updating. * Fixed an issue where `player.errorObject` and `player.error` kept reporting a previous Google DAI stream error after a new source was set. * Fixed a breaking change introduced in 11.14.0 where OptiView Real-time Streaming (Millicast) sources no longer subscribed to the `viewercount` and `vad` broadcast events by default. When `connectOptions.events` (or `TheoLiveSource.webrtc.events`) is not set, all events are subscribed again. To opt out of the optional events, set `connectOptions: { events: [] }`; the player always keeps the events it needs (`active`, `inactive`, `stopped`, `layers`, `migrate`). * Fixed an issue where the content resumed at the wrong position after a multi-ad OptiView Ads break played in iOS Safari native fullscreen with content replacement. ### Android #### ✨ Features * Added support for Google DAI pause ads, which can be enabled with `GoogleImaConfiguration.enablePauseAds` and delayed with `GoogleImaConfiguration.pauseAdDelayMs`. * Added `SourceLatencyConfiguration`, which takes precedence over `TypedSource.latencyConfiguration` if specified. Unlike `LatencyConfiguration`, its `targetOffset`, `minimumOffset`, `maximumOffset` and `forceSeekOffset` are optional. * Added `events` to `WebRTCOptions` and support for `Option.events` on `MillicastSource`, to choose which OptiView Real-time Streaming (Millicast) events the player subscribes to, for example to opt out of `viewercount`. #### ⚡ Improvements * OptiView Live HLS streams now adjust the playback rate between `0.92` and `1.08` to stay at their target latency, like HESP streams. * Reduced the initial latency of OptiView Live Streaming HLS streams: playback now starts exactly at the target live offset instead of up to a segment further behind the live edge. Other low-latency HLS sources can opt in with `HlsPlaybackConfiguration.preciseLiveStart`. #### 🐛 Issues * Fixed DRM-protected sources failing to play when casting from Android to the CAF receiver. ### iOS #### 💥 Breaking Changes * 11.15.0 is the last version of the OptiView Player iOS SDK and its integrations that is published to the CocoaPods public spec repo (trunk). Newer versions will only be published to our self-hosted spec repo at . * If you install the SDK with CocoaPods, add `source 'https://github.com/THEOplayer/cocoapods-specs'` to your `Podfile` to keep receiving updates. See [Using the OptiView Player CocoaPods spec repo](https://docs-preview.optiview.dolby.com/pr-962/theoplayer/getting-started/sdks/ios/cocoapods-spec-repo.md) for the required `Podfile` changes. * As announced in 11.0.0, this change follows [the planned read-only change to the CocoaPods public spec repo](https://blog.cocoapods.org/CocoaPods-Specs-Repo/). * Swift Package Manager users are not affected. #### ✨ Features * Added `events` to `WebrtcOptions` and support for `MCClientOptions.events` on `MillicastSource`, to choose which OptiView Real-time Streaming (Millicast) events the player subscribes to, for example to opt out of `viewercount`. * Added the `ads` property to the OptiView Live Streaming (THEOlive) `DistributionAPI`, which provides the OptiView Ads manifest URL (`adsManifestUrl`). #### ⚡ Improvements * Casting DRM-protected OptiView Live channels to a Chromecast CAF receiver forwards the Widevine service certificate supplied by discovery, avoiding an extra certificate request. #### 🐛 Issues * Fixed `SourceAbrConfiguration.maxBitrate` not being applied to HLS sources. * Fixed an issue where the player could crash when it was released while the app was in the background, in apps without an app delegate window such as SwiftUI apps. * Fixed an issue where OptiView Live Streaming (THEOlive) HLS playback could stay frozen without recovering, either right after startup or after the active endpoint stopped serving. * Fixed an issue where the `theoLive.authToken` was only sent as an `Authorization` header to OptiView Live Streaming hosts, so manifest and segment requests to third-party CDNs were missing it. The header is now sent on all manifest and segment requests, and no longer on channel discovery requests. ### Chromecast CAF #### ⚡ Improvements * Chromecast CAF Shaka playback uses a supplied Widevine service certificate to avoid an extra certificate request when available. ### Roku #### ⚡ Improvements * Expose the selected OptiView Live Streaming endpoint's optional ad system in endpointloaded events. #### 🐛 Issues * Fixed an issue where the MediaKind connector would send session beacons while an OptiView Live Streaming source was playing a non-MediaKind endpoint. ## 🚀 11.14.1 (2026/10/28) ### Web #### 🐛 Issues * Fixed an issue where FairPlay-protected HLS streams in Safari 18 and later stopped with an HDCP output protection error, for example while screen mirroring an iPhone or iPad. ### Android #### ⚡ Improvements * Improved the start-up time of OptiView Live Streaming (THEOlive) HLS streams by preparing playback directly from the multivariant playlist. Other HLS sources can opt in with `HlsPlaybackConfiguration.isChunklessPreparationAllowed`. * Added `HlsPlaybackConfiguration.preacquireDrmFromSessionKeys` to start the DRM license request from the `EXT-X-SESSION-KEY` tags in the multivariant playlist, which can reduce startup time of protected HLS streams. This is always enabled for OptiView Live Streaming. ## 🚀 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 `