Release notes for the v2 version of the Android SDK can be found [here](🔗).
## 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 ServicesUpdated JS dependencies, including the Bitmovin Player UI to 3.50.0
## 3.43.0
Released: 2023-09-04
**Added**
`
TweaksConfig.discardAdsWhileCasting
` to control advertisement discard behavior when casting with advertisements scheduledWarn 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](🔗). 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 attachedIn 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](🔗) 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](🔗),
[Analytics Sample](🔗)
[Analytics Module Documentation](🔗)
Migrate to the V3 standalone Bitmovin Analytics Collector with the help of our [Analytics V2 to V3 Migration Guide](🔗)
_Discouraged_: pin the Bitmovin Analytics Collector dependency to V2 with the help of our [FAQ](🔗)
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 changeNo `
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 nameAdd 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](🔗) 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](🔗).
## 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 errorsIntegrated 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 sessionVolume 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 adPlayer triggering VAST `
complete
` tracking event when skippable ad is skippedPlayer 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 contextCrash 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 requirementsDownloaded 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 epochUnlike 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 castingCrash 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 idDuration 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 devicesSome 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 sessionWrong 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 ServicesUpdated 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 messagePotential `
NullReferenceException
` when playing multi period DASH live streamsMuting 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 streamsPost-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 oneSetting `
Player.volume
` and calling `Player.mute
` or `Player.unmute
` not working when there is no source loadedSetting `
Player.volume
` and calling `Player.mute
` or `Player.unmute
` not working while connecting to a cast-compatible deviceInitial volume and muted state sometimes not being respected for ad playback
Muxed tracks being listed as separate `
OfflineOptionEntry
`s for downloadInvalid 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 playbackIncorrect `
Metadata.startTime
` for in-band metadata in the first Period of a DASH live streamsIncorrect `
Metadata.startTime
` for EventStream metadata in DASH live streamsLow 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 anymoreThe 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 playlistDetails 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 playbackSupport 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 playbackSupport 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 beforeAdditional `
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 deviceReplay 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 allPaddings 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 unknownPossible 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 playerVideo 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 sourcePerformance 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 playerPotential 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 frequentlyCompletely 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 movedRenamed 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
` enumsWarning 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
` suffixRefactored 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
` insteadImproved 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
` insteadDeprecated `
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
` interfaceGeneric 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
`