ExoPlayer Versions Save

An extensible media player for Android

r2.13.2

3 years ago
  • Extractors:
    • Add support for MP4 and QuickTime meta atoms that are not full atoms.
  • UI:
    • Make conditions to enable UI actions consistent in DefaultControlDispatcher, PlayerControlView, StyledPlayerControlView, PlayerNotificationManager and TimelineQueueNavigator.
    • Fix conditions to enable seeking to next/previous media item to handle the case where a live stream has ended.
  • Audio:
    • Fix SimpleExoPlayer reporting audio session ID as 0 in some cases (#8585).
  • IMA extension:
    • Fix a bug where playback could get stuck when seeking into a playlist item with ads, if the preroll ad had preloaded but the window position of the seek should instead trigger playback of a midroll.
    • Fix a bug with playback of ads in playlists, where the incorrect period index was used when deciding whether to trigger playback of an ad after a seek.
  • Text:
    • Parse SSA/ASS font size in Style: lines (#8435).
  • VP9 extension: Update to use NDK r21 (#8581).
  • FLAC extension: Update to use NDK r21 (#8581).
  • Opus extension: Update to use NDK r21 (#8581).
  • FFmpeg extension: Update to use NDK r21 (#8581).

r2.13.1

3 years ago
  • Live streaming:
    • Fix playback issue for HLS live streams without program date time information (#8560).
    • Fix playback issue for multi-period DASH live streams (#8537).
    • Fix playback failures when playing live streams with video tunneling enabled (#8570).
  • IMA extension:
    • Fix handling of repeated ad loads, to avoid ads being discarded if the user seeks away and then back to a preloaded postroll (for example).
    • Fix a bug where an assertion would fail if the player started to buffer an ad media period before the ad URI was known then an ad state update arrived that didn't set the ad URI.
    • Add ImaAdsLoader.focusSkipButton to allow apps to request that the skip button should receive UI focus, if shown (#8565).
  • DRM:
    • Re-use the previous DrmSessionManager instance when playing a playlist (if possible) (#8523).
    • Propagate DRM configuration when creating media sources for ad content (#8568).
    • Only release 'keepalive' references to DrmSession in DefaultDrmSessionManager#release() if keepalive is enabled (#8576).

r2.13.0

3 years ago
  • Core library:
    • Verify correct thread usage in SimpleExoPlayer by default. Opt-out is still possible until the next major release using setThrowsWhenUsingWrongThread(false) (#4463).
    • Add Player.getCurrentStaticMetadata and EventListener.onStaticMetadataChanged to expose static metadata belonging to the currently playing stream (#7266).
    • Add PlayerMessage.setLooper and deprecate PlayerMessage.setHandler.
    • Add option to MergingMediaSource to clip the durations of all sources to have the same length (#8422).
    • Remove Player.setVideoDecoderOutputBufferRenderer from Player API. Use setVideoSurfaceView and clearVideoSurfaceView instead.
    • Default SingleSampleMediaSource.treatLoadErrorsAsEndOfStream to true so that errors loading external subtitle files do not cause playback to fail (#8430). A warning will be logged by SingleSampleMediaPeriod whenever a load error is treated as though the end of the stream has been reached.
    • Time out on release to prevent ANRs if an underlying platform call is stuck (#4352).
    • Time out when detaching a surface to prevent ANRs if the underlying platform call is stuck (#5887).
    • Fix bug where AnalyticsListener callbacks could arrive in the wrong order (#8048).
  • Media transformation:
    • Add a new transformer module for converting media streams. The initially available transformations are changing the container format, removing tracks, and slow motion flattening.
  • Low latency live streaming:
    • Support low-latency DASH (also known as ULL-CMAF) and Apple's low-latency HLS extension.
    • Add LiveConfiguration to MediaItem to define live offset and playback speed adjustment parameters. The same parameters can be set on DefaultMediaSourceFactory to apply for all MediaItems.
    • Add LivePlaybackSpeedControl to control playback speed adjustments during live playbacks. Such adjustments allow the player to stay close to the live offset. DefaultLivePlaybackSpeedControl is provided as a default implementation.
    • Add targetLiveOffsetUs parameter to LoadControl.shouldStartPlayback.
  • Extractors:
    • Populate codecs string for H.264/AVC in MP4, Matroska and FLV streams to allow decoder capability checks based on codec profile and level (#8393).
    • Populate codecs string for H.265/HEVC in MP4, Matroska and MPEG-TS streams to allow decoder capability checks based on codec profile and level (#8393).
    • Add support for playing JPEG motion photos (#5405).
    • Handle sample size mismatches between raw audio stsd information and stsz fixed sample size in MP4 extractors.
    • Fix Vorbis private codec data parsing in the Matroska extractor (#8496).
  • Track selection:
    • Move Player.getTrackSelector to the ExoPlayer interface.
    • Move the mutable parts of TrackSelection into an ExoTrackSelection subclass.
    • Allow parallel adaptation of video and audio (#5111).
    • Simplify enabling tunneling with DefaultTrackSelector. ParametersBuilder.setTunnelingAudioSessionId has been replaced with ParametersBuilder.setTunnelingEnabled. The player's audio session ID will be used, and so a tunneling specific ID is no longer needed.
    • Add additional configuration parameters to DefaultTrackSelector. DefaultTrackSelector.ParametersBuilder now includes:
      • setPreferredVideoMimeType, setPreferredVideoMimeTypes, setPreferredAudioMimeType and setPreferredAudioMimeTypes for specifying preferred video and audio MIME type(s) (#8320).
      • setPreferredAudioLanguages and setPreferredTextLanguages for specifying multiple preferred audio and text languages.
      • setPreferredAudioRoleFlags for specifying preferred audio role flags.
    • Forward Timeline and MediaPeriodId to TrackSelection.Factory.
  • DASH:
    • Support low-latency DASH playback (availabilityTimeOffset and ServiceDescription tags) (#4904).
    • Improve logic for determining whether to refresh the manifest when a chunk load error occurs in a live streams that contains EMSG data (#8408).
  • HLS:
    • Support playlist delta updates, blocking playlist reloads and rendition reports.
    • Support low-latency HLS playback (EXT-X-PART and preload hints) (#5011).
  • UI:
    • Improve StyledPlayerControlView button animations.
    • Miscellaneous fixes for StyledPlayerControlView in minimal mode.
  • DRM:
    • Fix playback failure when switching from PlayReady protected content to Widevine or Clearkey protected content in a playlist.
    • Add ExoMediaDrm.KeyRequest.getRequestType (#7847).
    • Drop key and provision responses if DefaultDrmSession is released while waiting for the response. This prevents harmless log messages of the form: IllegalStateException: sending message to a Handler on a dead thread (#8328).
    • Allow apps to fully customize DRM behaviour for each MediaItem by passing a DrmSessionManagerProvider to MediaSourceFactory (#8466).
  • Analytics:
    • Add an onEvents callback to Player.EventListener and AnalyticsListener. When one or more player states change simultaneously, onEvents is called once after all of the callbacks associated with the individual state changes.
    • Pass a DecoderReuseEvaluation to AnalyticsListener's onVideoInputFormatChanged and onAudioInputFormatChanged methods. The DecoderReuseEvaluation indicates whether it was possible to re-use an existing decoder instance for the new format, and if not then the reasons why.
  • Video:
    • Fall back to AVC/HEVC decoders for Dolby Vision streams with level 10 to 13 (#8530).
    • Fix VP9 format capability checks on API level 23 and earlier. The platform does not correctly report the VP9 level supported by the decoder in this case, so we estimate it based on the decoder's maximum supported bitrate.
  • Audio:
    • Fix handling of audio session IDs (#8190). SimpleExoPlayer now generates an audio session ID on construction, which can be immediately queried by calling SimpleExoPlayer.getAudioSessionId. The audio session ID will only change if application code calls SimpleExoPlayer.setAudioSessionId.
    • Replace onAudioSessionId with onAudioSessionIdChanged in AudioListener and AnalyticsListener. Note that onAudioSessionIdChanged is called in fewer cases than onAudioSessionId was called, due to the improved handling of audio session IDs as described above.
    • Retry playback after some types of AudioTrack error.
    • Create E-AC3 JOC passthrough AudioTrack instances using the maximum supported channel count (instead of assuming 6 channels) from API 29.
  • Text:
    • Add support for the SSA primaryColour style attribute (#8435).
    • Fix CEA-708 sequence number discontinuity handling (#1807).
    • Fix CEA-708 handling of unexpectedly small packets (#1807).
  • Data sources:
    • For HttpDataSource implementations, default to using the user agent of the underlying network stack.
    • Deprecate HttpDataSource.Factory.getDefaultRequestProperties. HttpDataSource.Factory.setDefaultRequestProperties instead.
    • Add DefaultHttpDataSource.Factory and deprecate DefaultHttpDataSourceFactory.
  • Metadata retriever:
    • Parse Google Photos HEIC and JPEG motion photo metadata.
  • IMA extension:
    • Add support for playback of ads in playlists (#3750).
    • Add ImaAdsLoader.Builder.setEnableContinuousPlayback for setting whether to request ads for continuous playback.
    • Upgrade IMA SDK dependency to 3.22.0. This fixes leaking of the ad view group (#7344, #8339).
    • Fix a bug that could cause the next content position played after a seek to snap back to the cue point of the preceding ad, rather than the requested content position.
    • Fix a regression that caused an ad group to be skipped after an initial seek to a non-zero position. Unsupported VPAID ads will still be skipped, but only after the preload timeout rather than instantly (#8428, #7832).
    • Fix a regression that caused a short ad followed by another ad to be skipped due to playback being stuck buffering waiting for the second ad to load (#8492).
  • FFmpeg extension:
    • Link the FFmpeg library statically, saving 350KB in binary size on average.
  • OkHttp extension:
    • Add OkHttpDataSource.Factory and deprecate OkHttpDataSourceFactory.
  • Cronet extension:
    • Add CronetDataSource.Factory and deprecate CronetDataSourceFactory.
    • Support setting the user agent on CronetDataSource.Factory and CronetEngineWrapper.
  • MediaSession extension:
    • Support setPlaybackSpeed(float) and disable it by default. Use MediaSessionConnector.setEnabledPlaybackActions(long) to enable (#8229).
  • Remove deprecated symbols:
    • AdaptiveMediaSourceEventListener. Use MediaSourceEventListener instead.
    • DashMediaSource.Factory.setMinLoadableRetryCount(int). Use DashMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy) instead.
    • DefaultAnalyticsListener. Use AnalyticsListener instead.
    • DefaultLoadControl constructors. Use DefaultLoadControl.Builder instead.
    • DrmInitData.get(UUID). Use DrmInitData.get(int) and DrmInitData.SchemeData.matches(UUID) instead.
    • ExtractorsMediaSource.Factory.setMinLoadableRetryCount(int). Use ExtractorsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy) instead.
    • FixedTrackSelection.Factory. If you need to disable adaptive selection in DefaultTrackSelector, enable the DefaultTrackSelector.Parameters.forceHighestSupportedBitrate flag.
    • HlsMediaSource.Factory.setMinLoadableRetryCount(int). Use HlsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy) instead.
    • MappedTrackInfo.getTrackFormatSupport(int, int, int). Use MappedTrackInfo.getTrackSupport(int, int, int) instead.
    • MappedTrackInfo.getTrackTypeRendererSupport(int). Use MappedTrackInfo.getTypeSupport(int) instead.
    • MappedTrackInfo.getUnassociatedTrackGroups(). Use MappedTrackInfo.getUnmappedTrackGroups() instead.
    • MappedTrackInfo.length. Use MappedTrackInfo.getRendererCount() instead.
    • Player.DefaultEventListener.onTimelineChanged(Timeline, Object). Use Player.EventListener.onTimelineChanged(Timeline, int) instead.
    • Player.setAudioAttributes(AudioAttributes). Use Player.AudioComponent.setAudioAttributes(AudioAttributes, boolean) instead.
    • PlayerView.setDefaultArtwork(Bitmap). Use PlayerView.setDefaultArtwork(Drawable) instead.
    • PlayerView.setShowBuffering(boolean). Use PlayerView.setShowBuffering(int) instead.
    • SimpleExoPlayer.clearMetadataOutput(MetadataOutput). Use SimpleExoPlayer.removeMetadataOutput(MetadataOutput) instead.
    • SimpleExoPlayer.clearTextOutput(TextOutput). Use SimpleExoPlayer.removeTextOutput(TextOutput) instead.
    • SimpleExoPlayer.clearVideoListener(). Use SimpleExoPlayer.removeVideoListener(VideoListener) instead.
    • SimpleExoPlayer.getAudioStreamType(). Use SimpleExoPlayer.getAudioAttributes() instead.
    • SimpleExoPlayer.setAudioDebugListener(AudioRendererEventListener). Use SimpleExoPlayer.addAnalyticsListener(AnalyticsListener) instead.
    • SimpleExoPlayer.setAudioStreamType(int). Use SimpleExoPlayer.setAudioAttributes(AudioAttributes) instead.
    • SimpleExoPlayer.setMetadataOutput(MetadataOutput). Use SimpleExoPlayer.addMetadataOutput(MetadataOutput) instead. If your application is calling SimpleExoPlayer.setMetadataOutput(null), make sure to replace this call with a call to SimpleExoPlayer.removeMetadataOutput(MetadataOutput).
    • SimpleExoPlayer.setPlaybackParams(PlaybackParams). Use SimpleExoPlayer.setPlaybackParameters(PlaybackParameters) instead.
    • SimpleExoPlayer.setTextOutput(TextOutput). Use SimpleExoPlayer.addTextOutput(TextOutput) instead. If your application is calling SimpleExoPlayer.setTextOutput(null), make sure to replace this call with a call to SimpleExoPlayer.removeTextOutput(TextOutput).
    • SimpleExoPlayer.setVideoDebugListener(VideoRendererEventListener). Use SimpleExoPlayer.addAnalyticsListener(AnalyticsListener) instead.
    • SimpleExoPlayer.setVideoListener(VideoListener). Use SimpleExoPlayer.addVideoListener(VideoListener) instead. If your application is calling SimpleExoPlayer.setVideoListener(null), make sure to replace this call with a call to SimpleExoPlayer.removeVideoListener(VideoListener).
    • SimpleExoPlayer.VideoListener. Use com.google.android.exoplayer2.video.VideoListener instead.
    • SingleSampleMediaSource.EventListener and constructors. Use MediaSourceEventListener and SingleSampleMediaSource.Factory instead.
    • SimpleExoPlayer.addVideoDebugListener, SimpleExoPlayer.removeVideoDebugListener, SimpleExoPlayer.addAudioDebugListener and SimpleExoPlayer.removeAudioDebugListener. Use SimpleExoPlayer.addAnalyticsListener and SimpleExoPlayer.removeAnalyticsListener instead.
    • SingleSampleMediaSource.Factory.setMinLoadableRetryCount(int). Use SingleSampleMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy) instead.
    • SsMediaSource.Factory.setMinLoadableRetryCount(int). Use SsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy) instead.

r2.12.3

3 years ago
  • Core library:
    • Fix MediaCodecRenderer issue where empty streams would fail to play in bypass mode (#8374).
    • Fix playback issues after seeking during an ad (#8349).
    • Fix propagation of LoadErrorHandlingPolicy from DefaultMediaSourceFactory into SingleSampleMediaSource.Factory when creating subtitle media sources from MediaItem.playbackProperties.subtitles (#8430).
  • UI:
    • Fix issue where pop-up menus belonging to StyledPlayerControlView would not be dismissed when tapping outside of the menu area or pressing the back button, on API level 22 and earlier (#8272).
  • Downloads:
    • Fix crash in DownloadManager that could occur when adding a stopped download with the same ID as a download currently being removed (#8419).
  • Text:
    • Gracefully handle null-terminated subtitle content in Matroska containers.
    • Fix CEA-708 anchor positioning (#1807).
  • IMA extension:
    • Fix a condition where playback could get stuck before an empty ad (#8205).
    • Log a warning rather than throwing when reaching the end of the stream with an ad playing but without ad media info (#8290).
  • Media2 extension:
    • Make media2-extension depend on AndroidX media2:media2-session:1.1.0 to fix a deadlock while creating PlaybackStateCompat internally (#8011).

r2.12.2

3 years ago
  • Core library:
    • Suppress exceptions from registering/unregistering the stream volume receiver (#8087, #8106).
    • Suppress ProGuard warnings caused by Guava's compile-only dependencies (#8103).
    • Fix issue that could cause playback to freeze when selecting tracks, if extension audio renderers are being used (#8203).
  • UI:
    • Fix incorrect color and text alignment of the StyledPlayerControlView fast forward and rewind buttons, when used together with the com.google.android.material library (#7898).
    • Add dispatchPrepare(Player) to ControlDispatcher and implement it in DefaultControlDispatcher. Deprecate PlaybackPreparer and setPlaybackPreparer in StyledPlayerView, StyledPlayerControlView, PlayerView, PlayerControlView, PlayerNotificationManager and LeanbackPlayerAdapter and use ControlDispatcher for dispatching prepare instead (#7882).
    • Increase seekbar's touch target height in StyledPlayerControlView.
    • Update StyledPlayerControlView menu items to behave correctly for right-to-left languages.
    • Support enabling the previous and next actions individually in PlayerNotificationManager.
  • Audio:
    • Retry playback after some types of AudioTrack error.
    • Work around AudioManager crashes when calling getStreamVolume (#8191).
  • Extractors:
    • Matroska: Add support for 32-bit floating point PCM, and 8-bit and 16-bit big endian integer PCM (#8142).
    • MP4: Add support for mpeg1 video box (#8257).
  • IMA extension:
    • Upgrade IMA SDK dependency to 3.21.0, and release the AdsLoader (#7344).
    • Improve handling of ad tags with unsupported VPAID ads (#7832).
    • Fix a bug that caused multiple ads in an ad pod to be skipped when one ad in the ad pod was skipped.
    • Fix a bug that caused ad progress not to be updated if the player resumed after buffering during an ad (#8239).
    • Fix passing an ads response to the ImaAdsLoader builder.
    • Set the overlay language based on the device locale by default.
  • Cronet extension:
    • Fix handling of HTTP status code 200 when making unbounded length range requests (#8090).
  • Text
    • Allow tx3g subtitles with styl boxes with start and/or end offsets that lie outside the length of the cue text.
  • Media2 extension:
    • Notify onBufferingEnded when the state of origin player becomes STATE_IDLE or STATE_ENDED.
    • Allow to remove all playlist items that makes the player reset.

r2.12.1

3 years ago

r2.12.0

3 years ago

r2.11.8

3 years ago