Release Notes (Android)

Android SDK Release Notes

Release notes for the v2 version of the Android SDK can be found here.


3.93.0

Released: 2024-11-15

Added

  • DebugConfig.isLoggingEnabled 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

Removed


3.92.0

Released: 2024-11-11

Added

  • Android Media Session integration in the player-media-session module, enhancing media control and interaction.
    • To start using the Bitmovin Media Session integration, add the following dependency:
      implementation("com.bitmovin.player:player-media-session:<player-version>")
      
      implementation 'com.bitmovin.player:player-media-session:<player-version>'
      
  • MediaSession, representing an active media session
  • MediaSessionService 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


3.91.0

Released: 2024-10-31

Added

Changed

  • Player.isStalled now returns true when an active ad stalls due to insufficient buffer

3.90.0

Released: 2024-10-28

Added

Fixed

  • AdError 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

Fixed

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

Removed


3.88.0

Released: 2024-10-14

Added

Changed


3.87.0

Released: 2024-10-04

Added

Changed

  • When catchupConfig's seekThreshold 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

Changed


3.85.0

Released: 2024-09-21

Added

Fixed

  • SourceEvent.MetadataParsed 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


3.83.0

Released: 2024-09-11

Added

  • TweaksConfig.forceReuseVideoCodecOnColorInfoMismatch 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

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 is defined and
    TweaksConfig.enableMainContentDecodingDuringAds 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


3.80.0

Released: 2024-08-29

Added

Changed

  • Improve performance when switching from a preroll ad to a live stream when
    targetLatency is defined by regularly timeShifting to the live edge
    while the preroll is playing

3.79.0

Released: 2024-08-23

Added

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


3.78.1

Released: 2024-08-09

Added

Fixed


3.78.0

Released: 2024-08-02

Added

Fixed

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

Changed


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 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 is now the live edge target latency. This means that:
    • Calling timeShift(x) doesn't change LowLatencyApi.targetLatency anymore
    • The player will only try to reach LowLatencyApi.targetLatency 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, LowLatencyApi.targetLatency, LowLatencyApi.latency, LowLatencyConfig.targetLatency and LiveConfig.liveEdgeOffset are now the distance
    to the current real time, instead of player live edge. This means that the value returned
    by LowLatencyApi.latency is the glass-to-glass latency
    • Depending on the stream this change might cause the values that are returned by LowLatencyApi.latency 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 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 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


3.75.1

Released: 2024-07-05

Fixed


3.75.0

Released: 2024-06-28

Added

Fixed

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 to true

Changed

Known Issues


3.73.0

Released: 2024-06-07

Fixed

Changed

  • Default Bitmovin Web UI version to 3.64.0

Known Issues


3.72.0

Released: 2024-05-29

No changes compared to 3.71.0


3.71.0

Released: 2024-05-29

Added

Changed

Known Issues


3.70.0

Released: 2024-05-24

Fixed

Changed

Known Issues


3.69.0

Released: 2024-05-17

Added

Fixed

Changed

  • Added DOCTYPE declaration to the HTML document used to render the Bitmovin Player Web UI to prevent quirks mode
  • Updated Bitmovin Analytics collector dependency to version 3.4.0
  • Default Bitmovin Web UI version to 3.62.0

Deprecated

Known Issues


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


3.67.1

Released: 2024-04-26

Fixed


3.67.0

Released: 2024-04-19

Added

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.
    // 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)
    

Fixed

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

Removed

  • TweaksConfig.useBitmovinAdvertisingForAdSourceTypeUnknown, use the newly introduced AdSourceType.Bitmovin 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

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 Sources

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


3.55.1

Released: 2024-01-05

Changed


3.55.0

Released: 2023-12-22

Changed


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

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
    • 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 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 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-cores 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.
    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


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 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 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 EventListeners could not receive base events.

3.26.0

Released: 2022-12-06

Added

  • EventEmitter functionality to OfflineContentManager enabling subscriptions to OfflineEvents 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 OfflineOptionEntrys for download
  • Invalid tracks being listed as OfflineOptionEntrys 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

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


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

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 Sources. 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