> ## Documentation Index
> Fetch the complete documentation index at: https://developer.bitmovin.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Release Notes (Android)

Android SDK Release Notes

Release notes for the v2 version of the Android SDK can be found [here](https://developer.bitmovin.com/playback/page/android-sdk-v2-release-notes).

***

## 3.155.1

Released: 2026-06-19

**Fixed**

* Potentially missing or incomplete [`PlayerEvent.AdQuartile`](https://cdn.bitmovin.com/player/android/3.155.1/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-quartile/index.html) and [`PlayerEvent.AdFinished`](https://cdn.bitmovin.com/player/android/3.155.1/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-finished/index.html) events for IMA VMAP ads

***

## 3.155.0

Released: 2026-06-12

**Added**

* Experimental [`LowLatencyApi.getTargetPlaybackLatency`](https://cdn.bitmovin.com/player/android/3.155.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/get-target-playback-latency.html) to expose the target playback latency

**Fixed**

* Missing `impression`, `start`, and `complete` tracking events for VAST ad pods and asset-list HLS interstitials with multiple assets when [`AdvertisingConfig.enableGaplessAdPlayback`](https://cdn.bitmovin.com/player/android/3.155.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/enable-gapless-ad-playback.html) is enabled
* A potential crash when loading a new source after calling [`Player.unload`](https://cdn.bitmovin.com/player/android/3.155.0/docs/player-core/com.bitmovin.player.api/-player/unload.html) with [`DecoderConfig.delayDecodingUntilPlayback`](https://cdn.bitmovin.com/player/android/3.155.0/docs/player-core/com.bitmovin.player.api.decoder/-decoder-config/delay-decoding-until-playback.html) enabled
* Potential duplicate HLS interstitial ASSET-LIST requests during repeated ad schedule updates

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3280) dependency to version `3.28.0`

**Removed**

* `TweaksConfig.enableLiveEdgeDriftCorrectionForHlsInterstitials`, live edge drift correction for HLS Interstitials is now enabled by default

***

## 3.154.0

Released: 2026-05-29

**Added**

* [`StartPositionCorrection`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-core/com.bitmovin.player.api.event/-source-event/-start-position-correction/index.html), emitted when live playback start position drift is corrected before playback begins
* An optional `player-ui-web-compose` module with an experimental Compose `PlayerView` wrapper

**Fixed**

* Incorrect `prepared` Web UI CSS class on the player UI container applied during pre-roll ads when autoplay is enabled. As a result the `Loaded` event is no longer received by the Bitmovin Web UI during Ads, as was already the case on iOS
* Prevent live playback startup from triggering an additional internal start-position correction after entering a stalled state
* Setting the same `CustomMessageHandler`, [`FullscreenHandler`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-ui-web/com.bitmovin.player.api.ui/-fullscreen-handler/index.html), [`PictureInPictureHandler`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-ui-web/com.bitmovin.player.api.ui/-picture-in-picture-handler/index.html), or [`PlayerView.scalingMode`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-ui-web/com.bitmovin.player/-player-view/scaling-mode.html) value on [`PlayerView`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-ui-web/com.bitmovin.player/-player-view/index.html) no longer reconfigures handlers or emits redundant [`ScalingModeChanged`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-scaling-mode-changed/index.html) events
* [`SubtitleTrack.isDefault`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-core/com.bitmovin.player.api.media/-track/is-default.html) always being `false` for side-loaded subtitle tracks in [`Source.availableSubtitleTracks`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-core/com.bitmovin.player.api.source/-source/available-subtitle-tracks.html) and [`Player.availableSubtitles`](https://cdn.bitmovin.com/player/android/3.154.0/docs/player-core/com.bitmovin.player.api/-player/available-subtitles.html)

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3270) dependency to version `3.27.0`

***

## 3.153.0

Released: 2026-05-08

**Added**

* Common Media Client Data v1 support through [`SourceConfig.cmcdConfig`](https://cdn.bitmovin.com/player/android/3.153.0/docs/player-core/com.bitmovin.player.api.source/-source-config/cmcd-config.html) for DASH, HLS, and Smooth source playback
* [`CmcdConfig`](https://cdn.bitmovin.com/player/android/3.153.0/docs/player-core/com.bitmovin.player.api.source/-cmcd-config/index.html), [`CmcdSessionId`](https://cdn.bitmovin.com/player/android/3.153.0/docs/player-core/com.bitmovin.player.api.source/-cmcd-session-id/index.html), and [`CmcdKey.Predefined`](https://cdn.bitmovin.com/player/android/3.153.0/docs/player-core/com.bitmovin.player.api.source/-cmcd-key/-predefined/index.html) to configure CMCD per source

**Fixed**

* Prevent poster image updates while playback is active to avoid showing poster during playback
* Main content subtitles shown during ad breaks when using [`SubtitleView`](https://cdn.bitmovin.com/player/android/3.153.0/docs/player-core/com.bitmovin.player/-subtitle-view/index.html)

***

## 3.152.0

Released: 2026-05-04

**Added**

* [`MediaSessionSourceConfig`](https://cdn.bitmovin.com/player/android/3.152.0/docs/player/com.bitmovin.player.api.media.session/-media-session-source-config/index.html) to set the [`MediaMetadata`](https://cdn.bitmovin.com/player/android/3.152.0/docs/player-media-session/com.bitmovin.player.api.media.session/-media-metadata/index.html) of a `Source` to specify `MediaSession` metadata

**Fixed**

* Fixed R8 missing-class failures when using the `player` artifact without the optional `player-media-session` dependency
* Improve live-stream start position accuracy after preroll ad playback
* Add \[TweaksConfig.enableLiveEdgeDriftCorrectionForHlsInterstitials] to avoid drifting from the live edge when playing HLS Interstitials

***

## 3.151.0

Released: 2026-04-24

**Added**

* A setter for [`MediaSession.player`](https://cdn.bitmovin.com/player/android/3.151.0/docs/player-media-session/com.bitmovin.player.api.media.session/-media-session/player.html) to change player without recreating the media session

**Fixed**

* Some HLS interstitials aren’t scheduled in live streams with a sliding window
* HLS Interstitials `X-PLAYOUT-LIMIT` updates via `EXT-X-DATERANGE` update not applied if the ad break has already started playing
* Casting live streams now reports an epoch-based [`Player.playbackTimeOffsetToAbsoluteTime`](https://cdn.bitmovin.com/player/android/3.151.0/docs/player-core/com.bitmovin.player.api/-player/playback-time-offset-to-absolute-time.html) instead of `0`

***

## 3.150.0

Released: 2026-04-20

**Added**

* Support [`PlayerEvent.PictureInPictureEntered`](https://cdn.bitmovin.com/player/android/3.150.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-picture-in-picture-entered/index.html) and [`PlayerEvent.PictureInPictureExited`](https://cdn.bitmovin.com/player/android/3.150.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-picture-in-picture-exited/index.html) which indicate the PiP transition is completed

**Fixed**

* Prevent delayed live stream loads from triggering an extra start-position correction after playback has already begun
* [`PlayerViewConfig.hideFirstFrame`](https://cdn.bitmovin.com/player/android/3.150.0/docs/player-ui-web/com.bitmovin.player.api.ui/-player-view-config/hide-first-frame.html) being ignored for live streams and VOD streams with `startOffset`
* Main content may briefly start before HLS interstitial or [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.150.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html) pre-roll ads when [`PlaybackConfig.isAutoplayEnabled`](https://cdn.bitmovin.com/player/android/3.150.0/docs/player-core/com.bitmovin.player.api/-playback-config/is-autoplay-enabled.html) is `true`
* [`SourceConfig.labelingConfig`](https://cdn.bitmovin.com/player/android/3.150.0/docs/player-core/com.bitmovin.player.api.source/-source-config/labeling-config.html) not applied to audio/subtitle tracks on a cast receiver
* Align ad playback audio behavior with normal playback in CSAI scenarios by honoring configured audio focus loss and audio output changes
* Intermittent crashes during playback of Nagra PRM protected content

***

## 3.149.0

Released: 2026-04-10

**Added**

* Experimental [`DecoderConfig.delayDecodingUntilPlayback`](https://cdn.bitmovin.com/player/android/3.149.0/docs/player-core/com.bitmovin.player.api.decoder/-decoder-config/delay-decoding-until-playback.html) that defers video decoder initialization until playback starts

* Experimental [`AdvertisingConfig.enableGaplessAdPlayback`](https://cdn.bitmovin.com/player/android/3.149.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/enable-gapless-ad-playback.html) to enable earlier ad media preloading for smoother transitions into and between ads

**Fixed**

* Incorrect main content resume offset for asset-list interstitials with `X-PLAYOUT-LIMIT` cutoff

***

## 3.148.0

Released: 2026-04-03

**Added**

* [`InterstitialAdBreak`](https://cdn.bitmovin.com/player/android/3.148.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials/-interstitial-ad-break/index.html) to expose HLS interstitial specific information about ad breaks

  * [`InterstitialAdBreak.plannedDuration`](https://cdn.bitmovin.com/player/android/3.148.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials/-interstitial-ad-break/planned-duration.html) to expose the planned duration of HLS interstitial ad breaks
    Access the interstitial related information by casting the [`AdBreak`](https://cdn.bitmovin.com/player/android/3.148.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-break/index.html) of [`PlayerEvent.AdBreakStarted`](https://cdn.bitmovin.com/player/android/3.148.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-break-started/index.html):

  ```kotlin
  player.on<PlayerEvent.AdBreakStarted> {
      val interstitialAdBreak = it.adBreak as? InterstitialAdBreak ?: return@on

      val plannedDuration = interstitialAdBreak.plannedDuration
  }
  ```

***

## 3.147.0

Released: 2026-03-27

**Added**

* Support for VAST fullscreen/fullscreenExit and playerExpand/playerCollapse tracking via [`Ad.expanded`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.advertising/-ad/expanded.html) and [`Ad.collapsed`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.advertising/-ad/collapsed.html) callbacks for [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html)
* Support for VMAP ad break tracking in IMA passthrough mode [`AdSourceType.Ima`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-ima/index.html) with [`bitmovinAdTagLoading=true`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-item/bitmovin-ad-tag-loading.html))
* `player.playlist.seek(source: Source, seekTarget: SeekTarget?)` to seek to a specific or default position of the specified source in a [`playlist`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.playlist/-playlist-api/index.html)
  This allows seeking precisely into and between two livestreams

**Fixed**

* [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) not disabling main content decoding for Bitmovin and HLS Interstitial ads on devices that only support a single video decoder
* Switching the UI mode to main-content while a pre-roll ad is playing, when the `Source.Loaded` event of the main asses is emitted after an ad already started

**Changed**

* Kotlin version to `2.2.21`
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3251) dependency to version `3.25.1`
* Updated Bitmovin Player Web UI dependency to `4.10.2`
* [`SourceLiveConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html) no longer overrides [`SourceOptions.startOffset`](https://cdn.bitmovin.com/player/android/3.147.0/docs/player-core/com.bitmovin.player.api.source/-source-options/start-offset.html)

***

## 3.146.0

Released: 2026-03-16

**Added**

* Support for VMAP ad break tracking events for [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.146.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html) ads

**Fixed**

* [`Player.lowLatency`](https://cdn.bitmovin.com/player/android/3.146.0/docs/player-core/com.bitmovin.player.api/-player/low-latency.html) incorrectly affecting the previous source during [`PlaylistTransition`](https://cdn.bitmovin.com/player/android/3.146.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-playlist-transition/index.html) instead of the new one
* [`NetworkConfig.retryHttpRequestConfig`](https://cdn.bitmovin.com/player/android/3.146.0/docs/player-core/com.bitmovin.player.api.network/-network-config/retry-http-request-config.html) is not applied to failing Widevine DRM license requests, and to DRM license renewals when [`TweaksConfig.enableDrmLicenseRenewRetry`](https://cdn.bitmovin.com/player/android/3.146.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-drm-license-renew-retry.html) is enabled

***

## 3.145.0

Released: 2026-03-06

**Added**

* Allow toggling [`PlayerEvent.FrameAboutToBeRendered`](https://cdn.bitmovin.com/player/android/3.145.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-frame-about-to-be-rendered/index.html) event emission at runtime via [`Player.isFrameAboutToBeRenderedEventEnabled`](https://cdn.bitmovin.com/player/android/3.145.0/docs/player-core/com.bitmovin.player.api/-player/is-frame-about-to-be-rendered-event-enabled.html)

**Fixed**

* Avoid Cast SDK initialization failures on unsupported devices when casting is enabled via [`RemoteControlConfig.isCastEnabled`](https://cdn.bitmovin.com/player/android/3.145.0/docs/player-core/com.bitmovin.player.api.casting/-remote-control-config/is-cast-enabled.html)

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3241) dependency to version `3.24.1`
* Updated `gson` from `2.12.1` to `2.13.2`
* Preload HLS Interstitial asset list and Interstitial custom attributes when the forward buffer reaches the Interstitial schedule position
* [`RemoteControlApi.isCastAvailable`](https://cdn.bitmovin.com/player/android/3.145.0/docs/player-core/com.bitmovin.player.api.casting/-remote-control-api/is-cast-available.html) now always returns `true` when [`RemoteControlConfig.isCastEnabled`](https://cdn.bitmovin.com/player/android/3.145.0/docs/player-core/com.bitmovin.player.api.casting/-remote-control-config/is-cast-enabled.html) is set to `true`. Changes in the Android Cast framework made device discovery unreliable, causing `isCastAvailable` to report `false` even when cast devices were
  nearby. The cast button in the player UI is now always visible when casting is enabled

**Removed**

* Remove `TweaksConfig.enableFrameAboutToBeRenderedEvent` in favor of [`Player.isFrameAboutToBeRenderedEventEnabled`](https://cdn.bitmovin.com/player/android/3.145.0/docs/player-core/com.bitmovin.player.api/-player/is-frame-about-to-be-rendered-event-enabled.html)

***

## 3.144.0

Released: 2026-03-02

**Added**

* Support for viewable impression tracking for HLS Interstitials
  * [`InterstitialTrackingEventTrigger.Viewable`](https://cdn.bitmovin.com/player/android/3.144.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials.tracking/-interstitial-tracking-event-trigger/-viewable/index.html) to track viewable impressions for Interstitials
  * [`InterstitialTrackingEventTrigger.NotViewable`](https://cdn.bitmovin.com/player/android/3.144.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials.tracking/-interstitial-tracking-event-trigger/-not-viewable/index.html) to track non-viewable impressions for Interstitials
  * [`InterstitialTrackingEventTrigger.ViewUndetermined`](https://cdn.bitmovin.com/player/android/3.144.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials.tracking/-interstitial-tracking-event-trigger/-view-undetermined/index.html) to track undetermined viewability for Interstitials
* [`RetryPlaybackAction.DisableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.144.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-action/-disable-main-content-decoding-during-ads/index.html) to disable main content decoding during ads on devices that only support a single video decoder, which may improve ad playback stability at the cost of potential increased ad load times
* [`RetryPlaybackContext.suggestedAction`](https://cdn.bitmovin.com/player/android/3.144.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-context/suggested-action.html) to provide a suggested action for retrying playback after an error, which may include [`RetryPlaybackAction.DisableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.144.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-action/-disable-main-content-decoding-during-ads/index.html) when applicable

**Fixed**

* Side-loaded subtitle tracks showing the language code instead of the configured label when the source is HLS
* HLS manifest subtitle tracks using the language code as label instead of the human-readable `NAME` attribute
* Rebuffers at transitions from VOD to live content caused by live start-position projection updates

**Changed**

* Integrated changes from `Media3 ExoPlayer` version `1.9.2`
* Bitmovin Advertising Module now tracks viewable impressions when at least 50% of the ad view group is visible for at least 2 consecutive seconds of playback. It tracks non-viewable impressions otherwise
* [`RetryPlaybackConfig.retryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.144.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-config/retry-playback-callback.html) to allow overriding the default retry playback behavior. By default, the player will suggest to retry once but this can be customized to suggest different actions or no retry based on the use case (fail fast vs always retry)

**Removed**

* `TweaksConfig.relaxedPeriodDiscardingForLiveStreams` as this is now always enabled

***

## 3.143.0

Released: 2026-02-20

**Added**

* Add [`AdvertisingConfig.shouldLoadAdItem`](https://cdn.bitmovin.com/player/android/3.143.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/should-load-ad-item.html) callback to discard scheduled ads before loading

**Fixed**

* During failed playback retries, [`PlayerEvent.Error`](https://cdn.bitmovin.com/player/android/3.143.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) now reports the original rendering error code that triggered the retry instead of the retry-attempt error code
* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.143.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) returning wrong thumbnails since 3.129.0 for WebVTT/HLS Image Media Playlists
* Send a DurationChanged event when duration update is detected while casting

**Changed**

* Enable by default support for client-side and server-guided ad playback on devices that only support a single video decoder by changing [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.143.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) default to `null` instead of `true`.
  See 3.142.0 changelog for more details
* Update Bitmovin Player Web UI dependency to 4.8.1

***

## 3.142.0

Released: 2026-02-13

**Added**

* [`LowLatencyApi.producerReferenceTimeInfo`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/producer-reference-time-info.html) that exposes [`ProducerReferenceTimeInfo`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api.live/-producer-reference-time-info/index.html) based on the `ProducerReferenceTime` element in the DASH manifest
* [`ProducerReferenceTimeInfo.offsetToAvailabilityStartTime`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api.live/-producer-reference-time-info/offset-to-availability-start-time.html) that exposes the offset in seconds between the MPD's `availabilityStartTime` and the producer reference wall-clock time at the start of the MPD presentation timeline. In combination with [`LowLatencyApi.latency`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/latency.html) This value can be used to calculate the End-to-End latency
  * Usage:
  ```kotlin
  val prftToAvailabilityTimeOffset = player.lowLatency.producerReferenceTimeInfo?.offsetToAvailabilityStartTime ?: 0.0
  val endToEndLatency = player.lowLatency.latency + prftToAvailabilityTimeOffset
  ```
* Support client-side and server-guided ad playback on devices that only support a single video decoder by setting [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) to `null`.
  If the ad video decoder fails to initialize, main content decoding is automatically disabled and [`PlayerWarningCode.MainContentDecodingDuringAdsDisabled`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-warning-code/-main-content-decoding-during-ads-disabled/index.html) is emitted.
  Previously, this was only possible by manually disabling [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) on player creation.
* Updated `Cronet` from `18.1.0` to `18.1.1`
* [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) is now nullable: `null` enables automatic behavior (default), `true` forces decoding during ads, and `false` always disables it

**Known Issues**

* During failed automatic playback retries, [PlayerEvent.Error](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) may report a retry-attempt error code instead of the original rendering error code, which can affect error-code-based fallback logic and reporting
* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.142.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.141.0

Released: 2026-02-06

**Fixed**

* When [`DrmConfig.immediateLicenseRequest`](https://cdn.bitmovin.com/player/android/3.141.0/docs/player-core/com.bitmovin.player.api.drm/-drm-config/immediate-license-request.html) is set to `true`, licenses for inactive sources in a playlist may be pre-fetched, resulting in unnecessary license requests

**Known Issues**

* During failed automatic playback retries, [PlayerEvent.Error](https://cdn.bitmovin.com/player/android/3.141.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) may report a retry-attempt error code instead of the original rendering error code, which can affect error-code-based fallback logic and reporting
* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.141.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

**Changed**

* Migrate the Bitmovin Player Web UI integration to v4 (checkout [What's new in UI v4](https://developer.bitmovin.com/playback/docs/whats-new-in-ui-v4))
  * If you have no UI customizations, there is no further action required. The new UI is used automatically.
  * [`UiConfig.WebUi.Variant.SmallScreenUi`](https://cdn.bitmovin.com/player/android/3.141.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/-variant/-small-screen-ui/index.html) / [`UiConfig.WebUi.Variant.TvUi`](https://cdn.bitmovin.com/player/android/3.141.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/-variant/-tv-ui/index.html) now resolve to `bitmovin.playerui.UIFactory.buildSmallScreenUI` / `bitmovin.playerui.UIFactory.buildTvUI`
  * If you ship a custom v3 bundle (even when it still uses the default factory name `bitmovin.playerui.UIFactory.buildDefaultSmallScreenUI` / `bitmovin.playerui.UIFactory.buildDefaultTvUI`)
    * Configure the legacy factory explicitly on the [`PlayerViewConfig.uiConfig`](https://cdn.bitmovin.com/player/android/3.141.0/docs/player-ui-web/com.bitmovin.player.api.ui/-player-view-config/ui-config.html) via [`UiConfig.WebUi.Variant.Custom("<your.factory.name>")`](https://cdn.bitmovin.com/player/android/3.141.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/-variant/-custom/index.html)
    * Or upgrade your custom UI v4 following our [Migration Guide](https://developer.bitmovin.com/playback/reference/migration-guide-v3-to-v4)

***

## 3.140.2

Released: 2026-02-16

**Fixed**

* During failed playback retries, [PlayerEvent.Error](https://cdn.bitmovin.com/player/android/3.140.2/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) now reports the original rendering error code that triggered the retry instead of the retry-attempt error code

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.140.2/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.140.1

Released: 2026-01-30

**Fixed**

* `KotlinReflectionInternalError` exception when [`DebugConfig.isLoggingEnabled`](https://cdn.bitmovin.com/player/android/3.140.1/docs/player-core/com.bitmovin.player.api/-debug-config/is-logging-enabled.html) is true and playing interstitial ads

**Known Issues**

* During failed automatic playback retries, [PlayerEvent.Error](https://cdn.bitmovin.com/player/android/3.140.1/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) may report a retry-attempt error code instead of the original rendering error code, which can affect error-code-based fallback logic and reporting
* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.140.1/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.140.0

Released: 2026-01-23

**Fixed**

* Emit a warning with code [`PlayerWarningCode.WebUiInitializationFailed`](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-warning-code/-web-ui-initialization-failed/index.html) via the [`PlayerView`](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-ui-web/com.bitmovin.player/-player-view/index.html) event emitter instead of throwing when the Web UI fails to initialize
* Skipping a progressive ad with [`AdvertisingApi.skip`](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-api/skip.html) now correctly emits [`PlayerEvent.AdSkipped`](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-skipped/index.html)

**Known Issues**

* During failed automatic playback retries, [PlayerEvent.Error](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) may report a retry-attempt error code instead of the original rendering error code, which can affect error-code-based fallback logic and reporting
* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3220) dependency to version `3.22.0`
* Ads of type [`AdSourceType.Progressive`](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-progressive/index.html) no longer fall back to a backup [`AdSource`](https://cdn.bitmovin.com/player/android/3.140.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source/index.html) on playback errors, aligning the behavior with other ad source types

***

## 3.139.0

Released: 2026-01-16

**Added**

* [`RetryPlaybackAction.Retry`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-action/-retry/index.html) to allow retrying playback without configuration changes
* Emit an [`SourceWarningCode.IncorrectApiUsage`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-warning-code/-incorrect-api-usage/index.html) warning when [`RetryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-callback/index.html) returns the [`RetryPlaybackAction.Retry`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-action/-retry/index.html) or the same [`LimitBitrate`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-action/-limit-bitrate/index.html) multiple times
* Experimental [`DrmConfig.immediateLicenseRequest`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.drm/-drm-config/immediate-license-request.html) that pre-fetches the DRM license as soon as DRM information (PSSH box) is available

**Known Issues**

* During failed automatic playback retries, [PlayerEvent.Error](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) may report a retry-attempt error code instead of the original rendering error code, which can affect error-code-based fallback logic and reporting
* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

**Changed**

* On Rendering error (eg: decoding), the player now internally retries once before invoking [`RetryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.139.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-callback/index.html)

***

## 3.138.0

Released: 2026-01-09

**Added**

* [`PlayerEvent.AdError`](https://cdn.bitmovin.com/player/android/3.138.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-error/index.html) is emitted when an [`AdSource`](https://cdn.bitmovin.com/player/android/3.138.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source/index.html) with type of [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.138.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html) resolves to a wrapper containing sequenced ads, but `allowMultipleAds` is false or unspecified

**Changed**

* Updated IMA SDK dependency to version `3.38.0`
* Increased the `minSdkVersion` to 23

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.138.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.137.0

Released: 2025-12-19

**Fixed**

* Inconsistent manual track selection when a sideloaded subtitle track is configured
* License renewal network failures now emit [`SourceWarningCode.DrmRequestFailed`](https://cdn.bitmovin.com/player/android/3.137.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-warning-code/-drm-request-failed/index.html) instead of [`SourceWarningCode.DrmGeneral`](https://cdn.bitmovin.com/player/android/3.137.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-warning-code/-drm-general/index.html) and include [`DeficiencyData.Network`](https://cdn.bitmovin.com/player/android/3.137.0/docs/player-core/com.bitmovin.player.api.deficiency/-deficiency-data/-network/index.html)

**Changed**

* Default Bitmovin Web UI version to `3.105.0`

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.137.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.136.0

Released: 2025-12-15

**Added**

* `deficiencyData` to all error and warning events. This provides additional information about the root cause of the issue. For most errors this is populated with [`DeficiencyData.Throwable`](https://cdn.bitmovin.com/player/android/3.136.0/docs/player-core/com.bitmovin.player.api.deficiency/-deficiency-data/-throwable/index.html) containing the original exception that caused the error.
  The events emitted with the following deficiency codes can also contain [`DeficiencyData.Network`](https://cdn.bitmovin.com/player/android/3.136.0/docs/player-core/com.bitmovin.player.api.deficiency/-deficiency-data/-network/index.html) data with more details about the network request associated with the issue:
  * [`SourceErrorCode.DrmRequestFailed`](https://cdn.bitmovin.com/player/android/3.136.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-drm-request-failed/index.html)
  * [`SourceWarningCode.DrmRequestFailed`](https://cdn.bitmovin.com/player/android/3.136.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-warning-code/-drm-request-failed/index.html)
  * [`SourceErrorCode.HttpStatusCode`](https://cdn.bitmovin.com/player/android/3.136.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-http-status-code/index.html)
    The API is currently experimental and may change in future releases
* [`Player.isDestroyed`](https://cdn.bitmovin.com/player/android/3.136.0/docs/player-core/com.bitmovin.player.api/-player/is-destroyed.html) to expose destroy state of the player instance

**Fixed**

* Avoid incorrect API usage warnings when destroying the player with bundled analytics enabled

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.136.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.135.0

Released: 2025-12-05

**Fixed**

* Allow unsubscribing event listeners with `Player.off` after [`Player.destroy`](https://cdn.bitmovin.com/player/android/3.135.0/docs/player-core/com.bitmovin.player.api/-player/destroy.html) to support cleanup of event listeners
* Allow unsubscribing event listeners with `OfflineContentManager.off` after [`OfflineContentManager.release`](https://cdn.bitmovin.com/player/android/3.135.0/docs/player-core/com.bitmovin.player.api.offline/-offline-content-manager/release.html) to support cleanup of event listeners

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3211) dependency to version `3.21.1`

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.135.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.134.0

Released: 2025-11-28

**Added**

* [`AdvertisingApi.schedule`](https://cdn.bitmovin.com/player/android/3.134.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-api/schedule.html) to access the current ad schedule
* [`PlayerEvent.AdScheduleChanged`](https://cdn.bitmovin.com/player/android/3.134.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-schedule-changed/index.html) to indicate changes in the [`AdvertisingApi.schedule`](https://cdn.bitmovin.com/player/android/3.134.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-api/schedule.html)
* Support for updating HLS Interstitials `playoutLimit` after the ad has been initially scheduled (via `EXT-X-DATERANGE` update)

**Changed**

* HLS interstitials are now enabled by default. [`TweaksConfig.enableHlsInterstitials`](https://cdn.bitmovin.com/player/android/3.134.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-hls-interstitials.html) can be set to `false` to disable it.

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.134.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.133.0

Released: 2025-11-19

**Added**

* [`AdvertisingApi`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-api/index.html), which is accessible via [`Player.ads`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-player/ads.html), to host ad related APIs
* [`PlayerConfig.hlsConfig`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-player-config/hls-config.html) of type [`HlsConfig`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-hls-config/index.html) to configure HLS specific behaviour
* [`HlsConfig.interstitialsConfig`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-hls-config/interstitials-config.html) of type [`InterstitialsConfig`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials/-interstitials-config/index.html) to configure HLS Interstitial specific behaviour
  * `InterstitialsConfig.customDataMapping` to map custom attributes to Interstitial specific information such as tracking events and click-through URLs.
    [`CustomAttributesMappingPresets.adCreativeSignaling`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials.tracking/-custom-attributes-mapping-presets/ad-creative-signaling.html) can be set to use tracking as defined in SVTA's `X-AD-CREATIVE-SIGNALING` specification
  * [`InterstitialsConfig.macroValueProvider`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.advertising.interstitials/-interstitials-config/macro-value-provider.html) to provide custom values for macro replacement in tracking URLs
* Protocol-relative URLs are now supported when using the Bitmovin Advertising Module
* [`PlayerEvent.DownloadFinished`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-download-finished/index.html) now emitted for Bitmovin Advertising Module requests (currently reported as [`HttpRequestType.Unknown`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.network/-http-request-type/-unknown/index.html))
* [`NetworkConfig.preprocessHttpRequestCallback`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.network/-network-config/preprocess-http-request-callback.html) and [`NetworkConfig.preprocessHttpResponseCallback`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.network/-network-config/preprocess-http-response-callback.html) are invoked for Bitmovin Advertising Module requests (currently reported as [`HttpRequestType.Unknown`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.network/-http-request-type/-unknown/index.html))
* [`PlayerEvent.Info`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-info/index.html) emitted for each ABR decision, providing detailed debug information about the ABR logic

**Fixed**

* HLS audio track labels now use the manifest NAME attribute instead of the GROUP-ID prefix
* Unhandled `AssertionError` from OS bundled okio, when closing an IO stream

**Changed**

* Integrated changes from `Media3 ExoPlayer` version `1.8.0`
* Convert [`AdaptationConfig`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api.media/-adaptation-config/index.html) to data class for convenience and debug logging

**Deprecated**

* [`Player.setAdViewGroup`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-player/set-ad-view-group.html), [`Player.scheduleAd`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-player/schedule-ad.html) and [`Player.skipAd`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-player/skip-ad.html) in favour of calling the respective APIs on [`Player.ads`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-player/ads.html)

**Removed**

* `TweaksConfig.forceIncreasingHlsSegmentIndex` because adaptation is now always delayed if the target playlist is not yet refreshed
* `TweaksConfig.doNotSwitchQualityOnHlsParts` because adaptation is now always delayed for dependent HLS parts

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.133.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.132.1

Released: 2025-11-05

**Fixed**

* Image Media Playlist thumbnails with root-relative URIs (starting with `/`) fail to load due to incorrect URI resolution

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.132.1/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.132.0

Released: 2025-11-03

**Fixed**

* Rare `NullPointerException` thrown when calling `player.load`
* VideoQualities/AudioQualities/AudioTracks occasionally become empty during Multi-Period DASH (e.g. SSAI) live playback

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3210) dependency to version `3.21.0`

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.132.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.131.0

Released: 2025-10-24

**Added**

* [`AdvertisingConfig.shouldPlaySeekedOverAdItems`](https://cdn.bitmovin.com/player/android/3.131.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/should-play-seeked-over-ad-items.html) to allow customization of which ad items should play when a seek or timeshift operation jumps over ad breaks
* [`AudioQuality.channelCount`](https://cdn.bitmovin.com/player/android/3.131.0/docs/player-core/com.bitmovin.player.api.media.audio.quality/-audio-quality/channel-count.html) containing information about the channels of the given audio quality

**Fixed**

* [`PlayerEvent.DownloadFinished`](https://cdn.bitmovin.com/player/android/3.131.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-download-finished/index.html) and [`SourceEvent.RetryPlaybackAttempt`](https://cdn.bitmovin.com/player/android/3.131.0/docs/player-core/com.bitmovin.player.api.event/-source-event/-retry-playback-attempt/index.html) not logged when [`DebugConfig.isLoggingEnabled`](https://cdn.bitmovin.com/player/android/3.131.0/docs/player-core/com.bitmovin.player.api/-debug-config/is-logging-enabled.html) was enabled

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.131.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.130.0

Released: 2025-10-24

This version was not released publicly.

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.130.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.129.0

Released: 2025-10-17

**Fixed**

* All HLS Interstitials scheduled before the live edge on live streams are triggered on playback start
* [`Source.getThumbnail`](https://cdn.bitmovin.com/player/android/3.129.0/docs/player-core/com.bitmovin.player.api.source/-source/get-thumbnail.html) returning null after a Live to VoD transition when availabilityStartTime was non zero

**Changed**

* Improved handling of unset resume offset for HLS interstitials

**Known Issues**

* [`Player.getThumbnail`](https://cdn.bitmovin.com/player/android/3.129.0/docs/player-core/com.bitmovin.player.api/-player/get-thumbnail.html) may return wrong thumbnails for WebVTT/HLS Image Media Playlists. Fixed in `3.143.0`

***

## 3.128.0

Released: 2025-10-10

**Added**

* Support `X-PLAYOUT-LIMIT` for HLS interstitials
* [`SourceEvent.RetryPlaybackAttempt`](https://cdn.bitmovin.com/player/android/3.128.0/docs/player-core/com.bitmovin.player.api.event/-source-event/-retry-playback-attempt/index.html) to signal that the player is attempting to recover from an error as requested by [`RetryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.128.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-callback/index.html)
* Ability to customizing VAST media file selection through [`BitmovinAdvertisingConfig.onSelectAdQuality`](https://cdn.bitmovin.com/player/android/3.128.0/docs/player-core/com.bitmovin.player.api.advertising.bitmovin/-bitmovin-advertising-config/on-select-ad-quality.html)

**Fixed**

* HLS Interstitials without a `.m3u8` path component failed to play
* Rare app crash due to an uncaught exception on source load error when [`RetryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.128.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-callback/index.html) is set

***

## 3.127.0

Released: 2025-09-26

**Added**

* Support `X-RESTRICT="SKIP"` on interstitials. Make Interstitals per default skippable with 0.0 skip offset.
* Honor HLS interstitial `X-RESUME-OFFSET` values when they are set. Unset `X-RESUME-OFFSET` support is limited and may not work for all configurations.

**Fixed**

* One specific coroutine Job is never cancelled for setups where no ad is scheduled
* `AdItem.replaceContentDuration` might be applied from the wrong playback position in live streams when timeshifting into ads
* [`AdStarted`](https://cdn.bitmovin.com/player/android/3.127.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-started/index.html) emitted on Ad load instead of playback start for [`AdSourceType.Progressive`](https://cdn.bitmovin.com/player/android/3.127.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-progressive/index.html) ads

**Changed**

* Internal coroutine management improvement to avoid coroutine leaks beyond the player life
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3201) dependency to version `3.20.1`

***

## 3.126.1

Released: 2025-09-19

**Added**

* Error and warning page top level documentation for easier navigation and discoverability: \[`Documentation for all warning and error codes`]\(<https://cdn.bitmovin.com/player/android/3.126.1/docs/player-core/-error> and warning codes/index.html)

**Fixed**

* [`RetryPlaybackConfig.retryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.126.1/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-config/retry-playback-callback.html) called even if the player still had internal recovery strategy available. It is now called only as a last resort before an error is emitted

***

## 3.126.0

Released: 2025-09-12

**Added**

* More context to [`RetryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.126.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-callback/index.html):
  * [`RetryPlaybackContext.errorEvent`](https://cdn.bitmovin.com/player/android/3.126.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-context/error-event.html) to provide the full context on the error to be recovered.
  * [`RetryPlaybackContext.source`](https://cdn.bitmovin.com/player/android/3.126.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-context/source.html) that contains the source that caused the error

**Fixed**

* Bitmovin ad media file selection sometimes wrongly selecting unsupported mime type `video/x-flv`

**Changed**

* Default Bitmovin Web UI version to `3.102.0`
* Ads of type [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.126.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html) are now selecting the media file depending on the available bandwidth

**Removed**

* `RetryPlaybackContext.ErrorCode`, superseded by [`RetryPlaybackContext.errorEvent`](https://cdn.bitmovin.com/player/android/3.126.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-context/error-event.html)

***

## 3.125.0

Released: 2025-09-03

**Added**

* Support for CUE tag (PRE, POST and ONCE) for Hls Interstitial scheduling
* [`RetryPlaybackAction.SkipToNextSource`](https://cdn.bitmovin.com/player/android/3.125.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-action/-skip-to-next-source/index.html) to skip to the next source on error instead of stopping playback

**Changed**

* [`RetryPlaybackConfig.retryPlaybackCallback`](https://cdn.bitmovin.com/player/android/3.125.0/docs/player-core/com.bitmovin.player.api.recovery/-retry-playback-config/retry-playback-callback.html) is now called to attempt recovery for most errors

***

## 3.124.0

Released: 2025-08-29

**Added**

* [`TweaksConfig.enableHlsInterstitials`](https://cdn.bitmovin.com/player/android/3.124.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-hls-interstitials.html) to enable playback of HLS Interstitials. Note that this is still under development and some functionality is missing or not stable.
* [`HttpRequestType.HlsInterstitialsAssetList`](https://cdn.bitmovin.com/player/android/3.124.0/docs/player-core/com.bitmovin.player.api.network/-http-request-type/-hls-interstitials-asset-list/index.html) to indicate downloading of the HLS Interstitial asset list

**Fixed**

* Missing [`MediaTrackRole`](https://cdn.bitmovin.com/player/android/3.124.0/docs/player-core/com.bitmovin.player.api.media/-media-track-role/index.html) for HLS [`Tracks`](https://cdn.bitmovin.com/player/android/3.124.0/docs/player-core/com.bitmovin.player.api.media/-track/index.html) with characteristics `public.accessibility.describes-music-and-sound`, `public.accessibility.transcribes-spoken-dialog` or `public.easy-to-read`

**Changed**

* Kotlin version to `2.1.21`. If your project uses Kotlin, it needs to be at least on `2.0.0`.
* Dagger version to `2.57`
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3200) dependency to version `3.20.0`
* Updated IMA SDK dependency to version `3.37.0`.
  With this update, clients using the IMA SDK **must** switch to the `+jason` release in order to avoid dependency problems with media3.
  Additionally, this and future versions of the IMA SDK requires the app to use desugaring. Read more here: <https://developer.android.com/studio/write/java8-support#library-desugaring> and about integrating IMA here: <https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/get-started#2.-add-the-ima-sdk-to-your-project>
  ```diff
  // build.gradle.kts
  android {
  +   compileOptions {
  +     isCoreLibraryDesugaringEnabled = true
  +   }
  }
  dependencies {
  +   coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")

  -   implementation("com.bitmovin.player:player:3.124.0")
  +   implementation("com.bitmovin.player:player:3.124.0+jason")
  }
  ```
* Setting [`DebugConfig.isLoggingEnabled`](https://cdn.bitmovin.com/player/android/3.124.0/docs/player-core/com.bitmovin.player.api/-debug-config/is-logging-enabled.html) to `true` will force the `AnalyticsConfig.logLevel` to `LogLevel.DEBUG`

***

## 3.123.0

Released: 2025-08-22

**Added**

* [`TweaksConfig.relaxedPeriodDiscardingForLiveStreams`](https://cdn.bitmovin.com/player/android/3.123.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/relaxed-period-discarding-for-live-streams.html) to change the internal media period discarding behaviour for live streams. This is mainly relevant for VoD to live transitions in playlists.

***

## 3.122.0

Released: 2025-08-14

**Changed**

* [Video Decoder's PerfomancePoint](https://developer.android.com/reference/android/media/MediaCodecInfo.VideoCapabilities?hl=en#getSupportedPerformancePoints\(\)) are now ignored if incoherent with the CDD requirements even on Android 15 or later. This change allows for more reliable playback on device incorectly reporting their video decoding capabilities. For instance, the Player will now attempt to play 50fps SD DRM videos even if a device's hardware decoder reports it as unsupported, as this is typically within the capabilities of devices compliant with the CDD

***

## 3.121.0

Released: 2025-08-08

**Added**

* VMAP support for Bitmovin Advertising Module. To handle VMAP ads, schedule [`AdItem`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-item/index.html) using [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html)
* [`AdItem.bitmovinAdTagLoading`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-item/bitmovin-ad-tag-loading.html) to fetch ad tags and process VMAP ads using the Bitmovin Advertising Module, while handling the VAST and ad playback with the associated [`AdSourceType`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/index.html)
* [`ExperimentalBitmovinApi`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api/-experimental-bitmovin-api/index.html) annotation which indicates experimental API

**Fixed**

* [`Player.isAd`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api/-player/is-ad.html) might be indicating ad playback for [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html) ads, when they are still loading or are dismissed with [`AdvertisingConfig.shouldPlayAdBreak`](https://cdn.bitmovin.com/player/android/3.121.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/should-play-ad-break.html)

***

## 3.120.0

Released: 2025-08-03

**Changed**

* Internal improvement to seeking from VoD source to Live source

***

## 3.119.0

Released: 2025-07-25

**Added**

* Support for Image Media Playlists for HLS live streams.

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3180) dependency to version `3.18.0`
* Update Dokka (documentation generator) to `2.0.0`

**Removed**

* `TweaksConfig.enableImageMediaPlaylistThumbnailParsingForLive`. (See added section for more details)

***

## 3.118.0

Released: 2025-07-14

**Fixed**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.118.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.118.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.

**Changed**

* Integrated changes from `Media3 ExoPlayer` version `1.6.1`
* The default [`Cue.lineAnchor`](https://cdn.bitmovin.com/player/android/3.118.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/line-anchor.html) of a region is now always [`AnchorTypeStart`](https://cdn.bitmovin.com/player/android/3.118.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/-anchor-type/-anchor-type-start/index.html). It used to be [`AnchorTypeStart`](https://cdn.bitmovin.com/player/android/3.118.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/-anchor-type/-anchor-type-start/index.html) or [`AnchorTypeMiddle`](https://cdn.bitmovin.com/player/android/3.118.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/-anchor-type/-anchor-type-middle/index.html) depending on the [`Cue.line`](https://cdn.bitmovin.com/player/android/3.118.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/line.html)
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3170) dependency to version `3.17.1`

**Removed**

* `TweaksConfig.shouldApplyTtmlRegionWorkaround` as support for TTML attributes defined in a Region's Style has improved

***

## 3.117.0

Released: 2025-07-08

**Added**

* [`NetworkEngine.HttpURLConnection.allowCrossProtocolRedirects`](https://cdn.bitmovin.com/player/android/3.117.0/docs/player-core/com.bitmovin.player.api.source/-network-engine/-http-u-r-l-connection/allow-cross-protocol-redirects.html), enabling customization of HTTP url connection engine behavior when following cross-protocol redirects

**Fixed**

* Rare `IllegalArgumentException` when using the Cronet network engine, related to thread handling during HTTP response processing

**Known Issues**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.117.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.117.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

***

## 3.116.0

Released: 2025-07-04

**Fixed**

* Loading a source failing with a `SerializationException` when `SourceConfig.liveConfig` is not `null` and using the Bitmovin Player Web UI

**Known Issues**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.116.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.116.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

***

## 3.115.0

Released: 2025-06-27

**Added**

* [`SourceNetworkConfig.engine`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api.source/-source-network-config/engine.html) to configure the [`NetworkEngine`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api.source/-network-engine/index.html) used to make network requests per source.
  This replaces [TweaksConfig.cronetEngine](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/cronet-engine.html)
* [`SourceAdaptationConfig.bandwidthFractionAvailableToUse`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api.source/-source-adaptation-config/bandwidth-fraction-available-to-use.html) to configure the fraction of the available bandwidth that a Source can use.
  This replaces [TweaksConfig.bandwidthFractionAvailableToUse](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/bandwidth-fraction-available-to-use.html)
* [`TweaksConfig.retryPlaybackConfig`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/retry-playback-config.html) to configure retry behaviour on certain playback errors

**Fixed**

* Issue with license validation that could lead to unexpected behavior when using the player outside of the intended environment. We **strongly recommend customers to review & update their allow-list settings** in the [Bitmovin Dashboard > Player Licenses](https://dashboard.bitmovin.com/player/licenses) to ensure that all relevant Android package names are allow-listed for the Bitmovin Player license in use.  For more information on how to manage allow-listing, please refer to [Allow-listing packages](https://developer.bitmovin.com/playback/docs/how-can-i-allowlist-a-domain-ip-app-id-package-name-or-bundle-identifier)

**Known Issues**

* Loading a source may fail with a `SerializationException` if `SourceConfig.liveConfig` is not `null` when using the Bitmovin Player Web UI
* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3170) dependency to version `3.17.0`

**Removed**

* [TweaksConfig.cronetEngine](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/cronet-engine.html) in favor of the stable [`SourceNetworkConfig.engine`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api.source/-source-network-config/engine.html)
* [TweaksConfig.bandwidthFractionAvailableToUse](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/bandwidth-fraction-available-to-use.html) in favor of the stable [`SourceAdaptationConfig.bandwidthFractionAvailableToUse`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api.source/-source-adaptation-config/bandwidth-fraction-available-to-use.html)
* `TweaksConfig.limitQualityOnDrmError` in favor of the more flexible [`TweaksConfig.retryPlaybackConfig`](https://cdn.bitmovin.com/player/android/3.115.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/retry-playback-config.html).
  * As an example to replace `TweaksConfig.limitQualityOnDrmError` use following snippet:
  ```kotlin
  val retryPlaybackConfig = RetryPlaybackConfig { context ->
    if (context.errorCode == SourceErrorCode.DrmDisallowedOperation) {
        Log.d("RetryPlaybackConfig", "Retrying playback with limited bitrate due to DRM disallowed operation error")
        // Put logic to limit bitrate on future playback attempts here
        RetryPlaybackAction.LimitBitrate(
            maxBitrate = 123456, // Replace bitrate of highest that playback should be retried with
        )
    } else {
        RetryPlaybackAction.None
    }
  }
  tweaksConfigBuilder.setRetryPlaybackConfig(retryPlaybackConfig)
  ```

***

## 3.114.0

Released: 2025-06-18

**Fixed**

* [`PlayerEvent.TimeChanged`](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-time-changed/index.html) not being emitted during ad playback for new playback session, when an IMA VMAP ad could not play all ads before starting a new playback session by calling [`Player.unload`](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api/-player/unload.html) or directly loading new assets

**Known Issues**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

**Changed**

* [`SourceEvent.Error`](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api.event/-source-event/-error/index.html) events to be more fine granular with a new [`SourceErrorCode.DrmDisallowedOperation`](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-drm-disallowed-operation/index.html) error code. The respective error is no longer reported with the [`SourceErrorCode.DrmGeneral`](https://cdn.bitmovin.com/player/android/3.114.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-drm-general/index.html) error code
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3160) dependency to version `3.16.0`

***

## 3.113.0

Released: 2025-06-10

**Added**

* [`SourceErrorCode.UnsupportedStreamType`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-unsupported-stream-type/index.html) to indicate that the stream type of the current source is not supported by the player. The error is currently only emitted when loading a `rtp://` stream
* [`AudioTrack.qualities`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.media.audio/-audio-track/qualities.html), providing the [`AudioQuality`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.media.audio.quality/-audio-quality/index.html)s associated with the [`AudioTrack`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.media.audio/-audio-track/index.html)
* Default `toString` implementation for [`Track`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.media/-track/index.html), [`AudioTrack`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.media.audio/-audio-track/index.html), [`SubtitleTrack`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-subtitle-track/index.html) and [`ThumbnailTrack`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.media.thumbnail/-thumbnail-track/index.html)

**Fixed**

* Issue where the video decoder would freeze when switching video quality during playback of HLS low-latency streams with pre-load hints. Although rare edge cases may still occur, the frequency of freezes has been significantly reduced

**Known Issues**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.113.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

**Changed**

* Officially support Android 16. Update `targetSdk` and `compileSdk` to 36

***

## 3.112.0

Released: 2025-05-28

**Added**

* [`AudioTrack.associatedLanguage`](https://cdn.bitmovin.com/player/android/3.112.0/docs/player-core/com.bitmovin.player.api.media.audio/-audio-track/associated-language.html) and [`SubtitleTrack.associatedLanguage`](https://cdn.bitmovin.com/player/android/3.112.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-subtitle-track/associated-language.html) to access the `ASSOC-LANGUAGE` attribute from HLS media renditions

**Fixed**

* High memory usage caused by Network API when [`PreprocessHttpResponseCallback`](https://cdn.bitmovin.com/player/android/3.112.0/docs/player-core/com.bitmovin.player.api.network/-preprocess-http-response-callback/index.html) is set
* Disable codec reuse when only crop rect changes as MediaCodec fails to adapt between formats that have the same decoded picture resolution but different crop

**Known Issues**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.112.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.112.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

***

## 3.111.0

Released: 2025-05-23

**Added**

* [`TweaksConfig.doNotSwitchQualityOnHlsParts`](https://cdn.bitmovin.com/player/android/3.111.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/do-not-switch-quality-on-hls-parts.html) to disable quality switch (HLS variant adaptation)
  outside of segment boundaries. This minimize stalls on quality switch when playing HLS low latency

**Known Issues**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.111.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.111.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

***

## 3.110.0

Released: 2025-05-16

**Added**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) to preload [`NagraConnectConfig`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api.drm/-nagra-connect-config/index.html) DRM licenses
* [`TweaksConfig.constantBitrateSeekingEnabled`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/constant-bitrate-seeking-enabled.html) to allow approximated seeking in streams that don't have a seek table (For example a legacy format of MP3)

**Known Issues**

* [`Player.preloadDrmLicense`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-player/preload-drm-license.html) causes a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) to be emitted on API level 30 and lower and might not preload the license properly.
  Please use Player version [`3.118.0`](https://developer.bitmovin.com/playback/docs/release-notes-android#31180)+.

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3141)
  dependency to version `3.14.2`
* Add the [`usePreloadHintsForBandwidthEstimation`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-bandwidth-meter-type/-experimental/use-preload-hints-for-bandwidth-estimation.html) tweak to use HLS preloading hints for bandwidth estimation
* Introduce a new algorithm for bandwidth estimation: exponential weighted average.
  [`bandwidthEstimationMode`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-bandwidth-meter-type/-experimental/bandwidth-estimation-mode.html) allows selecting between the default [`SlidingPercentile`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-bandwidth-estimation-mode/-sliding-percentile/index.html) or
  the new [`ExponentialWeightedAverage`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-bandwidth-estimation-mode/-exponential-weighted-average/index.html).
  The existing `slidingPercentile` and `slidingPercentileMaxSampleCount` have been moved in
  [`SlidingPercentile`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-bandwidth-estimation-mode/-sliding-percentile/index.html) as [`SlidingPercentile.percentile`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-bandwidth-estimation-mode/-sliding-percentile/percentile.html) and [`SlidingPercentile.maxSampleCount`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-bandwidth-estimation-mode/-sliding-percentile/max-sample-count.html)
* Add the [`forceIncreasingHlsSegmentIndex`](https://cdn.bitmovin.com/player/android/3.110.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/force-increasing-hls-segment-index.html) tweak to force the Player to reflesh the HLS playlist
  on quality change

***

## 3.109.0

Released: 2025-05-09

**Added**

* [`PlayerEvent.DownloadFinished`](https://cdn.bitmovin.com/player/android/3.109.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-download-finished/index.html) to indicate downloads not directly related to a [`Source`](https://cdn.bitmovin.com/player/android/3.109.0/docs/player-core/com.bitmovin.player.api.source/-source/index.html)
* [`TweaksConfig.enableDrmLicenseRenewRetry`](https://cdn.bitmovin.com/player/android/3.109.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-drm-license-renew-retry.html) that allows enabling default retry behaviour for DRM license renewal requests in case of failure
* [`NetworkConfig.retryHttpRequestConfig`](https://cdn.bitmovin.com/player/android/3.109.0/docs/player-core/com.bitmovin.player.api.network/-network-config/retry-http-request-config.html) to customize the retry behavior of failing HTTP requests.

**Fixed**

* Video tracks of unknown resolution never played in automatic selection

***

## 3.108.0

Released: 2025-04-28

**Added**

* [`TweaksConfig.httpResponseTypesToPreprocess`](https://cdn.bitmovin.com/player/android/3.108.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/http-response-types-to-preprocess.html) to greatly improve the memory and latency cost of
  [`NetworkConfig.preprocessHttpResponseCallback`](https://cdn.bitmovin.com/player/android/3.108.0/docs/player-core/com.bitmovin.player.api.network/-network-config/preprocess-http-response-callback.html)

**Fixed**

* Occasional video freeze on audio timestamps discontinuities at low playback speed, affecting mostly HLS live streams with SSAI

***

## 3.107.0

Released: 2025-04-14

**Added**

* [`TweaksConfig.parseSubtitlesDuringExtraction`](https://cdn.bitmovin.com/player/android/3.107.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/parse-subtitles-during-extraction.html) to control whether subtitles should be parsed during extraction time or during rendering time
* [`TweaksConfig.limitQualityOnDrmError`](https://cdn.bitmovin.com/player/android/3.107.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/limit-quality-on-drm-error.html) to try a lower quality on DRM errors

**Changed**

* Updated `Cronet` from `18.0.1` to `18.1.0`
* Updated `gson` from `2.11.0` to `2.12.1`
* Default Bitmovin Web UI version to `3.89.0`

***

## 3.106.0

Released: 2025-03-28

**Added**

* [`DecoderConfig.decoderPriorityProvider`](https://cdn.bitmovin.com/player/android/3.106.0/docs/player-core/com.bitmovin.player.api.decoder/-decoder-config/decoder-priority-provider.html), a callback interface to specify which decoder implementation the Player should
  use to decode the media
* [`TweaksConfig.attemptVideoFreezeRecovery`](https://cdn.bitmovin.com/player/android/3.106.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/attempt-video-freeze-recovery.html) that enables automatic recovery attempts from a stuck video decoder

**Fixed**

* Playback error when trying to play re-downloaded offline content

**Changed**

* Default Bitmovin Web UI version to `3.88.0`

**Removed**

* `TweaksConfig.preferSoftwareDecodingForAds`, `TweaksConfig.preferSoftwareDecoding`, `TweaksConfig.enableMainContentVideoCodecInitializationFallback`, `TweaksConfig.enableMainContentAudioCodecInitializationFallback`, `TweaksConfig.enableAdContentVideoCodecInitializationFallback` and `TweaksConfig.enableAdContentAudioCodecInitializationFallback` in favor of [`PlaybackConfig.decoderConfig`](https://cdn.bitmovin.com/player/android/3.106.0/docs/player-core/com.bitmovin.player.api/-playback-config/decoder-config.html)
  * As an example to replace `preferSoftwareDecodingForAds` use following snippet:
  ```kotlin
  val preferSoftwareDecodingForAdsDecoderPriorityProvider = object : DecoderPriorityProvider {
      override fun overrideDecodersPriority(
          context: DecoderPriorityProvider.DecoderContext,
          preferredDecoders: List<MediaCodecInfo>
      ): List<MediaCodecInfo> {
          if (context.isAd) {
              return preferredDecoders.filter { it.isSoftware }
          }
          return preferredDecoders
      }
  }
  playbackConfigBuilder.setDecoderConfig(DecoderConfig(preferSoftwareDecodingForAdsDecoderPriorityProvider))
  ```

***

## 3.105.0

Released: 2025-03-21

**Added**

* [`Player.setMaxSelectableVideoQualityForViewportSize`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api/-player/set-max-selectable-video-quality-for-viewport-size.html) to provide the video viewport size to the player to constrain the automatic quality selection
* [`PlayerViewConfig.playerMaxVideoQualityConstraint`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-ui-web/com.bitmovin.player.api.ui/-player-view-config/player-max-video-quality-constraint.html) to configure if [`PlayerView`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-ui-web/com.bitmovin.player/-player-view/index.html)'s size should constrain the Player's video quality selection

**Fixed**

* Decoder errors sometimes being wrongly reported as [`PlayerErrorCode.General`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-general/index.html) instead of [`PlayerErrorCode.DecoderGeneral`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-decoder-general/index.html)
* [`OfflineContentManagerListener.onCompleted`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.offline/-offline-content-manager-listener/on-completed.html) called with a null `offlineContentOptions` on failed preparation,
  leading to `NullPointerException` in client code. `onComplete` is no longer called on error.
  [`OfflineContentManagerListener.onError`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.offline/-offline-content-manager-listener/on-error.html) stays the recommended way to detect [`OfflineContentManager.process`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.offline/-offline-content-manager/process.html) errors

**Changed**

* Integrated changes from `Media3 ExoPlayer` version `1.5.1`
* [`OfflineContentManagerListener.onCompleted`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.offline/-offline-content-manager-listener/on-completed.html) is no longer called on error to prevent `NullPointerException` in client code.
  [`OfflineContentManagerListener.onError`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.offline/-offline-content-manager-listener/on-error.html) stays the recommended way to detect [`OfflineContentManager.process`](https://cdn.bitmovin.com/player/android/3.105.0/docs/player-core/com.bitmovin.player.api.offline/-offline-content-manager/process.html) errors.
  See the associated "Fixed" section for more details

***

## 3.104.2

Released: 2025-03-07

**Fixed**

* Some error events causing `StackOverflowError` when using [Bitmovin Analytics collector](https://github.com/bitmovin/bitmovin-analytics-collector-android) on some devices

***

## 3.104.1

Released: 2025-02-28

**Fixed**

* [`PlayerView`](https://cdn.bitmovin.com/player/android/3.104.1/docs/player-ui-web/com.bitmovin.player/-player-view/index.html) might show the poster image or a black overlay when attaching a [`Player`](https://cdn.bitmovin.com/player/android/3.104.1/docs/player-core/com.bitmovin.player.api/-player/index.html) with an active [`Source`](https://cdn.bitmovin.com/player/android/3.104.1/docs/player-core/com.bitmovin.player.api.source/-source/index.html)
* Stopping playback on non fatal DRM errors
* Source errors emitted with a generic code [SourceErrorCode.DrmGeneral](https://cdn.bitmovin.com/player/android/3.104.1/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-drm-general/index.html)
  instead of a more specific code, such as [SourceErrorCode.DrmRequestFailed](https://cdn.bitmovin.com/player/android/3.104.1/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-drm-request-failed/index.html)
  or [SourceErrorCode.DrmKeyExpired](https://cdn.bitmovin.com/player/android/3.104.1/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-drm-key-expired/index.html)
* Crash when initiating casting session in combination with [`MediaSession`](https://cdn.bitmovin.com/player/android/3.104.1/docs/player-media-session/com.bitmovin.player.api.media.session/-media-session.html) integration

***

## 3.104.0

Released: 2025-02-21

**Added**

* [`PlayReadyConfig`](https://cdn.bitmovin.com/player/android/3.104.0/docs/player-core/com.bitmovin.player.api.drm/-play-ready-config/index.html) to configure playback of PlayReady DRM content
* [`PlayReadyConfig.Builder`](https://cdn.bitmovin.com/player/android/3.104.0/docs/player-core/com.bitmovin.player.api.drm/-play-ready-config/-builder/index.html) builder class for convenient construction of [`PlayReadyConfig`](https://cdn.bitmovin.com/player/android/3.104.0/docs/player-core/com.bitmovin.player.api.drm/-play-ready-config/index.html) in Java
* [`RemoteControlConfig.stopCastingOnError`](https://cdn.bitmovin.com/player/android/3.104.0/docs/player-core/com.bitmovin.player.api.casting/-remote-control-config/stop-casting-on-error.html) config to disable cast receiver stopping playback if the cast sender encounters an error

**Fixed**

* Rename `NagraConnectConfig.operationalVault` to [`NagraConnectConfig.operatorVault`](https://cdn.bitmovin.com/player/android/3.104.0/docs/player-core/com.bitmovin.player.api.drm/-nagra-connect-config/operator-vault.html)

***

## 3.103.0

Released: 2025-02-14

**Added**

* `toString` implementation for [`SourceConfig`](https://cdn.bitmovin.com/player/android/3.103.0/docs/player-core/com.bitmovin.player.api.source/-source-config/index.html) and [`DrmConfig`](https://cdn.bitmovin.com/player/android/3.103.0/docs/player-core/com.bitmovin.player.api.drm/-drm-config/index.html) with its subclasses to provide a human-readable representation for easier debugging

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3140) dependency to version `3.14.0`
* Improved thrown exception message on missing [`BitmovinCastManager.updateContext`](https://cdn.bitmovin.com/player/android/3.103.0/docs/player-core/com.bitmovin.player.casting/-bitmovin-cast-manager/update-context.html) call

***

## 3.102.0

Released: 2025-02-10

**Added**

* Builder classes for convenient construction of configuration objects in Java:

  * [`PlayerConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-player-config/-builder/index.html)
  * [`PlaybackConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-playback-config/-builder/index.html)
  * [`AdvertisingConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/-builder/index.html)
  * [`ImaConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.advertising.ima/-ima-config/-builder/index.html)
  * [`BitmovinAdvertisingConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.advertising.bitmovin/-bitmovin-advertising-config/-builder/index.html)
  * [`VastMacroConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro-config/-builder/index.html)
  * [`AdaptationConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.media/-adaptation-config/-builder/index.html)
  * [`BufferConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.buffer/-buffer-config/-builder/index.html)
  * [`LicensingConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-licensing-config/-builder/index.html)
  * [`LiveConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.live/-live-config/-builder/index.html)
  * [`NetworkConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.network/-network-config/-builder/index.html)
  * [`TweaksConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/-builder/index.html)
  * [`RemoteControlConfig.Builder`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.casting/-remote-control-config/-builder/index.html)

  These builders simplify object creation and ensure proper configuration initialization
* [`NagraConnectConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.drm/-nagra-connect-config/index.html) to configure playback of NAGRA PRM content
* [`HttpRequestType.DrmLicenseNagraConnect`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.network/-http-request-type/-drm-license-nagra-connect/index.html) to indicate NAGRA PRM related license calls in the according networking callbacks
* [`SourceErrorCode.DrmConfigurationFailed`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-drm-configuration-failed/index.html) which is emitted together with a more detailed message, when the DRM setup failed
* Support for [`TweaksConfig.cronetEngine`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/cronet-engine.html) in Widevine DRM
* Customer proguard rule to avoid R8 errors when Cronet isn't used

**Fixed**

* Potential app crash when configuring and playing unsupported DRM schemes
* Player crashing when playing live streams and falling behind the live window
* User agent not yet set when [`NetworkConfig.preprocessHttpRequestCallback`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.network/-network-config/preprocess-http-request-callback.html) was called

**Changed**

* Default Bitmovin Web UI version to `3.85.0`
* Make Cronet an optional dependency. Apps should depend explicitly on `com.google.android.gms:play-services-cronet`
  to use the Cronet HTTP engine (see [`TweaksConfig.cronetEngine`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/cronet-engine.html))
* [`TweaksConfig.cronetEngine`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/cronet-engine.html) to a `Future` to allow lazy loading

**Deprecated**

* Property setters in the following configurations are now deprecated, as they must not be mutated after player creation:

  * [`PlayerConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-player-config/index.html)
  * [`PlaybackConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-playback-config/index.html)
  * [`AdaptationConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.media/-adaptation-config/index.html)
  * [`BufferConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.buffer/-buffer-config/index.html)
  * [`BufferMediaTypeConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.buffer/-buffer-media-type-config/index.html)
  * [`LicensingConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-licensing-config/index.html)
  * [`LiveConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.live/-live-config/index.html)
  * [`NetworkConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.network/-network-config/index.html)
  * [`TweaksConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/index.html)
  * [`RemoteControlConfig`](https://cdn.bitmovin.com/player/android/3.102.0/docs/player-core/com.bitmovin.player.api.casting/-remote-control-config/index.html)

  To modify these properties before player creation, use the corresponding builders instead.

  **Note:** Due to a [bug in IntelliJ IDEs](https://youtrack.jetbrains.com/issue/KTIJ-32991), Java files may incorrectly display deprecation warnings for the getters as well

***

## 3.101.0

Released: 2025-01-24

**Added**

* [`TweaksConfig.cronetEngine`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/cronet-engine.html) to use the [Cronet](https://developer.android.com/develop/connectivity/cronet) network
  stack, supporting HTTP/2 and HTTP/3
* [`PlayerViewConfig.Builder`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-ui-web/com.bitmovin.player.api.ui/-player-view-config/-builder/index.html) to conveniently construct a [`PlayerViewConfig`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-ui-web/com.bitmovin.player.api.ui/-player-view-config/index.html) object
* [`UiConfig.WebUi.Builder`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/-builder/index.html) to conveniently construct a [`UiConfig.WebUi`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/index.html) object

**Fixed**

* Exception when loading a source with side-loaded subtitle tracks on Android API level 23 and below
* [`TweaksConfig.exoPlayerCache`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/exo-player-cache.html) not used in readonly mode
* `No state for o with ID null is registered` exception thrown when unloading or destroying the player in [`PlayerEvent.Ready`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-ready/index.html), [`PlayerEvent.Play`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-play/index.html) and [`PlayerEvent.Paused`](https://cdn.bitmovin.com/player/android/3.101.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-paused/index.html) event listeners
* AdEvents being sent multiple times when loading a second source with scheduled VMAP ads

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3130) dependency to version `3.13.0`

***

## 3.100.2

Released: 2025-01-17

**Fixed**

* HLS manifest start offset is sometimes reapplied with wrong reference point on playback start

***

## 3.100.1

Released: 2025-01-10

**Fixed**

* Ad playback starting automatically when the playback position is changed (e.g., via seeking) to a time beyond where an ad is scheduled, even if the player is in paused state
* Using [`ShouldPlayAdBreakCallback.shouldPlayAdBreak`](https://cdn.bitmovin.com/player/android/3.100.1/docs/player-core/com.bitmovin.player.api.advertising/-should-play-ad-break-callback/should-play-ad-break.html) to cancel the ad break sometimes discards the next ad break in a VMAP using IMA SDK

***

## 3.100.0

Released: 2024-12-20

**Added**

* [`TweaksConfig.maxForwardBufferLevelForQualityDecrease`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/max-forward-buffer-level-for-quality-decrease.html) to tweak the maximum forward buffer level required for quality decrease
* [`TweaksConfig.bandwidthFractionAvailableToUse`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/bandwidth-fraction-available-to-use.html) to tweak the fraction of the available bandwidth that the selection should consider available for use
* [`TweaksConfig.bandwidthMeterType`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/bandwidth-meter-type.html) to configure the bandwidth meter used to estimate the available bandwidth
* Support for WebVTT subtitles with color and background styling when using [`SubtitleView`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player/-subtitle-view/index.html)
* [`Cue.styledText`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/styled-text.html) property to access the text of a cue with styling information. Use this instead of the deprecated [`Cue.text`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/text.html)

**Changed**

* Updated IMA SDK dependency to version `3.35.1`

**Deprecated**

* [`Cue.text`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/text.html), use [`Cue.styledText`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api.media.subtitle/-cue/styled-text.html) instead

**Removed**

* `TweaksConfig.bandwidthEstimateWeightLimit` in favor of [`BandwidthMeterType.Default.bandwidthEstimateWeightLimit`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api/-bandwidth-meter-type/-default/bandwidth-estimate-weight-limit.html) that can be configured via [`TweaksConfig.bandwidthMeterType`](https://cdn.bitmovin.com/player/android/3.100.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/bandwidth-meter-type.html)

***

## 3.99.0

Released: 2024-12-13

**Added**

* [`TweaksConfig.loadErrorFallbackConfig`](https://cdn.bitmovin.com/player/android/3.99.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/load-error-fallback-config.html) for more control on track selection fallback on networking errors

**Changed**

* Increased the `minSdkVersion` to 21

**Removed**

* `TweaksConfig.httpStatusCodesToTryFallback` in favour of [`TweaksConfig.loadErrorFallbackConfig`](https://cdn.bitmovin.com/player/android/3.99.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/load-error-fallback-config.html)

***

## 3.98.0

Released: 2024-12-10

**Added**

* [`PlayerWarningCode.InconsistentStateInIma`](https://cdn.bitmovin.com/player/android/3.98.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-warning-code/-inconsistent-state-in-ima/index.html) to report on inconsistencies and resulting effects when interacting with IMA
* [`PlayerErrorCode.InconsistentStateInIntegration`](https://cdn.bitmovin.com/player/android/3.98.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-inconsistent-state-in-integration/index.html) to report on fatal inconsistencies with integrations
* `surface_type` XML attribute to `PlayerView` to select between `texture_view` and `surface_view`

***

## 3.97.0

Released: 2024-12-06

**Added**

* [`Player.setTextureView`](https://cdn.bitmovin.com/player/android/3.97.0/docs/player-core/com.bitmovin.player.api/-player/set-texture-view.html) and [`PlayerViewConfig.surfaceType`](https://cdn.bitmovin.com/player/android/3.97.0/docs/player-ui-web/com.bitmovin.player.api.ui/-player-view-config/surface-type.html) to render video on a [TextureView](https://developer.android.com/reference/android/view/TextureView)

***

## 3.96.0

Released: 2024-12-04

**Added**

* [`TweaksConfig.disableVideoTracksWhileInBackground`](https://cdn.bitmovin.com/player/android/3.96.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/disable-video-tracks-while-in-background.html) to work around a device specific issue that causes video decoding to fail when the device is put into standby

**Fixed**

* Poster image sometimes hidden too early when playing a live source or a source with start offset
* Setting [`SourceOptions.startOffset`](https://cdn.bitmovin.com/player/android/3.96.0/docs/player-core/com.bitmovin.player.api.source/-source-options/start-offset.html) with [`TimelineReferencePoint.Start`](https://cdn.bitmovin.com/player/android/3.96.0/docs/player-core/com.bitmovin.player.api.source/-timeline-reference-point/-start/index.html) is not precise for live streams with a growing live window

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3120) dependency to version `3.12.0`

***

## 3.95.0

Released: 2024-11-29

**Fixed**

* Failing IMA VMAP ads sometimes not sending an AdError event

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3110) dependency to version `3.11.0`

**Removed**

* `slf4j-api` dependency

***

## 3.94.0

Released: 2024-11-25

**Removed**

* `slf4j-api` dependency and slf4j logs. See [Enable logging](https://developer.bitmovin.com/playback/docs/how-to-enable-logging-in-the-bitmovin-android-player) for instructions on logging

***

## 3.93.0

Released: 2024-11-15

**Added**

* [`DebugConfig.isLoggingEnabled`](https://cdn.bitmovin.com/player/android/3.93.0/docs/player-core/com.bitmovin.player.api/-debug-config/is-logging-enabled.html) that enables debug-level logging for all events sent by Bitmovin components as well as ExoPlayer logs
* `PlayerEvent.Info`, `SourceEvent.Info`, `OfflineEvent.Info` emitted with environment and config information on component creation

**Fixed**

* Some error events causing `StackOverflowError` when using [Bitmovin Analytics collector](https://github.com/bitmovin/bitmovin-analytics-collector-android) on some devices

**Removed**

* TweaksConfig.enableExoPlayerDebugLogging in favor of [`DebugConfig.isLoggingEnabled`](https://cdn.bitmovin.com/player/android/3.93.0/docs/player-core/com.bitmovin.player.api/-debug-config/is-logging-enabled.html)

***

## 3.92.0

Released: 2024-11-11

**Added**

* Android Media Session integration in the [`player-media-session`](https://cdn.bitmovin.com/player/android/3.92.0/docs/player-media-session/index.html) module, enhancing media control and interaction.
  * To start using the Bitmovin Media Session integration, add the following dependency:
    ```kts
    implementation("com.bitmovin.player:player-media-session:<player-version>")
    ```
    ```groovy
    implementation 'com.bitmovin.player:player-media-session:<player-version>'
    ```
* [`MediaSession`](https://cdn.bitmovin.com/player/android/3.92.0/docs/player-media-session/com.bitmovin.player.api.media.session/-media-session.html), representing an active media session
* [`MediaSessionService`](https://cdn.bitmovin.com/player/android/3.92.0/docs/player-media-session/com.bitmovin.player.api.media.session/-media-session-service/index.html) as a base class to handle media session interactions, supporting controller connections and notifications

**Changed**

* Using the `TweaksConfig.forceReuseVideoCodecReasons` reconfigures the codec on reuse. Before it was reusing the codec without reconfiguration

**Deprecated**

* [`DefaultMediaDescriptor`](https://cdn.bitmovin.com/player/android/3.92.0/docs/player-core/com.bitmovin.player.ui.notification/-default-media-descriptor/index.html) and [`PlayerNotificationManager`](https://cdn.bitmovin.com/player/android/3.92.0/docs/player-core/com.bitmovin.player.ui.notification/-player-notification-manager/index.html). To show a player notification, use the media session integration instead.

***

## 3.91.0

Released: 2024-10-31

**Added**

* [`PlayerEvent.StallStarted`](https://cdn.bitmovin.com/player/android/3.91.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-stall-started/index.html) and [`PlayerEvent.StallEnded`](https://cdn.bitmovin.com/player/android/3.91.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-stall-ended/index.html) being emitted when an active ad stalls due to insufficient buffer

* [`PlayerViewConfig.enableComposeSurfaceSyncWorkaround`](https://cdn.bitmovin.com/player/android/3.91.0/docs/player-ui-web/com.bitmovin.player.api.ui/-player-view-config/enable-compose-surface-sync-workaround.html) to enable a fix for the PlayerView being cropped sometimes when
  using compose on Android 34 devices. This is per default disabled

**Changed**

* [`Player.isStalled`](https://cdn.bitmovin.com/player/android/3.91.0/docs/player-core/com.bitmovin.player.api/-player/is-stalled.html) now returns `true` when an active ad stalls due to insufficient buffer

***

## 3.90.0

Released: 2024-10-28

**Added**

* [`UiConfig.Web.variant`](https://cdn.bitmovin.com/player/android/3.90.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/index.html#1821415016%2FProperties%2F349001878) to set the UI variant that should be used by the Bitmovin Web UI
* [`UiConfig.Web.focusUiOnInitialization`](https://cdn.bitmovin.com/player/android/3.90.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/index.html#-43035742%2FProperties%2F349001878) to allow the Bitmovin Web UI to request focus on initialization. Per default it will be enabled, when the `TvUi` variant is configured

**Fixed**

* [`AdError`](https://cdn.bitmovin.com/player/android/3.90.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-ad-error/index.html) event not being sent when playing an IMA ad that causes a source related error
* Spacial navigation in the Web UI does not work properly
* The main thread blocking on the playback thread very rarely resulting in ANRs

**Changed**

* Integrated changes from `Media3 ExoPlayer` version `1.4.1`
* Default Bitmovin Web UI version to `3.74.0`
* Officially support Android 15. Update `targetSdk` and `compileSdk` to 35

***

## 3.89.0

Released: 2024-10-18

**Added**

* [`TweaksConfig.forceReuseVideoCodecReasons`](https://cdn.bitmovin.com/player/android/3.89.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/force-reuse-video-codec-reasons.html) that allows to force the reuse of the video codec despite a configuration change. This flag should be set only, if it is known that the codec can handle the given configuration change. A [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.89.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) is emitted when such a mismatch is ignored

**Fixed**

* [`SourceOptions.startOffset`](https://cdn.bitmovin.com/player/android/3.89.0/docs/player-core/com.bitmovin.player.api.source/-source-options/start-offset.html), when set, very rarely causing a deadlock on VoD playback start

**Changed**

* Downgraded Dagger from `2.51.1` to `2.49` to resolve incompatibility issues with versions earlier than `2.50.0`, introduced by a breaking change in Dagger [`2.50.0`](https://github.com/google/dagger/releases/tag/dagger-2.50)

**Removed**

* `TweaksConfig.forceReuseVideoCodecOnColorInfoMismatch` in favor of [`TweaksConfig.forceReuseVideoCodecReasons`](https://cdn.bitmovin.com/player/android/3.89.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/force-reuse-video-codec-reasons.html)

***

## 3.88.0

Released: 2024-10-14

**Added**

* [`TweaksConfig.reuseAdsLoaderAcrossImaAds`](https://cdn.bitmovin.com/player/android/3.88.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/reuse-ads-loader-across-ima-ads.html) to optimized playback performance for subsequent IMA ads by reusing the IMA AdsLoader component across multiple playback sessions

**Changed**

* Optimized playback performance for subsequent ads by reusing internal components across multiple playback sessions
* Enabled chunkless preparation for HLS streaming ads per default to improve ad startup times. The feature can be disabled by setting [`TweaksConfig.allowChunklessPreparationForHlsStreamingAds`](https://cdn.bitmovin.com/player/android/3.88.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/allow-chunkless-preparation-for-hls-streaming-ads.html) to `false`
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#3100) dependency to version `3.10.0`

***

## 3.87.0

Released: 2024-10-04

**Added**

* [`UiConfig.WebUi.customOptions`](https://cdn.bitmovin.com/player/android/3.87.0/docs/player-ui-web/com.bitmovin.player.api.ui/-ui-config/-web-ui/custom-options.html) to allow configuring custom options for the Bitmovin Web UI

**Changed**

* When [`catchupConfig`](https://cdn.bitmovin.com/player/android/3.87.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/catchup-config.html)'s [`seekThreshold`](https://cdn.bitmovin.com/player/android/3.87.0/docs/player-core/com.bitmovin.player.api.live/-target-synchronization-config/seek-threshold.html) is set,
  the player will now timeshift as soon as it has enough forward buffer instead of when the network jitter estimator estimated it safe

***

## 3.86.0

Released: 2024-09-27

**Added**

* [`AdaptationConfig.qualityStabilityBalance`](https://cdn.bitmovin.com/player/android/3.86.0/docs/player-core/com.bitmovin.player.api.media/-adaptation-config/quality-stability-balance.html) to balance between quality and stability when playing a live stream

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#392) dependency to version `3.9.2`

***

## 3.85.0

Released: 2024-09-21

**Added**

* [`AdSource.videoLoadTimeout`](https://cdn.bitmovin.com/player/android/3.85.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source/video-load-timeout.html) which can be used to change the default timeout to wait for a video to load before timing out. This applies to IMA ads only
* [`TweaksConfig.httpStatusCodesToTryFallback`](https://cdn.bitmovin.com/player/android/3.85.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/http-status-codes-to-try-fallback.html) which can be used to specify a list of HTTP status codes that should trigger a fallback to another resource if one is available

**Fixed**

* [`SourceEvent.MetadataParsed`](https://cdn.bitmovin.com/player/android/3.85.0/docs/player-core/com.bitmovin.player.api.event/-source-event/-metadata-parsed/index.html) events are emitted for metadata and their wrapper metadata. Now the event is only emitted for the nested metadata.

**Changed**

* Optimized internal memory usage related to metadata handling

***

## 3.84.0

Released: 2024-09-13

**Added**

* [`TweaksConfig.releasePlayerTimeout`](https://cdn.bitmovin.com/player/android/3.84.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/release-player-timeout.html) to configure the timeout to release the player
* [`TweaksConfig.detachSurfaceTimeout`](https://cdn.bitmovin.com/player/android/3.84.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/detach-surface-timeout.html) to configure the timeout to detach the player from the surface
* [`TweaksConfig.disableAudioTracksWhileInBackground`](https://cdn.bitmovin.com/player/android/3.84.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/disable-audio-tracks-while-in-background.html) to work around a device specific issue that causes audio decoding to fail when the device is put into standby

***

## 3.83.0

Released: 2024-09-11

**Added**

* [`TweaksConfig.forceReuseVideoCodecOnColorInfoMismatch`](https://cdn.bitmovin.com/player/android/3.84.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/force-reuse-video-codec-on-color-info-mismatch.html) that allows to force the reuse of the video codec despite color information mismatch if it is known that the codec can handle the color information mismatch. A `PlayerEvent.Warning` is emitted when such a mismatch is ignored
* `PlayerEvent.Info` that is being emitted when the player recreates the video decoder on quality change

***

## 3.82.0

Released: 2024-09-06

**Added**

* [`TweaksConfig.assumeEmsgMetadataForHlsChunklessPreparations`](https://cdn.bitmovin.com/player/android/3.82.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/assume-emsg-metadata-for-hls-chunkless-preparations.html)
  to enable the parsing of EMSG timed metadata for HLS streams when [`TweaksConfig.allowChunklessPreparationForHls`](https://cdn.bitmovin.com/player/android/3.82.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/allow-chunkless-preparation-for-hls.html) is enabled

**Fixed**

* Ad playback doesn't continue on Android TV devices after the icon info dialog has been closed when using IMA SDK
* Learn more button in IMA ads wouldn't open a new page in Android API version 30 and higher

**Changed**

* Updated IMA SDK dependency to version `3.33.0`. This may require an update of the dependent Google Ads Play Services
* Improve performance when switching from a pre-roll ad to a live stream when
  [`targetLatency`](https://cdn.bitmovin.com/player/android/3.82.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html) is defined and
  [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.82.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) is set to `false` by regularly time shifting to the
  *keyframe closest to the live edge* while the pre-roll is playing

***

## 3.81.0

Released: 2024-08-30

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#380) dependency to version `3.8.0`

***

## 3.80.0

Released: 2024-08-29

**Added**

* Detailed error data for [`PlayerEvent.Error`](https://cdn.bitmovin.com/player/android/3.80.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) in case of a decoder initialization failure
* Detailed error data for [`PlayerEvent.Error`](https://cdn.bitmovin.com/player/android/3.80.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) in case of a decoder failure

**Changed**

* Improve performance when switching from a preroll ad to a live stream when
  [`targetLatency`](https://cdn.bitmovin.com/player/android/3.80.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html) is defined by regularly timeShifting to the live edge
  while the preroll is playing

***

## 3.79.0

Released: 2024-08-23

**Added**

* [`PlayerErrorCode.Timeout`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-timeout/index.html) to [`PlayerErrorCode`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/index.html) that will be emitted as part of a [`PlayerEvent.Error`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-error/index.html) when the player times out in an operation such as releasing resources when destroying the player
* [`PlayerWarningCode.DecoderInitializationRetry`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-warning-code/-decoder-initialization-retry/index.html) and [`PlayerWarningCode.DecoderInitializationFallback`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-warning-code/-decoder-initialization-fallback/index.html) to report on internal failure recovery mechanisms
* [`TweaksConfig.enableMainContentVideoCodecInitializationFallback`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-video-codec-initialization-fallback.html) and [`TweaksConfig.enableMainContentAudioCodecInitializationFallback`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-audio-codec-initialization-fallback.html) to change the decoder fallback behaviour
* [`TweaksConfig.enableAdContentVideoCodecInitializationFallback`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-ad-content-video-codec-initialization-fallback.html) and [`TweaksConfig.enableAdContentAudioCodecInitializationFallback`](https://cdn.bitmovin.com/player/android/3.79.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-ad-content-audio-codec-initialization-fallback.html) to change the decoder fallback behaviour during ad playback

**Changed**

* Enable video and audio decoder initialization fallback for main and ad content per default. This reduces playback error rates but potentially results in suboptimal decoders being used.

***

## 3.78.3

Released: 2024-08-13

**Fixed**

* Crash when a live stream ends while casting

***

## 3.78.2

Released: 2024-08-09

**Fixed**

* Significantly improve performance when disabling [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.78.2/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html)
  by only disabling video rendering during ads instead of disabling the whole video pipeline

***

## 3.78.1

Released: 2024-08-09

**Added**

* [`Quality.averageBitrate`](https://cdn.bitmovin.com/player/android/3.78.1/docs/player-core/com.bitmovin.player.api.media/-quality/average-bitrate.html) and [`Quality.peakBitrate`](https://cdn.bitmovin.com/player/android/3.78.1/docs/player-core/com.bitmovin.player.api.media/-quality/peak-bitrate.html) which are accessible via [`AudioQuality`](https://cdn.bitmovin.com/player/android/3.78.1/docs/player-core/com.bitmovin.player.api.media.audio.quality/-audio-quality/index.html) and [`VideoQuality`](https://cdn.bitmovin.com/player/android/3.78.1/docs/player-core/com.bitmovin.player.api.media.video.quality/-video-quality/index.html)

**Fixed**

* [`SourceEvent.VideoQualitiesChanged`](https://cdn.bitmovin.com/player/android/3.78.1/docs/player-core/com.bitmovin.player.api.event/-source-event/-video-qualities-changed/index.html) not being emitted and [`Source.availableVideoQualities`](https://cdn.bitmovin.com/player/android/3.78.1/docs/player-core/com.bitmovin.player.api.source/-source/available-video-qualities.html) not being populated during ad playback when [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.78.1/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) is set to `false`

***

## 3.78.0

Released: 2024-08-02

**Added**

* [`TweaksConfig.enableMainContentDecodingDuringAds`](https://cdn.bitmovin.com/player/android/3.78.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/enable-main-content-decoding-during-ads.html) to support ad playback on devices with only one hardware decoder.
  Only [`AdSourceType.Ima`](https://cdn.bitmovin.com/player/android/3.78.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-ima/index.html) ads are currently supported

**Fixed**

* Consecutive scheduled ads sometimes playing without video when using the IMA ads module

**Changed**

* Enabled R8 [fullMode](https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md#r8-full-mode)

***

## 3.77.1

Released: 2024-07-26

**Fixed**

* Transition from live to VoD is not detected. Thus some player interaction misbehaves on and after the transition, including missing events.
* Memory leak when cleaning up player resources and IMA ads were played
* Requesting non-primary playlists on HLS low latency streams

**Known Issues**

* Consecutive scheduled ads sometimes playing without video when using the IMA ads module

***

## 3.77.0

Released: 2024-07-23

**Fixed**

* Issue where HDR color information caused codec errors, potentially leading to black screens during switches between HDR and SDR video tracks

**Changed**

* Integrated changes from `Media3 ExoPlayer` version `1.3.1`

***

## 3.76.0

Released: 2024-07-19

**Fixed**

* Setting [`SourceLiveConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html) now changes the initial player live edge instead of being the initial
  `timeShift` start position
  * When the the player reaches the target latency, the default Web UI will show the player position as "live"
  * Calling `timeShift(0.0)` now moves the player position to the target latency

**Changed**

* [`LowLatencyApi.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/target-latency.html) is now the live edge target latency. This means that:
  * Calling `timeShift(x)` doesn't change [`LowLatencyApi.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/target-latency.html) anymore
  * The player will only try to reach [`LowLatencyApi.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/target-latency.html) when playing at the live edge (`timeShift == 0.0`)
    * When time shifting away from the live edge (eg: `timeShift(-100)`), the player will aim to stay at that timeShift value
  * Changing the `targetLatency` changes the live edge position
    This aligns the behaviour of the Android player with the iOS and Web player
    * For example: when lowering the `targetLatency` by 5s, both the `timeShift` and `maxTimeShift`
      will lower by 5s, as the timeShift window is increased
* [`SourceLiveConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html), [`LowLatencyApi.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/target-latency.html), [`LowLatencyApi.latency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/latency.html), [`LowLatencyConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-config/target-latency.html) and [`LiveConfig.liveEdgeOffset`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-live-config/live-edge-offset.html) are now the distance
  to the current real time, instead of player live edge. This means that the value returned
  by [`LowLatencyApi.latency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/latency.html) is the glass-to-glass latency
  * Depending on the stream this change might cause the values that are returned by [`LowLatencyApi.latency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/latency.html) to be
    bigger, but this doesn't mean that the actual glass-to-glass latency is bigger compared to the old implementation
  * Similarly, bigger [`SourceLiveConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html) should be used, to accommodate for a realistic latency between
    the current real time and the playback position
  * The following represents the difference between the old and new behaviour graphically, where:
    * `1.)` represents the old behaviour. Player will time shift for `targetLatency` duration away from the player live edge and it will try to maintain this position
    * `2.)` represents the new behaviour. Setting a `targetLatency` moves the player live edge to the distance from the current real time. The player will try to bring the [`LowLatencyApi.latency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/latency.html) as close as possible to the `targetLatency` while avoiding stalls
    * `+` Represents the player position
    * `*` Represents the player live edge (the position at which the player is considered playing "live")
    * `#` Represents the current real time
      ```
      -------------------------------
      |        Live Window      *   |---> #
      -------------------------------
      1.)  +<-- targetLatency --|
      2.)           +*<-- targetLatency --|
      ```
* The default value of \[LowLatencyConfig.targetLatency] from `3.0` to `5.0` due to the changed mentioned above

**Deprecated**

* [`LiveConfig.liveEdgeOffset`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-live-config/live-edge-offset.html), use [`SourceLiveConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.76.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html) instead. This has the same effect, but is
  configurable on per source basis

***

## 3.75.1

Released: 2024-07-05

**Fixed**

* Returning `true` in [`AdvertisingConfig.shouldPlayAdBreak`](https://cdn.bitmovin.com/player/android/3.75.1/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/should-play-ad-break.html) for VMAP ads with multiple cue points sometimes results in invalid player state

***

## 3.75.0

Released: 2024-06-28

**Added**

* [`TweaksConfig.preferSoftwareDecoding`](https://cdn.bitmovin.com/player/android/3.75.0/docs/player-core/com.bitmovin.player.api/-tweaks-config/prefer-software-decoding.html) to prefer the use of software decoding for main content

**Fixed**

* Wrong default value for [`LowLatencyConfig.fallbackConfig`](https://cdn.bitmovin.com/player/android/3.75.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-config/fallback-config.html) being used when no [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.75.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) is provided, causing the player to speed up when slowdown is needed

**Changed**

* Updated `kotlinx-coroutines` from `1.8.0` to `1.8.1`
* Updated `kotlinx-serialization` from `1.9.22` to `2.0.0`
* Updated `gson` from `2.10.1` to `2.11.0`
* Updated `slf4j-api` from `2.0.5` to `2.0.7`
* Updated `androidx.annotation` from `1.7.1` to `1.8.0`
* Default Bitmovin Web UI version to `3.65.0`

***

## 3.74.0

Released: 2024-06-21

**Fixed**

* Playback not starting at correct position when seeking and replaying after playback finished
* Potential player freeze when scheduling a VMAP pre-roll ad and setting [`PlaybackConfig.isAutoplayEnabled`](https://cdn.bitmovin.com/player/android/3.74.0/docs/player-core/com.bitmovin.player.api/-playback-config/is-autoplay-enabled.html) to `true`

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#351) dependency to version `3.5.1`

**Known Issues**

* Wrong default value for [`LowLatencyConfig.fallbackConfig`](https://cdn.bitmovin.com/player/android/3.74.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-config/fallback-config.html) being used when no [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.74.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) is provided, causing the player to speed up when slowdown is needed
  To work around this issue set a [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.74.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) on your live sources

***

## 3.73.0

Released: 2024-06-07

**Fixed**

* Calling [`Player.seek`](https://cdn.bitmovin.com/player/android/3.73.0/docs/player-core/com.bitmovin.player.api/-player/seek.html) after [`PlayerEvent.PlaybackFinished`](https://cdn.bitmovin.com/player/android/3.73.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-playback-finished/index.html) erroneously resuming playback

**Changed**

* Default Bitmovin Web UI version to `3.64.0`

**Known Issues**

* Wrong default value for [`LowLatencyConfig.fallbackConfig`](https://cdn.bitmovin.com/player/android/3.73.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-config/fallback-config.html) being used when no [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.73.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) is provided, causing the player to speed up when slowdown is needed
  To work around this issue set a [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.73.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) on your live sources

***

## 3.72.0

Released: 2024-05-29

No changes compared to 3.71.0

***

## 3.71.0

Released: 2024-05-29

**Added**

* [`AnalyticsApi.ssai`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-analytics/com.bitmovin.player.api.analytics/-analytics-api/ssai.html) API to collect analytics for server side ad insertion using [Bitmovin Analytics](https://bitmovin.com/video-analytics/)
* [`VastAdData.wrapperAdSystems`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-core/com.bitmovin.player.api.advertising.vast/-vast-ad-data/wrapper-ad-systems.html) and [`VastAdData.wrapperCreativeIds`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-core/com.bitmovin.player.api.advertising.vast/-vast-ad-data/wrapper-creative-ids.html) to the \[Ad.data] for VAST ads handled by the Google IMA SDK

**Changed**

* Increased the `minSdkVersion` to 19
* No notification is shown when setting the [`OfflineConfig`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-core/com.bitmovin.player.api.offline/-offline-config/index.html) and no download is in progress
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#350) dependency to version `3.5.0`
* Calling [`PlayerView.setPlayer`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-ui-web/com.bitmovin.player/-player-view/set-player.html) with the already set instance has no effect anymore

**Known Issues**

* Wrong default value for [`LowLatencyConfig.fallbackConfig`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-config/fallback-config.html) being used when no [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) is provided, causing the player to speed up when slowdown is needed
  To work around this issue set a [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.71.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) on your live sources

***

## 3.70.0

Released: 2024-05-24

**Fixed**

* Low latency streams resuming without enough buffer after a stall, leading to repeated stalling,
  displaying only a few frames every stall.
  As a side effect, low latency streams are slightly slower to start but more stable
* Catchup [`TargetSynchronizationConfig.seekThreshold`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-target-synchronization-config/seek-threshold.html) used for fallback and vice-versa
* Player internally seeking to [`SourceOptions.startOffset`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.source/-source-options/start-offset.html) then [`SourceLiveConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html)
  on low latency stream start, leading to longer than expected playback start

**Changed**

* Live streams start at [`SourceLiveConfig.targetLatency`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/target-latency.html) if set instead of [`SourceOptions.startOffset`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.source/-source-options/start-offset.html)
* Default [`TargetSynchronizationConfig.seekThreshold`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-target-synchronization-config/seek-threshold.html) to `POSITIVE_INFINITY` (disabled)
  in order to reduce stalls and align the low latency catchup and fallback behaviour with the Bitmovin V8 web Player.
  This means that, if the new [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) (added in the last release, 3.69.0)
  is set to [`SourceLiveConfig`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/index.html)'s default value, the player will *not* timeshift to the target latency when too far.
  Instead it will continue to adjust the playback rate to converge to the target latency as it does inside the threshold.
  Behaviour was *not* changed when using the deprecated [`LiveConfig.lowLatencyConfig`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-live-config/low-latency-config.html)
  (timeshift threshold of 1s by default).
* Do not timeshift in most cases on initial play of a live stream.
  If [`PlaybackConfig.isAutoplayEnabled`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api/-playback-config/is-autoplay-enabled.html) is `false` and user waits for more than `5` second to press play,
  the player will still timeshift to [`LowLatencyApi.targetLatency`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-api/target-latency.html)
  to avoid taking a very long time to catchup the live edge

**Known Issues**

* Wrong default value for [`LowLatencyConfig.fallbackConfig`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-config/fallback-config.html) being used when no [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) is provided, causing the player to speed up when slowdown is needed
  To work around this issue set a [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.70.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) on your live sources

***

## 3.69.0

Released: 2024-05-17

**Added**

* [`SourceLiveConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/index.html) to configure the player behaviour when playing live content.
  Contrary to [`PlayerConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api/-player-config/index.html)'s [`LiveConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.live/-live-config/index.html) that applies to a whole playback session,
  [`SourceLiveConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/index.html) applies only the source it [`configures`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html).

**Fixed**

* Player might be paused after skipping an VMAP ad break by using [`AdvertisingConfig.shouldPlayAdBreak`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/should-play-ad-break.html)

**Changed**

* Added `DOCTYPE` declaration to the HTML document used to render the Bitmovin Player Web UI to prevent [quirks mode](https://developer.mozilla.org/en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode)
* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#340) dependency to version `3.4.0`
* Default Bitmovin Web UI version to `3.62.0`

**Deprecated**

* [`LiveConfig.lowLatencyConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.live/-live-config/low-latency-config.html). Use [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) instead
* [`LiveConfig.minTimeShiftBufferDepth`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.live/-live-config/min-time-shift-buffer-depth.html). Use [`SourceLiveConfig.minTimeShiftBufferDepth`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.live/-source-live-config/min-time-shift-buffer-depth.html) instead

**Known Issues**

* Wrong default value for [`LowLatencyConfig.fallbackConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.live/-low-latency-config/fallback-config.html) being used when no [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) is provided, causing the player to speed up when slowdown is needed
  To work around this issue set a [`SourceConfig.liveConfig`](https://cdn.bitmovin.com/player/android/3.69.0/docs/player-core/com.bitmovin.player.api.source/-source-config/live-config.html) on your live sources

***

## 3.68.0

Released: 2024-05-03

**Fixed**

* Crash when loading a source with a WebVTT thumbnail track that is malformed
* Bitmovin Advertising Module macro replacement not working if the macro markers are url encoded

**Changed**

* Bitmovin Advertising Module macro replacement no longer replacing all unknown macros with `-1`. Default value replacement can be done using the [`VastMacroConfig`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro-config/index.html) if required
* Extended error message content for [`DecoderGeneral`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-decoder-general/index.html), [`DecoderInitialization`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-decoder-initialization/index.html), [`DecodingFailed`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-decoding-failed/index.html), [`DecodingUnsupported`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-decoding-unsupported/index.html), [`DecodingExceedsCapabilities`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-error-code/-decoding-exceeds-capabilities/index.html), [`Io`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-io/index.html), [`ConnectionFailed`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-connection-failed/index.html), [`ConnectionTimeout`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-connection-timeout/index.html), [`HttpStatusCode`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-http-status-code/index.html) and [`ClearTextConnection`](https://cdn.bitmovin.com/player/android/3.68.0/docs/player-core/com.bitmovin.player.api.deficiency/-source-error-code/-clear-text-connection/index.html)

***

## 3.67.1

Released: 2024-04-26

**Fixed**

* An `IllegalArgumentException` being thrown when reducing the value of [`OfflineConfig.maxSimultaneousSegmentDownloads`](https://cdn.bitmovin.com/player/android/3.67.1/docs/player-core/com.bitmovin.player.api.offline/-offline-config/max-simultaneous-segment-downloads.html) and calling Bitmovin's [`DownloadManager.setRequirements`](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/offline/DownloadManager#setRequirements\(androidx.media3.exoplayer.scheduler.Requirements\))

***

## 3.67.0

Released: 2024-04-19

**Added**

* [`PlayerWarningCode.TargetLatencyTooLowForCurrentNetworkQuality`](https://cdn.bitmovin.com/player/android/3.67.0/docs/player-core/com.bitmovin.player.api.deficiency/-player-warning-code/-target-latency-too-low-for-current-network-quality/index.html),
  which is emitted in a [`PlayerEvent.Warning`](https://cdn.bitmovin.com/player/android/3.67.0/docs/player-core/com.bitmovin.player.api.event/-player-event/-warning/index.html) when setting the target latency
  for live playback to a value that is estimated to be too low for
  the current network latency and jitter

**Fixed**

* Bitmovin Advertising Module wrongly playing nested ad buffet ads as part of the ad pod
* Bitmovin Advertising Module sometimes not adhering to the expected ad pod sequence if the ad pod contains nested ad pods

***

## 3.66.0

Released: 2024-04-15

**Fixed**

* When connecting to a casting receiver before loading a playlist, the local player doesn't correctly track playlist transitions to new sources, causing the local player to play the first source after disconnecting from the casting receiver instead of continuing from the playlist position

**Changed**

* Default Bitmovin Web UI version to `3.58.0`
* Kotlin version to `1.9.23` and Kotlin coroutines to `1.8.0`
* Do not increase the target latency on stall.
  This resulted in a significant increase of the target latency during long playbacks with occasional stalls.
  After a stall, the latency will now slowly lower to the target latency as soon as
  the network condition have improved enough to avoid stalling again

***

## 3.65.0

Released: 2024-04-05

**Added**

* Bitmovin Advertising Module as an alternative to using IMA SDK to playback VAST-compliant ads. Using Bitmovin Advertising Module doesn't require any additional dependencies and offers a drop in replacement for the IMA SDK for the most common advertising scenarios. It supports seamless integration with the latest VAST `4.3` standard while offering reliable backward compatibility down to VAST `2.0`.
  * [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html) to schedule an [`AdSource`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source/index.html) using Bitmovin Advertising Module
  ```kotlin
  // Create an `AdItem` with one `AdSource` of type `AdSourceType.Bitmovin`
  val adItem = AdItem(position = "pre", AdSource(type = AdSourceType.Bitmovin, tag = adTagUrl))
  // You can either create the schedule before player creation using the advertising config
  playerConfig.advertisingConfig = AdvertisingConfig(adItem)
  // Or use the Player API to schedule the ad
  player.scheduleAd(adItem)
  ```
  * [`BitmovinAdvertisingConfig`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.bitmovin/-bitmovin-advertising-config/index.html) accessible via [`AdvertisingConfig.bitmovin`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising/-advertising-config/bitmovin.html) to configure Bitmovin Advertising Module handling
  * [`VastMacroConfig`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro-config/index.html) accessible via [`BitmovinAdvertisingConfig.macro`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.bitmovin/-bitmovin-advertising-config/macro.html) to configure VAST macro handling within Bitmovin Advertising Module
  * [`VastMacroValueProvider`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro-value-provider/index.html) accessible via [`VastMacroConfig.macroValueProvider`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro-config/macro-value-provider.html) to provide or override macro values dynamically
  * [`VastMacro`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro/index.html), [`VastMacroContext`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro-context/index.html) and [`VastMacroScope`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising.vast.macro/-vast-macro-scope/index.html) to facilitate the macro value providing process

**Fixed**

* Sources loaded in the error event callback sometimes being unloaded immediately

**Removed**

* `TweaksConfig.useBitmovinAdvertisingForAdSourceTypeUnknown`, use the newly introduced [`AdSourceType.Bitmovin`](https://cdn.bitmovin.com/player/android/3.65.0/docs/player-core/com.bitmovin.player.api.advertising/-ad-source-type/-bitmovin/index.html) instead

***

## 3.64.0

Released: 2024-03-29

**Added**

* Support for WebVTT default text and background color styling when using Bitmovin Web UI

**Changed**

* Improved `Cue.html` HTML generation:
  * `\t` previously transformed to `&nbsp; &nbsp; &nbsp;`, now transforms to `&#9;`
  * `"` previously transformed to `&quot;`, now stays `"`
  * The whole String is wrapped in a `<p></p>` tag

***

## 3.63.0

Released: 2024-03-22

**Added**

* `DecoderGeneral`, `DecoderInitialization`, `DecodingFailed`, `DecodingUnsupported` and `DecodingExceedsCapabilities` to `PlayerErrorCodes`
* `Io`, `ConnectionFailed`, `ConnectionTimeout`, `HttpStatusCode` and `ClearTextConnection` to `SourceErrorCodes`
* `AdvertisingConfig.shouldPlayAdBreak` that will be called every time an ad break is about to start. The return value determines if the ad break should be played or discarded
* `TweaksConfig.minForwardBufferLevelForQualityIncrease` to configure the time to switch to better quality track

**Fixed**

* Low Latency target set via `Player.lowLatency` not applied on some live streams with autoplay enabled
* Offline playback fails for some DRM protected HLS streams

**Changed**

* `PlayerEvent.Error` events are more fine granular with `DecoderGeneral`, `DecoderInitialization`, `DecodingFailed`, `DecodingUnsupported`, `DecodingExceedsCapabilities` error codes and the respective errors are no longer reported with the `General` error code
* `SourceEvent.Error` events are more fine granular with `Io`, `ConnectionFailed`, `ConnectionTimeout`, `HttpStatusCode` and `ClearTextConnection` error codes and the respective errors are no longer reported with the `General` error code
* Low latency behaviour:
  * Playback speed is proportional to the difference between the latency and its target
  * Latency is increased if the network is too slow to stay at the target
  * Latency is decreased if the network condition improves
  * The current target latency can be retrieved with (`player.lowLatency.targetLatency`)
    * Previously only the target latency when playing at the live edge was returned

**Removed**

* Low latency support for HLS live stream without `EXT-X-PROGRAM-DATE-TIME`.
  Such live streams are not compliant with the [HLS specification](https://developer.apple.com/documentation/http-live-streaming/hls-authoring-specification-for-apple-devices)

***

## 3.62.0

Released: 2024-03-08

**Fixed**

* `Player.timeShift` is ignored when a `LowLatencyConfig` is configured
* Some special characters in subtitles are displayed incorrectly

***

## 3.61.0

Released: 2024-03-01

**Added**

* `SourceEvent.PeriodChanged` to be emitted from sources of type DASH for which the active period has changed

***

## 3.60.0

Released: 2024-02-16

**Added**

* `UiConfig.WebUi.forceSubtitlesIntoViewContainer` to force subtitles into the player view instead of cropping them when using the Bitmovin Web UI
* `LinearAd.uiConfig` that holds relevant information for displaying the linear ad

**Fixed**

* `NetworkConfig.preprocessHttpRequestCallback` not able to remove or modify existing HTTP headers
* Cropped multi-line subtitles in fullscreen mode when using the Bitmovin Web UI by setting `UiConfig.WebUi.forceSubtitlesIntoViewContainer` to `true` per default

***

## 3.59.0

Released: 2024-02-02

**Fixed**

* DRM license renewal requested when downloading a DRM protected source for offline playback although `DrmConfig.isLicenseRenewable` is set to `false`

**Changed**

* Updated Google Cast SDK to `21.4.0`. With this update, the Google Cast SDK dependency raises the minimum supported Android version to `4.4`

***

## 3.58.1

Released: 2024-01-29

**Fixed**

* `UnsupportedOperationException` thrown when playing a stream with ads on Android 7.1 and below

***

## 3.58.0

Released: 2024-01-26

**Fixed**

* Live edge visible for a fraction of a second when `startOffset` is defined

**Known Issues**

* `UnsupportedOperationException` thrown when playing a stream with ads on Android 7.1 and below

**Changed**

* Integrated changes from `Media3 ExoPlayer` version `1.2.1`
* Increased minimum required `compileSdk` to `34`

***

## 3.57.1

Released: 2024-01-19

**Fixed**

* `NoClassDefFoundException` when instantiating a `Player` or `Source`

**Known Issues**

* `UnsupportedOperationException` thrown when playing a stream with ads on Android 7.1 and below

***

## 3.57.0

Released: 2024-01-19

**Added**

* New top level factory functions for `Player` and `Source`
  * `Player(Context, PlayerConfig, [AnalyticsPlayerConfig])` to create a `Player` instance
  * `PlayerBuilder` for `Player` creation from Java
  * `Source(SourceConfig, [AnalyticsSourceConfig])` to create a `Source` instance
  * `SourceBuilder` for `Source` creation from Java
  * `AnalyticsPlayerConfig.Enabled` and `AnalyticsPlayerConfig.Disabled` to either enabled and customize or disable analytics data collection on `Player` instances
  * `AnalyticsSourceConfig.Enabled` to customize analytics data collection for `Source`s

**Fixed**

* Potential crash when the audio capabilities change during playback

**Known Issues**

* `NoClassDefFoundException` when instantiating a `Player` or `Source`
* `UnsupportedOperationException` thrown when playing a stream with ads on Android 7.1 and below

**Deprecated**

* `Player.create` function and `PlayerFactory`. Use the `Player(...)` factory function, or the `PlayerBuilder` instead
* `Source.create` function and `SourceFactory`. Use the `Source(...)` factory function, or the `SourceBuilder` instead

***

## 3.56.0

Released: 2024-01-12

**Added**

* `PlaybackConfig.handleAudioFocus` to configure automatic audio focus handling
* `PlaybackConfig.handleAudioBecomingNoisy` to configure automatic audio becoming noisy handling
* Progressive ads can be played without the IMA SDK
* `PlayerWarningCode.IncorrectApiUsage` when scheduling an `AdItem` with sources of different types

**Fixed**

* Exception when the stream duration is negative. Now a `SourceEvent.Error` will be emitted in this case

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#332) dependency to version `3.3.2`

***

## 3.55.1

Released: 2024-01-05

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#331) dependency to version `3.3.1`

***

## 3.55.0

Released: 2023-12-22

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#330) dependency to version `3.3.0`

***

## 3.54.0

Released: 2023-12-15

**Added**

* `PlayerEvent.FrameAboutToBeRendered` which is emitted before every frame gets rendered onto the video surface.
  This event is experimental and needs to be enabled via the `TweaksConfig.enableFrameAboutToBeRenderedEvent`

**Fixed**

* Exception when offline download is paused and resumed in the background due to unmet requirements on Android 11 and below

**Changed**

* Kotlin to version `1.9.21`

**Removed**

* `FOREGROUND_SERVICE_DATA_SYNC` permission from the manifest as this is only required when using the offline feature.
  If you are using the offline feature, you now have to declare this permission in the `AndroidManifest.xml`.

***

## 3.53.0

Released: 2023-12-11

**Fixed**

* UI being visible in PiP mode after ad playback

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#310) dependency to version `3.1.0`

**Known Issues**

* Exception when offline download is paused and resumed in the background due to unmet requirements on Android 11 and below

***

## 3.52.0

Released: 2023-11-27

**Fixed**

* UI not displaying when providing an `AdaptationConfig.videoAdaptation` callback while using the Bitmovin Web UI
* Inconsistent Player behaviour after loading a new source or playlist during ad playback
* Video playback and Bitmovin Web UI not visible after loading a new source during an active ad break
* `SubtitleTrack.label` and `AudioTrack.label` incorrectly returning `language` instead of `label` for DASH streams with `Label` element present
* `AudioTrack.label` incorrectly returning an empty string if no `NAME` parameter is present for HLS streams. Now falling back to `language`

**Changed**

* Default Bitmovin Web UI version to `3.52.2`

**Known Issues**

* Exception when offline download is paused and resumed in the background due to unmet requirements on Android 11 and below

***

## 3.51.0

Released: 2023-11-13

**Fixed**

* Android resources of the `jason` build might clash with exoplayer/media3 resources
* `PlayerView` not displaying a fullscreen button when adding a fullscreen handler while not being attached to window

**Changed**

* The `exo` prefix of android resources of the `jason` build to `bmp`

**Known Issues**

* Exception when offline download is paused and resumed in the background due to unmet requirements on Android 11 and below

***

## 3.50.0

Released: 2023-11-06

**Added**

* `TweaksConfig.allowChunklessPreparationForHls` to allow HLS preparation without downloading media segments

**Changed**

* Integration from `ExoPlayer 2.19.1` to `Jetpack Media3 ExoPlayer 1.1.1`. This internal change does not require any further action except in special cases:
  * If you are using the `TweaksConfig.exoPlayerCache` api you will have to migrate the package imports from `com.google.android.exoplayer2.upstream.cache.Cache` to `androidx.media3.datasource.cache.Cache`.
  * If you are setting `OfflineConfig.requirements`, you will have to migrate to `OfflineConfig.deviceStateRequirements`.
  * If you are using a custom `CaptionStyle`, you will have to migrate from ExoPlayer's `CaptionStyleCompat` to `com.bitmovin.player.CaptionStyle`.
  * If you are catching `UnsupportedDrmException` you will have to update the import package from `com.google.android.exoplayer2.drm.UnsupportedDrmException` to `com.bitmovin.player.api.deficiency.exception.UnsupportedDrmException`. This change was already introduced in [3.48.0](#3480---2023-10-16)
  * If you are already using `Jetpack Media3 ExoPlayer` in addition to `Bitmovin Player` please make sure to use the `+jason` version of the `Bitmovin Player`. Read this [guide](https://developer.bitmovin.com/playback/docs/can-i-use-exoplayer-and-the-bitmovin-player-android-sdk-in-the-same-project) for more information.

**Removed**

* Deprecated methods that require an ExoPlayer import which is not compatible with androidx's media3
  * `OfflineConfig.requirements` is now a read only property. To set requirements, use `OfflineConfig.deviceStateRequirements`
  * Removed `SubtitleRendererView.setStyle(CaptionStyleCompat)`. Use `SubtitleRendererView.setStyle(CaptionStyle)` instead.

**Known Issues**

* Exception when offline download is paused and resumed in the background due to unmet requirements on Android 11 and below

***

## 3.49.0

Released: 2023-10-23

**Added**

* `ImaConfig` containing IMA specific configuration
* `AdvertisingConfig.ima` to configure IMA for a player
* `ImaUiType` and `ImaConfig.preferredUiType` to configure the preferred UI type for IMA ads
* `PlayerWarningCode.DisablingImaUiFailed` which is emitted in a `PlayerEvent.Warning` when the `ImaConfig.preferredUiMode` could not be applied
* `PlayerWarningCode.ApplyingImaUiElementPreferenceFailed` which is emitted in a `PlayerEvent.Warning` when the `ImaConfig.preferredUiElements` could not be applied

**Fixed**

* Player wrongly emitting an additional `PlayerEvent.VideoSizeChanged` event with height and width set to `0` when manually switching video quality, causing `PlayerView` to be resized

**Deprecated**

* `AdvertisingConfig.adsManagerAvailableCallback`. Use `ImaConfig.adsManagerAvailable` instead
* `AdvertisingConfig.beforeInitialization`. Use `ImaConfig.beforeInitialization` instead
* `AdvertisingConfig.imaUiElements`. Use `ImaConfig.preferredUiElements` instead

***

## 3.48.0

Released: 2023-10-16

**Added**

* `UiConfig.WebUi.playbackSpeedSelectionEnabled` to provide access to the [UIConfig.playbackSpeedSelectionEnabled](https://github.com/bitmovin/bitmovin-player-ui/blob/ba2982b9901c3fe3b9c5a09107f06eb4f703d628/src/ts/uiconfig.ts#L70) of the Bitmovin Web UI
* `OfflineConfig.deviceStateRequirements` as a replacement for the deprecated `OfflineConfig.requirements`
* `SubtitleView.setStyle(CaptionStyle)` as a replacement for the deprecated `SubtitleView.setStyle(CaptionStyleCompat)`

**Fixed**

* Crash when using built-in analytics on Android API level below 21. Analytics is now disabled with a warning if used on Android < 5 devices

**Changed**

* `com.bitmovin.player.api.deficiency.exception.UnsupportedDrmException` as a replacement for `com.google.android.exoplayer2.drm.UnsupportedDrmException`
  Please note, this is a breaking change in your exception handling, in case you are catching this specific exception. To resolve this, update the import package.

**Deprecated**

* `OfflineConfig.requirements`. Use `OfflineConfig.deviceStateRequirements` instead
* `SubtitleView.setStyle(CaptionStyleCompat)`. Use `SubtitleView.setStyle(CaptionStyle)` instead

**Known Issues**

* Player wrongly emitting an additional `PlayerEvent.VideoSizeChanged` event with height and width set to `0` when manually switching video quality, causing `PlayerView` to be resized

***

## 3.47.0

Released: 2023-10-09

**Added**

* `PlayerViewConfig` that configures the visual presentation and behaviour of a `PlayerView`
* Constructor to the `PlayerView` that allows passing a `PlayerViewConfig`

**Deprecated**

* `PlayerConfig.styleConfig` as well as `StyleConfig` itself. Use the newly introduced `PlayerViewConfig` on the `PlayerView` instead

**Known Issues**

* Player wrongly emitting an additional `PlayerEvent.VideoSizeChanged` event with height and width set to `0` when manually switching video quality, causing `PlayerView` to be resized

***

## 3.46.0

Released: 2023-10-02

**Changed**

* Integrated changes from ExoPlayer version `2.19.1`

**Fixed**

* Potential manifest merger error due to unnecessary `android:allowBackup`, `android:label` and `android:supportsRtl` application fields declared in `player-core`s `AndroidManifest.xml`

**Known Issues**

* Player wrongly emitting an additional `PlayerEvent.VideoSizeChanged` event with height and width set to `0` when manually switching video quality, causing `PlayerView` to be resized

***

## 3.45.0

Released: 2023-09-25

**Added**

* `TweaksConfig.preferSoftwareDecodingForAds` to prefer the use of software decoding for ads playback

***

## 3.44.0

Released: 2023-09-18

**Added**

* `foregroundServiceType` and `FOREGROUND_SERVICE_DATA_SYNC` permission to `BitmovinDownloadService`
* `RECEIVER_NOT_EXPORTED` flag to dynamically registered `BroadcastReceiver` in `PlayerNotificationManager`

**Fixed**

* Missing class definition when loading a VR configured source and using the default UI

**Changed**

* Updated Google Cast SDK to `21.3.0`
* Updated IMA SDK dependency to version `3.31.0`. This may require an update of the dependent Google Ads Play Services
* Updated JS dependencies, including the Bitmovin Player UI to 3.50.0

***

## 3.43.1

Released: 2024-02-09

**Fixed**

* Android resources of the `jason` build might clash with exoplayer/media3 resources

**Changed**

* The `exo` prefix of android resources of the `jason` build to `bmp`

***

## 3.43.0

Released: 2023-09-04

**Added**

* `TweaksConfig.discardAdsWhileCasting` to control advertisement discard behavior when casting with advertisements scheduled
* Warn when player without analytics load source with metadata

**Fixed**

* Pre-roll ad playback starts locally, when creating a player and starting playback while a cast session is connecting
* VMAP ad playback starts locally while casting. VMAP ad blocks are now suppressed and played back once the cast session stops
* Inconsistent API behaviour when creating and using a player while a cast session is connecting

***

## 3.42.0

Released: 2023-08-16

**Added**

* `AdItem.vastLoadTimeout` which can be used to change the timeout for VAST ad manifest downloads

***

## 3.41.0

Released: 2023-08-07

**Added**

* `Player` and `Source` methods to collect Player Analytics using [Bitmovin Analytics](https://bitmovin.com/video-analytics/).
  The following APIs can be used to collect playback analytic events:
  * `Player.create(Context, PlayerConfig, AnalyticsConfig, DefaultMetadata)` (extension), to create an analytics enabled `Player`
    * In Java, call `PlayerFactory.create`
  * `Source.create(SourceConfig, SourceMetadata)` (extension), to create a `Source` with analytics metadata attached
    * In Java, call `SourceFactory.create`
  * `Player.analytics` (extension), to control analytics collected by an analytics enabled `Player`
    * In Java, call `AnalyticsApi.from(Player)`
  * `Source.analytics` (extension), to control analytics collected by an analytics enabled `Source`
    * In Java, call `SourceAnalyticsApi.from(Source)`

**Fixed**

* `getThumbnail` returns wrong `Thumbnail` for DASH in-manifest thumbnails, when the manifest does not start at epoch

**Changed**

* Updated [Bitmovin Analytics collector](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases#300) dependency to version `3.0.0`. See also this release's \[Added] section.
  Dependent using the V2 standalone Bitmovin Analytics Collector may:
  * *Recommended*: migrate to the Player new built-in Analytics API with the help of our:
    * [Getting Started Guide](https://developer.bitmovin.com/playback/docs/getting-started-android),
    * [Analytics Sample](https://github.com/bitmovin/bitmovin-player-android-samples/blob/main/AnalyticsKotlin/src/main/java/com/bitmovin/player/samples/analytics/MainActivity.kt)
    * [Analytics Module Documentation](https://cdn.bitmovin.com/player/android/3.41.0/docs/player-analytics/index.html)
  * Migrate to the V3 standalone Bitmovin Analytics Collector with the help of our
    [Analytics V2 to V3 Migration Guide](https://developer.bitmovin.com/playback/docs/android-collector-migration-guide-from-api-v2-to-v3)
  * *Discouraged*: pin the Bitmovin Analytics Collector dependency to V2 with the help of our
    [FAQ](https://developer.bitmovin.com/playback/docs/how-can-i-specify-a-custom-bitmovin-analytics-collector-version)
    * Note that the new Player Analytics APIs are *incompatible* with the Bitmovin Analytics Collector V2.

***

## 3.40.0

Released: 2023-07-19

**Fixed**

* Potential main content playback before pre-roll ads
* Content flash before pre-roll ads when `StyleConfig.isHideFirstFrame` is set to `true`

**Changed**

* Some `AdItems` are processed quicker after scheduling, thus the timing of related ad event might change
* No `PlayerEvent.Play` and `PlayerEvent.Paused` are emitted before a pre-roll ad playback

***

## 3.39.1

Released: 2023-07-10

**Changed**

* Various internal improvements

***

## 3.39.0

Released: 2023-06-26

**Added**

* `Player.sdkVersion` to retrieve the Player SDK version name
* Add support for handling arbitrary method calls from Player Web UI via `CustomMessageHandler`

***

## 3.38.2

Released: 2023-06-12

**Changed**

* Various internal improvements

***

## 3.38.1

Released: 2023-05-30

**Fixed**

* Player freezing when seeking past multiple IMA VAST ads

***

## 3.38.0

Released: 2023-05-15

**Added**

* The [Bitmovin Analytics Collector](https://github.com/bitmovin/bitmovin-analytics-collector-android) as a dependency of the Bitmovin player.
  It is not yet used and is stripped when minification is enabled.
  As a consequence, when using Gradle's default dependency resolution strategy, updating the player will also update the analytic collector version.
* You can find the release notes for the Bitmovin Analytics Collector [here](https://developer.bitmovin.com/playback/docs/analytics-collector-android-releases).

***

## 3.37.2

Released: 2023-05-08

**Fixed**

* Image Media Playlist parsing fails with a warning if an attribute value on the `EXT-X-IMAGE-STREAM-INF` tag contains a colon, e.g. the scheme separator in an absolute URI

***

## 3.37.1

Released: 2023-05-02

**Fixed**

* `SourceConfig.startOffset` not respected when loading a source while connected to a cast-compatible device

***

## 3.37.0

Released: 2023-04-24

**Fixed**

* Potential duplicate class error when using the player along side another library that contains obfuscated symbols
* HTTP headers being stripped when a `NetworkConfig.preprocessHttpRequestCallback` is provided and its return value is not `null`

**Changed**

* Enforced that consuming projects must use a `compileSdk` at least as recent as the player `compileSdk` (currently `33`) to avoid runtime errors
* Integrated changes from ExoPlayer version `2.18.4`

***

## 3.36.0

Released: 2023-04-17

**Changed**

* Kotlin to version `1.8.20`

**Known Issues**

* Potential duplicate class error when using the player along side another library that contains obfuscated symbols

***

## 3.35.2

Released: 2023-04-11

**Fixed**

* Metadata events for embedded event streams in a DASH source sometimes not being emitted if there are multiple video adaptation sets

**Known Issues**

* Potential duplicate class error when using the player along side another library that contains obfuscated symbols

***

## 3.35.1

Released: 2023-04-03

**Fixed**

* `PlayerEvent.CastWaitingForDevice`, `PlayerEvent.CastStarted` and  `PlayerEvent.CastStopped` not being emitted when there is no active playback session
* Volume on connected cast enabled device always being overwritten with 100% for certain cast devices when creating a new player instance while being connected to a cast enabled device
* Bitmovin Analytics Collector <= `2.14.0` throwing a `ClassNotFoundException` when trying to access the Player version

**Known Issues**

* Potential duplicate class error when using the player along side another library that contains obfuscated symbols

***

## 3.35.0

Released: 2023-03-20

**Fixed**

* Window color behind subtitle cue sometimes being black when it should be unset when using `SubtitleView`
* Subtitles sometimes not being correctly centered when using the `SubtitleView`
* Buffer level always returns zero after some time for HLS live streams

**Known Issues**

* Bitmovin Analytics Collector <= `2.14.0` throws a `ClassNotFoundException` when trying to access the Player version

***

## 3.34.0

Released: 2023-03-13

**Added**

* `TweaksConfig.enableExoPlayerLogging` that specifies whether ExoPlayer logs shall be printed to the logcat console

**Known Issues**

* Bitmovin Analytics Collector <= `2.14.0` throws a `ClassNotFoundException` when trying to access the Player version

***

## 3.33.1

Released: 2023-03-06

**Fixed**

* Player triggering VAST `complete` tracking event when being destroyed while playing an ad
* Player triggering VAST `complete` tracking event when skippable ad is skipped
* Player not continuing main content playback when a VAST ad is discarded by either connecting to a cast-compatible device or changing the `AdViewGroup` during ad playback

***

## 3.33.0

Released: 2023-02-27

**Added**

* `OfflineWarningCode.DrmGeneral` which is emitted in a `OfflineEvent.Warning` when a general warning occurred for DRM handling

**Fixed**

* Memory leak when using the `BitmovinCastManager` and not updating the context on every activity switch

***

## 3.32.0

Released: 2023-02-20

**Added**

* `PlayerWarningCode.RemotePlaybackFailed` which is emitted when playback on a connected cast-compatible device produces an error
* `PlayerWarningCode.AdDiscarded` which is emitted when an ad is discarded by the player

**Fixed**

* Potential memory leak when destroying the player before an already loaded ad is played back
* Memory leak when playing an ad break of a VMAP ad and destroying the player before all remaining ad breaks have been reach

***

## 3.31.0

Released: 2023-02-13

**Added**

* `PlayerWarningCode.FeatureContextuallyUnsupported` which is emitted when a feature on the `Player` is not supported in the current context

**Fixed**

* Some errors not being propagated during Ad playback
* Casting DRM protected content without providing `SourceConfig.httpHeaders` does not start the video on the connected cast-compatible device

***

## 3.30.0

Released: 2023-02-06

**Added**

* `PlayerWarningCode.IncorrectApiUsage` which is emitted when a certain API usage on the `Player` is not correct and will have no effect

**Fixed**

* Detaching the renderer surface times out when destroying the player while metadata is being parsed
* Type safety (nullability) in `AudioLabeler`
* Type safety (nullability) in `AudioQualityLabeler`
* Type safety (nullability) in `VideoQualityLabeler`
* Type safety (nullability) in `SubtitleLabeler`
* Type safety (nullability) in `AdsManagerAvailableCallback`
* Type safety (nullability) in `BeforeInitializationCallback`
* Type safety (nullability) in `PrepareLicenseCallback`
* Type safety (nullability) in `PrepareMessageCallback`
* Type safety (nullability) in `ForecedSubtitleCallback`
* Type safety (nullability) in `VideoAdaptation`
* Type safety (nullability) in `PreprocessHttpRequestCallback`
* Type safety (nullability) in `BitmovinSurfaceListener`
* Type safety (nullability) in `VrRenderer`

**Changed**

* Default Bitmovin Web UI version to 3.42.0

***

## 3.29.0

Released: 2023-01-30

**Added**

* `RemoteControlConfig.onConfigureMediaInfo` which can be used to configure Google Cast `MediaInfo` objects before they are loaded on the cast enabled device
* `PlayerWarningCode.IncorrectApiUsage` which is emitted when a certain API usage on the `Player` is not correct and will have no effect

***

## 3.28.0

Released: 2023-01-23

**Added**

* `PlayerWarningCode.PlaylistManipulationFailed` which is emitted in a `PlayerEvent.Warning` when it was not possible to manipulate the playlist
* `PlayerWarningCode.AdvertisingGeneral` which is emitted in a `PlayerEvent.Warning` when a general warning occurred in the advertising feature
* `PlayerWarningCode.AdBreakFetchingFailed` which is emitted in a `PlayerEvent.Warning` when the current ad break will not play any ads as no ads could be fetched
* `PlayerWarningCode.CastSourceMappingFailed` which is emitted in a `PlayerEvent.Warning` when the playlist state on the cast enabled device is inconsistent to the local playlist state
* `OfflineWarningCode.DrmLicenseReleaseFailed` which is emitted in a `OfflineEvent.Warning` when the DRM license failed to release
* `SourceWarningCode.IncorrectApiUsage` which is emitted when a certain API usage is not correct and will have no effect
* `SourceWarningCode.FeatureContextuallyUnsupported` which is emitted when a feature is not supported in the current context
* Crash when playing Progressive Ads using Bitmovin Web UI

**Fixed**

* `ForegroundServiceStartNotAllowedException` thrown on Android 12 when download was paused and resumed in the background due to unmet requirements
* Downloaded asset sometimes being corrupted when download was paused and resumed due to unmet requirements

***

## 3.27.0

Released: 2023-01-17

**Changed**

* Updated Google Cast SDK to `21.2.0`
* Updated IMA SDK dependency to version `3.29.0`. This may require an update of the dependent Google Ads Play Services

***

## 3.26.1

Released: 2022-12-23

**Fixed**

* Player buffer level returns wrong values for DASH live streams with `availabilityStartTime` attribute set to time not at epoch
* Unlike Kotlin's `EventEmitter`, `JavaEventEmitter`'s `EventListener`s could not receive base events.

***

## 3.26.0

Released: 2022-12-06

**Added**

* `EventEmitter` functionality to `OfflineContentManager` enabling subscriptions to `OfflineEvent`s emitted during the `OfflineContentManager` lifecycle. `OfflineEvent.Error`,  `OfflineEvent.Warning` and `OfflineEvent.Info` are the supported events
* `PlayerEvent.Info` and `SourceEvent.Info`, which allow further monitoring of `Player` and `Source` workflows

***

## 3.25.2

Released: 2022-11-23

**Fixed**

* Player very rarely is paused after calling `play`
* `Player.duration` sometimes returning `0.0` instead of `-1.0` in case that the duration is unknown during casting
* Crash when encountering an IMA ad error while using the Bitmovin Web UI
* `VideoDownloadQualityChangend` and `AudioDownloadQualityChanged` are not emitted on period switches, if the according qualities have the same id
* Duration in Bitmovin Web UI displaying 00:00 after error in pre-roll ad

***

## 3.25.1

Released: 2022-10-25

**Fixed**

* Image Media Playlists being downloaded and parsed for live HLS sources. The Image Media Playlist thumbnail feature is designed for VOD only but was also active for live sources causing potential performance implications. The old behaviour can be restored by enabling `TweaksConfig.enableImageMediaPlaylistThumbnailParsingForLive`
* Query parameters missing from Image Media Playlist variant playlist requests and thumbnail URLs when parsing an Image Media Playlist with relative URLs
* Potential crash when rendering the first frame on some Android TV devices

**Deprecated**

* `ParcelUtil` as the provided functionality is generic parcelization logic and not required when interacting with the Player SDK

***

## 3.25.0

Released: 2022-10-11

**Fixed**

* Download service crashing when downloading content for as `SourceConfig` containing metadata
* `VrConfig` not being usable without the `kotlin-parcelize` plugin

**Removed**

* Gson serialization annotations and adapters for API models. The removal affects serialization of Bitmovin objects with Gson where no explicit serialization strategy is provided

**Changed**

* Integrated changes from ExoPlayer version `2.18.1`

***

## 3.24.2

Released: 2022-09-27

**Fixed**

* Incorrectly formatted seekbar when the duration is unknown in the default Bitmovin Web UI. Negative durations are no longer exposed to the web UI which might effect existing custom implementations

***

## 3.24.1

Released: 2022-09-13

**Fixed**

* Some low latency streams fail with error when the `LowLatencyConfig` is configured

***

## 3.24.0

Released: 2022-08-30

**Added**

* Automatic failover for multiple base URLs for DASH Image Adaptation Set thumbnails

**Deprecated**

* `BitmovinCastManager.sendMessage(Map<String, Any>)`. Use `BitmovinCastManager.sendMessage(String)` instead

***

## 3.23.0

Released: 2022-08-16

**Added**

* DASH Image Adaptation Set thumbnail support as specified in DASH-IF IOP

**Fixed**

* `EXT-X-DATERANGE` metadata tags are not processed for HLS playlists where the `EXT-X-PROGRAM-DATE-TIME` maps the start of the playlist to epoch 0

***

## 3.22.0

Released: 2022-08-02

**Changed**

* Integrated changes from ExoPlayer version `2.17.1`

***

## 3.21.0

Released: 2022-07-19

**Added**

* `AdvertisingConfig.imaUiElements` to configure the visible UI elements during IMA ad playback

***

## 3.20.0

Released: 2022-07-05

**Added**

* `PlaylistApi.remove`, which removes a `Source` from an active playback session
* `PlayerEvent.SourceRemoved`, which is emitted when a source was removed from an active playback session

**Fixed**

* Main content being visible between multiple ads configured at the same time in VMAP ad configurations

***

## 3.19.0

Released: 2022-06-21

**Added**

* `PlaylistApi.add`, which adds a `Source` to an active playback session
* `PlayerEvent.SourceAdded`, which is emitted when a source was added to the active playback session
* `SourceEvent.AudioTrackAdded` to replace `SourceEvent.AudioAdded` for naming consistency
* `SourceEvent.AudioTrackRemoved` to replace `SourceEvent.AudioRemoved` for naming consistency
* `SourceEvent.AudioTrackChanged` to replace `SourceEvent.AudioChanged` for naming consistency
* `SourceEvent.SubtitleTrackAdded` to replace `SourceEvent.SubtitleAdded` for naming consistency
* `SourceEvent.SubtitleTrackRemoved` to replace `SourceEvent.SubtitleRemoved` for naming consistency
* `SourceEvent.SubtitleTrackChanged` to replace `SourceEvent.SubtitleChanged` for naming consistency

**Fixed**

* Crash when trying to resume or delete a download initiated with player version < 3.14.1

**Deprecated**

* `SourceEvent.AudioAdded`. Use `SourceEvent.AudioTrackAdded` instead
* `SourceEvent.AudioRemoved`. Use `SourceEvent.AudioTrackRemoved` instead
* `SourceEvent.AudioChanged`. Use `SourceEvent.AudioTrackChanged` instead
* `SourceEvent.SubtitleAdded`. Use `SourceEvent.SubtitleTrackAdded` instead
* `SourceEvent.SubtitleRemoved`. Use `SourceEvent.SubtitleTrackRemoved` instead
* `SourceEvent.SubtitleChanged`. Use `SourceEvent.SubtitleTrackChanged` instead
* `Player.availableAudio`. Instead `Source.availableAudioTracks` can be used on the active source `Player.source`
* `Player.audio`. Instead `Source.selectedAudioTrack` can be used on the active source `Player.source`
* `Player.setAudio`. Instead `Source.setAudioTrack` can be used on the active source `Player.source`
* `Player.availableAudioQualities`. Instead `Source.availableAudioQualities` can be used on the active source `Player.source`
* `Player.audioQuality`. Instead `Source.selectedAudioQuality` can be used on the active source `Player.source`
* `Player.setAudioQuality`. Instead `Source.setAudioQuality` can be used on the active source `Player.source`
* `Player.availableVideoQualities`. Instead `Source.availableVideoQualities` can be used on the active source `Player.source`
* `Player.videoQuality`. Instead `Source.selectedVideoQuality` can be used on the active source `Player.source`
* `Player.setVideoQuality`. Instead `Source.setVideoQuality` can be used on the active source `Player.source`
* `Player.availableSubtitles`. Instead `Source.availableSubtitleTracks` can be used on the active source `Player.source`
* `Player.subtitle`. Instead `Source.selectedSubtitleTrack` can be used on the active source `Player.source`
* `Player.setSubtitle`. Instead `Source.setSubtitle` can be used on the active source `Player.source`
* `Player.removeSubtitle`. Instead `Source.removeSubtitleTrack` can be used on the active source `Player.source`
* `Player.getThumbnail`. Instead `Source.getThumbnail` can be used on the active source `Player.source`

***

## 3.18.1

Released: 2022-05-24

**Fixed**

* Target buffer level potentially not being reached for high bitrate qualities
* All but the first created `OfflineContentManager` failing unrecoverably if network connection is lost during download

***

## 3.18.0

Released: 2022-05-10

**Added**

* `Source.availableAudioTracks`, which provides the currently available audio tracks of the source
* `Source.availableAudioQualities`, which provides the currently available audio qualities of the selected audio track of the source
* `SourceEvent.AudioAdded` to be emitted from the `Source` for which the audio track was added. It is now also emitted for inactive sources in a playlist
* `SourceEvent.AudioRemoved` to be emitted from the `Source` for which the audio track was added. It is now also emitted for inactive sources in a playlist
* `SourceEvent.AudioTracksChanged`, which is emitted when the `Source.availableAudioTracks` changed
* `SourceEvent.AudioQualityAdded`, which is emitted when a new audio quality was added to `Source.availableAudioQualities`
* `SourceEvent.AudioQualityRemoved`, which is emitted when an audio quality was removed from `Source.availableAudioQualities`
* `SourceEvent.AudioQualitiesChanged`, which is emitted when the `Source.availableAudioQualities` changed
* `SourceEvent.AudioChanged` to be emitted from the `Source` for which the audio track changed. It is now also emitted for inactive sources in a playlist
* `Source.setAudioTrack`, which allows setting an audio track for the source
* `Source.selectedAudioTrack`, which provides the currently selected audio track of the source
* `SourceEvent.AudioQualityChanged` to be emitted from the `Source` for which the audio quality changed. It is now also emitted for inactive sources in a playlist
* `Source.setAudioQuality`, which allows setting a fixed audio quality for the source
* `Source.selectedAudioQuality`, which provides the currently selected audio quality of the source
* `SourceEvent.AudioDownloadQualityChanged` to be emitted from the `Source` for which the download quality changed. It is now also emitted for inactive sources in a playlist
* `SourceEvent.Warning` and `SourceEvent.Error` to be emitted from the `Source` for which the respective warning or error occurred. It is now also emitted for inactive sources in a playlist

**Fixed**

* Crash when creating a `PlayerNotificationManager` on Android 31 devices
* Some errors not being surfaced via the corresponding `SourceEvent.Error` or `PlayerEvent.Error` listeners

***

## 3.17.0

Released: 2022-04-26

**Added**

* `Source.availableSubtitleTracks`, which provides the currently available subtitle tracks of the source
* `SourceEvent.SubtitleAdded` to be emitted from the `Source` for which the subtitle track was added. It is now also emitted for inactive sources in a playlist
* `SourceEvent.SubtitleRemoved` to be emitted from the `Source` for which the subtitle track was added. It is now also emitted for inactive sources in a playlist
* `SourceEvent.SubtitleTracksChanged`, which is emitted when the `Source.availableSubtitleTracks` changed
* `Source.setSubtitleTrack`, which allows setting a subtitle track for the source
* `Source.selectedSubtitleTrack`, which provides the currently selected subtitle track of the source
* `SourceEvent.SubtitleChanged` to be emitted from the `Source` for which the subtitle track changed. It is now also emitted for inactive sources in a playlist

**Fixed**

* User-Agent header being ignored/overridden when set via the `PreprocessHttpRequestCallback`
* Download service crashing when setting the `OfflineConfig` before creating an `OfflineContentManager`

***

## 3.16.0

Released: 2022-04-12

**Added**

* `Source.setVideoQuality`, which allows setting a fixed video quality for the source
* `Source.selectedVideoQuality`, which provides the currently selected video quality of the source

**Fixed**

* Last ad frame being visible after orientation changes on Android 12
* Main content being visible in background during fullscreen ad playback, if aspect ratio does not exactly fit the screens ratio
* No audio being played back after switching from a fixed `AudioQuality` to "auto"
* `AudioTrack` selection being ignored after selecting a `AudioQuality`
* Foreground notification of the download service not vanishing if all downloads are suspended

**Changed**

* Download Service stops itself when all downloads are suspended

***

## 3.15.0

Released: 2022-03-16

**Added**

* `Source.availableVideoQualities`, which provides the currently available video qualities of the source
* `SourceEvent.VideoQualityAdded`, which is emitted when a video quality has been added to the source
* `SourceEvent.VideoQualityRemoved`, which is emitted when a video quality has been removed from the source
* `SourceEvent.VideoQualitiesChanged`, which is emitted when when the `Source.availableVideoQualities` changed
* `SourceEvent.VideoDownloadQualityChanged` to be emitted from the `Source` for which the download quality changed. It is now also emitted for inactive sources in a playlist

**Fixed**

* Offline thumbnail scrubbing not working on devices running Android 11+
* Casting to a remote device being stopped when destroying the Bitmovin Player
* `ExpandedControllerActivity` loading endlessly if pausing an active cast session
* Wrong video qualities being displayed in Bitmovin Web UI when video qualities change during playback
* Potential crash when getting a buffer level via `BufferApi.getLevel`
* `SubtitleTrack` selection is reset to default when selecting an `AudioTrack`
* `AudioTrack` selection is reset to default when selecting a `SubtitleTrack`
* Incomplete telemetry data being sent to Bitmovin backend

***

## 3.14.1

Released: 2022-03-16

**Fixed**

* Incomplete telemetry data being sent to Bitmovin backend

***

## 3.14.0

Released: 2022-03-01

**Fixed**

* Live edge being clamped to `EXT-X-START:TIME-OFFSET` value if present in a live HLS playlist. This could lead to an invalid DVR window, affecting potential `timeshift` operations

**Known Issues**

* Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version `3.14.1+`
* `AudioTrack` selection is reset to default when selecting a `SubtitleTrack` and vice versa

**Changed**

* Integrated changes from ExoPlayer version `2.16.1`
* `SourceOptions.startOffset` is now nullable and `null` per default. This change was necessary to properly support `EXT-X-START:TIME-OFFSET` values

***

## 3.13.3

Released: 2022-03-16

**Fixed**

* Incomplete telemetry data being sent to Bitmovin backend

***

## 3.13.2

Released: 2022-02-15

**Fixed**

* `PlayerEvent.TimeChanged` being emitted before the start offset is applied for live sources
* `PlayerEvent.TimeChanged` not being emitted after a successful seek or time shift when paused

**Known Issues**

* Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version `3.13.3+`

***

## 3.13.1

Released: 2022-02-03

**Fixed**

* Player emitting an error when the app that uses the Player is obfuscated by R8

**Known Issues**

* Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version `3.13.3+`

***

## 3.13.0

Released: 2022-02-01

**Added**

* `Source.seekableRange`, which returns a time range in seconds the player can seek in between. Does not return valid values for live sources yet
* `AdaptationConfig.initialBandwidthEstimateOverride` to replace `AdaptationConfig.startupBitrate` as the latter does not do what the name suggests

**Fixed**

* `Player.seek` or `Player.timeshift` being ignored when called inside `PlayerEvent.Ready` listener

**Known Issues**

* The existing proguard rules that should be used with the Player do not work with this version and the Player emits an error when the app that uses the Player is obfuscated by R8. This is already fixed in version `3.13.1`
* Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version `3.13.3+`

**Changed**

* Updated IMA SDK dependency to version `3.26.0`. This may require an update of the dependent Google Ads Play Services
* Updated Google Cast SDK to `21.0.1`
* `PlayerEvent.TimeChanged` is now emitted on the main thread

**Deprecated**

* `AdaptationConfig.startupBitrate` as it does not do what the name suggests. Use `AdaptationConfig.initialBandwidthEstimateOverride` instead

***

## 3.12.0

Released: 2022-01-18

**Added**

* Support for different audio and video codec priorities via `SourceConfig.audioCodecPriority` and `SourceConfig.videoCodecPriority` when multiple sources are part of a playback session

**Fixed**

* Playhead on the seekbar jumping back and forth while seeking when using the default Bitmovin Web UI
* `SourceErrorCode.General` error description in Bitmovin Web UI showing placeholder instead of a proper message
* Potential `NullReferenceException` when playing multi period DASH live streams
* Muting during casting does not mute the connected cast-compatible device

**Changed**

* Default Bitmovin Web UI version to 3.32.0

***

## 3.11.1

Released: 2021-12-21

**Fixed**

* Streams containing unsupported metadata not playing
* `Player.currentTime` returning incorrect values for progressive live streams
* Post-roll IMA ads occasionally being played back only when replaying the source
* `ResourceIdentifierCallback` not being called for DASH segments
* `SourceEvent.SubtitleChanged` containing a special `off` subtitle track instead of `null` when enabling/disabling subtitles during casting. This behaviour was not in line with the same event during local playback.
* Subtitles not disabling when passing `null` to `Player.setSubtitle` during casting.

***

## 3.11.0

Released: 2021-12-07

**Added**

* `SourceEvent.DrmDataParsed` to be emitted from the corresponding `Source`
* `Player.playbackTimeOffsetToRelativeTime` to convert absolute live timestamps to relative timestamps
* `Player.playbackTimeOffsetToAbsoluteTime` to convert relative live timestamps to absolute timestamps

**Fixed**

* `Player.playbackVideoData` returning `null` after a period switch to a DASH period containing different qualities than the previous one
* `PlayerEvent.VideoPlaybackQualityChanged` being emitted with `null` as the new quality after a period switch to a DASH period containing different qualities than the previous one
* Setting `Player.volume` and calling `Player.mute` or `Player.unmute` not working when there is no source loaded
* Setting `Player.volume` and calling `Player.mute` or `Player.unmute` not working while connecting to a cast-compatible device
* Initial volume and muted state sometimes not being respected for ad playback
* Muxed tracks being listed as separate `OfflineOptionEntry`s for download
* Invalid tracks being listed as `OfflineOptionEntry`s for download

**Changed**

* Integrated changes from ExoPlayer version `2.15.1`
* Muted state is not being synced between the local device and any cast receiver anymore as the audio setup between those devices is too different for this to be a sensible default behavior. The old behavior can be achieved by manually muting or unmuting after `PlayerEvent.CastStarted` or `PlayerEvent.CastStopped` is emitted

***

## 3.10.0

Released: 2021-11-23

**Added**

* `SourceEvent.MetadataParsed` to be emitted for in-band metadata from the `Source` the metadata actually belongs to. With this addition all metadata formats are emitted correctly through the respective `Source`

**Fixed**

* `Player.currentTime` not returning an epoch timestamp for DASH live streams with periods declaring a `start` time
* `Player.currentTime` returning the seek target timestamp while seeking
* `Player.currentTime` returning the time shift target timestamp while time shifting
* `PlayerEvent.Seeked` being emitted before enough data is loaded to continue playback
* `PlayerEvent.TimeShifted` being emitted before enough data is loaded to continue playback
* Incorrect `Metadata.startTime` for in-band metadata in the first Period of a DASH live streams
* Incorrect `Metadata.startTime` for EventStream metadata in DASH live streams
* Low Latency catchup and fallback mechanism not working when close to the live edge
* Not selected media tracks being downloaded when they contain metadata
* `PlayerEvent.TimeShift` not containing absolute timestamps when time shifting in a DASH live source
* `PlayerEvent.TimeShift` not containing relative timestamps when time shifting in an HLS live source

**Changed**

* `PlayerEvent.Seeked` is now emitted once the seek operation is actually completed and enough data is buffered to continue playback instead of it being emitted immediately after calling `Player.seek`
* `PlayerEvent.TimeShifted` is now emitted once the time shift operation is actually completed and enough data is buffered to continue playback instead of it being emitted immediately after calling `Player.timeshift`
* `PlayerEvent.StallStarted` and `PlayerEvent.StallEnded` are not emitted during seek or time shift operations anymore
* The new event sequence when triggering replay by calling `Player.play` when the player has finished playback is `PlayerEvent.Play`, `PlayerEvent.PlaylistTransition`, `PlayerEvent.Playing` instead of `PlayerEvent.PlaylistTransition`, `PlayerEvent.Play`, `PlayerEvent.Playing`

**Known Issues**

* Incorrect `Metadata.startTime` for in-band metadata in periods that are not at the first position in DASH live streams

***

## 3.9.0

Released: 2021-11-10

**Added**

* `SourceEvent.DownloadFinished` to be emitted for inactive sources in a playlist
* Details on what caused a specific error (if available) to `OfflineErrorEvent`

**Fixed**

* General offline error being surfaced via `SourceErrorCode.General` instead of `OfflineErrorCode.General`

**Known Issues**

* Due to a limitation in the Google Cast SDK, casting does not work when targetSdkVersion is set to 31. This is tracked in <https://issuetracker.google.com/issues/195588434>

**Removed**

* Koin dependency

***

## 3.8.1

Released: 2021-10-28

**Fixed**

* Suspended offline downloads of individual tracks that were started utilizing Player SDK version 2 cannot be resumed with Player SDK version 3

**Known Issues**

* Due to a limitation in the Google Cast SDK, casting does not work when targetSdkVersion is set to 31. This is tracked in <https://issuetracker.google.com/issues/195588434>

***

## 3.8.0

Released: 2021-10-12

**Added**

* `PlayerNotificationManager.createWithNotificationChannel` overload that takes a `CustomActionReceiver`
* `Source.getThumbnail` to expose thumbnails for inactive sources in a player
* `AdItem.preloadOffset` to specify the amount of seconds the ad manifest should be loaded in advance compared to when the ad break is scheduled for playback
* Support for background playback of IMA ads

**Fixed**

* Bitmovin Web UI having an invalid duration when joining an existing cast session
* Bitmovin Web UI occasionally not reflecting the correct current time when starting a cast session while playback is paused
* Bitmovin Web UI having an invalid duration after pre-roll ad was played when autoplay is enabled
* Cast receiver incorrectly displaying live source with VoD UI
* `Player.duration` returning `0.0` instead of `-1.0` if it is unknown during casting
* `Player` crashing if it gets detached from the `PlayerView` while ads are scheduled

**Known Issues**

* Due to a limitation in the Google Cast SDK, casting does not work when targetSdkVersion is set to 31. This is tracked in <https://issuetracker.google.com/issues/195588434>

**Changed**

* The offset with which the manifest for ads was preloaded now defaults to `0` seconds (instead of `10`). With introducing the `preloadOffset` on the `AdItem` this can now be configured per ad break

***

## 3.7.1

Released: 2021-09-28

**Fixed**

* Ad playback not pausing if hosting app is sent to background

***

## 3.7.0

Released: 2021-09-14

**Added**

* `ResourceIdentifierCallback` parameter to `OfflineContentManager.getOfflineContentManager()` in order to not lose already downloaded resources when the resource URLs (e.g. segment URLs) have changed since the last time the source was downloaded for offline playback
* Support for the `@endNumber` attribute in DASH manifests

**Fixed**

* Additional `PlayerEvent.Playing` being emitted when player resumes playback after stall and it was playing before the stall
* `PlayerEvent.Paused` being emitted when pausing a fresh playback session where `Player.play` was never called before
* `Player.isPaused` returning true for a fresh playback session where `Player.play` was never called before pausing
* `PlayerEvent.CastPlaybackFinished` being emitted immediately after connecting to a cast-compatible device, even though playback is not finished
* `PlayerEvent.CastPlaying` being emitted immediately after connecting to a cast-compatible device, even though content is not playing
* `PlayerEvent.CastPaused` being emitted immediately after connecting to a cast-compatible device, even though content was not explicitly paused
* `PlayerEvent.Paused` being emitted when connecting to a cast-compatible device when content was already playing on the local device before
* Additional `PlayerEvent.Play` and `PlayerEvent.Playing` being emitted when returning from a cast-compatible device to local device playback and content was already playing on the cast-compatible device
* Replay button not showing on the local device when playback has finished while casting to a cast-compatible device
* `SourceConfig.audioCodecPriority` and `SourceConfig.videoCodecPriority` not being respected when loading a single source into the player
* `DownloadFinished.lastRedirectionLocation` being `null` when a redirect happened

**Changed**

* `PlayerEvent.Play`, `PlayerEvent.Playing`, `PlayerEvent.Paused` and `PlayerEvent.PlaybackFinished` are now also emitted while connected to a cast-compatible device

**Deprecated**

* `PlayerEvent.CastPaused`, `PlayerEvent.CastPlaying`, `PlayerEvent.CastPlaybackFinished`. `PlayerEvent.Paused`, `PlayerEvent.Playing` and `PlayerEvent.PlaybackFinished` can be used instead

**Removed**

* `TweaksConfig.shouldEmitAllPendingMetadataOnStreamEnd` as it has no effect anymore. The expected behaviour is now achieved without the need to configure it

***

## 3.6.0

Released: 2021-08-03

**Added**

* `PlaybackConfig.audioFilter` and `PlaybackConfig.videoFilter` that can be set to a new `MediaFilter` to specify how strictly potentially unsupported media tracks and qualities are filtered out of a playback session
* `TweaksConfig.devicesThatRequireSurfaceWorkaround` to workaround a potential problem with some device's `Surface` implementation
* `Cue.verticalType` to represent the vertical orientation of a cue

**Fixed**

* Subtitles being rendered off-screen when using the Bitmovin Player Web UI

**Changed**

* Media tracks and qualities that are definitely not supported during a playback session are now filtered out by default, meaning that they will not be exposed via `Player.availableAudio`, `Player.availableAudioQualities` and `Player.availableVideoQualities`. `PlaybackConfig.audioFilter` and `PlaybackConfig.videoFilter` can be set to a different `MediaFilter` to make the filtering more strict or to not filter at all
* Paddings and font sizes in the Web UI are slightly adjusted

***

## 3.5.0

Released: 2021-07-20

**Added**

* Support for EXT-X-DATERANGE metadata tags in HLS playlists, which are surfaced via `SourceEvent.MetadataParsed` and `PlayerEvent.Metadata` events

**Fixed**

* Wrong text positioning when using the `SubtitleView`
* `Player.destroy` leading to a deadlock if called while metadata is being decoded

***

## 3.4.0

Released: 2021-07-06

**Added**

* `SourceEvent.MetadataParsed` to be emitted for inactive sources in a playlist when DASH `EventStream` metadata is parsed

**Fixed**

* `EventMessage.durationMs` returning a nonsensical value when the duration is unknown
* Possible crash near end of stream with subtitles enabled

**Changed**

* `SourceEvent.MetadataParsed` for DASH `EventStream` metadata is now emitted as soon as the manifest is parsed instead of near the start time of the metadata
* `EventMessage.durationMs` is now nullable and is null if the duration of the metadata event is unknown

***

## 3.3.0

Released: 2021-06-22

**Added**

* `SourceEvent.MetadataParsed` to be emitted for inactive sources in a playlist when SCTE metadata is parsed for HLS content

**Fixed**

* Potentially wrong `timeshift` values after loading a source into a player that has played a live source before
* `SourceEvent.Unloaded` not being emitted through the `Player` when unloading the player
* Video freezing when skipping an ad
* Duplicate `PlayerEvent.PlaybackFinished` being emitted when loading, unloading or pausing the player after playback has finished
* `BufferApi.getLevel` returning the wrong buffer level when the next source in a playlist starts to load

***

## 3.2.0

Released: 2021-06-08

**Added**

* `TweaksConfiguration.useDrmSessionForClearSources` that specifies whether a DRM session should be used for clear sources in a playlist if they follow after a DRM protected source
* Performance improvements when using the Bitmovin Web UI by caching values that are fetched frequently

**Fixed**

* TTML image subtitle positioning in `SubtitleView`
* Potential crash when detaching and attaching a `Surface` to the player while playing non-DRM protected content and then detaching again when playing DRM protected content within the same playback session

***

## 3.1.0

Released: 2021-05-26

**Added**

* `BufferConfig.startupThreshold` to configure the minimum amount of seconds of playback data to buffer before starting playback for the first time
* `BufferConfig.restartThreshold` to configure the minimum amount of seconds of playback data to buffer before starting playback again after a stall

**Fixed**

* Potential `RemoteServiceException` when setting an `OfflineConfig`
* UI not reflecting correct video qualities and playback speed when attaching the `Player` to the `PlayerView` after loading a source

***

## 3.0.1

Released: 2021-05-11

**Fixed**

* Potential crash when starting playback during a cast session
* `PlayerEvent.Inactive` not being emitted for the previous playback session when loading new sources into an already active player
* Potential exception when casting to a remote device is stopped while it is actively playing
* Potential selection of wrong tracks when downloading HLS content
* Deadlock when using VR functionality
* UI always becoming visible after exiting PiP, ignoring previously set visibility
* PiP button not being displayed in the web UI
* Progressive content not being downloaded for offline playback

***

## 3.0.0

Released: 2020-04-27

**Added**

* Scope information to dependencies in the generated POM file of the SDK in order to not unnecessarily pollute the namespace of the consuming project
* The SDK now includes the source-code of the `api` package for a better developer experience without the need to consult the JavaDocs or external docs frequently
* Completely reworked documentation for a more productive and enjoyable learning experience. The new docs are based on Kotlin and include more information, a new design, search functionality and more
* More intuitive and flexible way of handling event subscriptions with the new `EventEmitter`, which is implemented by the `Player`, `Source` and `PlayerView`. It now requires less boilerplate to subscribe/unsubscribe to events and works with either lambdas or `EventListener` implementations, offering intuitive usage from Kotlin and Java
* `Player`, which replaces the `BitmovinPlayer` as the main player type. A `Player` instance can be created via `Player.create`
* `Source`, which represents the new main type that is loaded into a `Player`. It emits its own events and is configured via the `SourceConfig`. A `Source` instance can be created via `Source.create`
* `PlaylistConfig`, which allows the configuration of a playlist consisting of multiple `Source`s. This config can then be loaded into a player instance in order to enable gapless playback across multiple sources, as upcoming sources can be preloaded before they begin playback
* `Player.playlist` to manage the player's playlist and transition between sources
* `Player.source`, which returns the currently active `Source`
* `Player.load(Source)` to enable loading of the new `Source` type
* `SourceConfig.url`, which returns the url of the `SourceConfig`
* `SourceConfig(url: String, type: SourceType)` constructor to create a `SourceConfig` of a specific type
* `PlayerEvent.PlaylistTransition`, which is emitted when the player transitions between two sources in a playlist
* `SourceEvent.DurationChanged`, which is emitted when a source transitions from live to VoD
* `PlayerEvent.Active`, which is emitted when a playback session starts (i.e. a `Source` or `PlaylistConfig` is loaded into the player)
* `PlayerEvent.Inactive`, which is emitted when the player is unloaded

**Changed**

* Renamed Maven `artifactId` from `playercore` to `player`. The full dependency is now `com.bitmovin.player:player:<version>`
* Moved all public API to new `com.bitmovin.player.api` package, requiring a simple re-import. Some concrete implementations were not moved
* Renamed all classes/interfaces that have acronyms in their name to follow a consistent naming pattern (e.g. `VR` to `Vr`, `API` to `Api`)
* Replaced `BitmovinPlayerEvent` with `Event` and two subtypes: `PlayerEvent` and `SourceEvent`
* All events are now split up between `PlayerEvent` and `SourceEvent` (e.g. `ReadyEvent` is now `PlayerEvent.Ready`, `SourceLoadedEvent` is now `SourceEvent.Loaded`)
* Error codes were reworked and split up into `PlayerErrorCode` and `SourceErrorCode` enums
* Warning codes were reworked and split up into `PlayerWarningCode` and `SourceWarningCode` enums
* `EventListener` now has a `onEvent` function to make it generic and usable for all events instead of requiring a different interface for each event
* `SourceEvent.Load.sourceConfig` of type `SourceConfig` to `SourceEvent.Load.source` of type `Source`
* `SourceEvent.Loaded.sourceConfig` of type `SourceConfig` to `SourceEvent.Loaded.source` of type `Source`
* `PlayerEvent.Seek` now has `from` and `to` properties of type `SeekPosition`
* Default Bitmovin Web UI version to 3.23.0
* CAF is now used as the default cast receiver
* Renamed `SourceItem` to `SourceConfig`
* Renamed all configuration objects to use the `Config` suffix instead of the `Configuration` suffix
* Refactored many configs to data classes, making it possible to use named parameters instead of setters (e.g. `PlayerConfig(advertisingConfig = AdvertisingConfig())`)
* Changed enum code style from SCREAMING\_SNAKE\_CASE to PascalCase
* Renamed `BitmovinPlayerView` to `PlayerView`
* Renamed `BitmovinSubtitleView` to `SubtitleView`
* Renamed `BitmovinPlayerNotificationManager` to `PlayerNotificationManager`
* `SourceConfig` to only handle a single `ProgressiveSource`
* `SourceConfig` to only handle a single `DrmConfig`
* `SourceConfig.setPersistentPoster` to `sourceConfig.setPosterPersistent`
* Renamed `MediaSourceType` to `SourceType`
* Deprecated constructor `SourceConfig(url: String)` in favour of `SourceConfig.fromUrl(url: String)`
* Changed all `Array` return types in the `Player` to return `List` instead
* Improved nullability information on `PlayerConfig`, `VrConfig` and `LowLatencyConfig`
* Renamed `FullscreenHandler.isFullScreen` to `FullscreenHandler.isFullscreen` for consistency
* `SourceConfig.posterSource` is now of type `String?` instead of `URLResource`
* Changed return type of `AdvertisingConfig.schedule` from `Array` to `List`
* Changed return types of `PlaybackConfig.videoCodecPriority` and `PlaybackConfig.audioCodecPriority` from `Array` to `List`
* Renamed `AdaptationConfig.isAllowRebuffering` to `AdaptationConfig.isRebufferingAllowed`
* `Track.id` is not nullable anymore

**Deprecated**

* `MediaSource`, `AdaptiveSource`, `HlsSource`, `SmoothSource`, `ProgressiveSource` and  `DashSource`. `SourceConfig` should instead be constructed using an url and a `SourceType`. Alternatively, `SourceConfig.fromUrl(String)` can be used to try and auto-detect the source type. These deprecated functions will be removed in an upcoming minor version
* `SourceConfig.addSubtitleTrack` functions that do not take a `SubtitleTrack` directly. These deprecated functions will be removed in an upcoming minor version
* `SourceConfig.setThumbnailTrack` function that does not take a `ThumbnailTrack` directly. This deprecated function will be removed in an upcoming minor version

**Removed**

* Support for Bitmovin Web UI v2. Use Bitmovin Web UI v3 instead
* Support for non-CAF cast receivers
* `EventHandler`. Refer to the new `EventEmitter` to see how to subscribe to events of the `Player`/`Source`/`PlayerView`
* All `*Listener` classes, as the new `EventEmitter` works with lambdas or generic `EventListener` implementations
* `Player.setup`. In order to re-configure player behaviour, a new player must be created
* `ConfigurationUpdatedEvent`
* `Player.load(SourceConfiguration)`. Use `Player.load(Source)` or `Player.load(SourceConfig)` instead
* `flags` parameter from `OfflineContentManager.getOfflineContentManager()` and `BitmovinDownloadService()`
* Empty `Config` interface that some configs implemented
* `CastConfig`. Use `RemoteControlConfig` instead
* `PlaybackConfig.getAutoplayEnabled`. Use `isAutoplayEnabled` instead
* `PlaybackConfig.getMuted`. Use `isMuted` instead
* `PlaybackConfig.getTimeShiftEnabled`. Use `isTimeShiftEnabled` instead
* `AdBreakConfig.skippable`. Use `skippableAfter` instead
* `LinearAd.skippable`. Use `skippableAfter` instead
* Deprecated `BitmovinCastManager.initialize` functions
* `Track.getDefault`. Use `isDefault` instead
* `ThumbnailTrack` constructor which allows setting the `url`, `label`, `id` and `isDefault`. Use `ThumbnailTrack(url)` instead
* `StyleConfig.getUiEnabled`. Use `isUiEnabled` instead
* `getShowErrors`, `isShowErrors` and `setShowErrors` from the `StyleConfig`
* Deprecated methods from `SourceConfig`
* Deprecated `PlayerAPI` functions. The removed functionality can be found on their individual namepsaces (e.g. `Player.buffer`, `Player.lowLatency`, `Player.vr`)
* `PlayerConfig.fromJSON`
* `PlayerAPI` and moved definitions to the `Player` interface
* Generic type parameter from `UserInterfaceApi`
* `DrmSystems` enum. Use `WidevineConfig` and `ClearKeyConfig` directly
* `PlayerView` constructor that takes a `PlayerConfig`. Use `PlayerView(Context, Player?)` to provide a custom player instead
* `GoogleCastReceiverVersion` and all usages
* `PlayerFragment`
* `JsonConverter`