Releases: google/ExoPlayer
Releases · google/ExoPlayer
r2.17.1
This release corresponds to the AndroidX media3 1.0.0-alpha03 release.
- Audio:
- Fix error checking audio capabilities for Dolby Atmos (E-AC3-JOC) in HLS.
- Extractors:
- FMP4: Fix issue where emsg sample metadata could be output in the wrong order for streams containing both v0 and v1 emsg atoms (#9996).
- Text:
- Fix the interaction of
SingleSampleMediaSource.Factory.setTrackId
andMediaItem.SubtitleConfiguration.Builder.setId
to prioritise theSubtitleConfiguration
field and fall back to theFactory
value if it's not set (#10016).
- Fix the interaction of
- Ad playback:
- Fix audio underruns between ad periods in live HLS SSAI streams.
r2.17.0
- Core library:
- Sleep and retry when creating a
MediaCodec
instance fails. This works around an issue that occurs on some devices when switching a surface from a secure codec to another codec (#8696). - Add
MediaCodecAdapter.getMetrics()
to allow users obtain metrics data fromMediaCodec
(#9766). - Fix Maven dependency resolution (#8353).
- Disable automatic speed adjustment for live streams that neither have low-latency features nor a user request setting the speed (#9329).
- Rename
DecoderCounters#inputBufferCount
toqueuedInputBufferCount
. - Make
SimpleExoPlayer.renderers
private. Renderers can be accessed viaExoPlayer.getRenderer
. - Updated some
AnalyticsListener.EventFlags
constant values to match values inPlayer.EventFlags
. - Split
AnalyticsCollector
into an interface and default implementation to allow it to be stripped by R8 if an app doesn't need it.
- Sleep and retry when creating a
- Track selection:
- Support preferred video role flags in track selection (#9402).
- Update video track selection logic to take preferred MIME types and role flags into account when selecting multiple video tracks for adaptation (#9519).
- Update video and audio track selection logic to only choose formats for adaptive selections that have the same level of decoder and hardware support (#9565).
- Update video track selection logic to prefer more efficient codecs if multiple codecs are supported by primary, hardware-accelerated decoders (#4835).
- Prefer audio content preferences (for example, the "default" audio track or a track matching the system locale language) over technical track selection constraints (for example, preferred MIME type, or maximum channel count).
- Prohibit duplicate
TrackGroup
s in aTrackGroupArray
.TrackGroup
s can always be made distinguishable by setting anid
in theTrackGroup
constructor. This fixes a crash when resuming playback after backgrounding the app with an active track override
(#9718). - Amend logic in
AdaptiveTrackSelection
to allow a quality increase under sufficient network bandwidth even if playback is very close to the
live edge (#9784).
- Video:
- Fix decoder fallback logic for Dolby Vision to use a compatible H264/H265 decoder if needed.
- Audio:
- Fix decoder fallback logic for Dolby Atmos (E-AC3-JOC) to use a compatible E-AC3 decoder if needed.
- Change
AudioCapabilities
APIs to require passing explicitlyAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
instead ofnull
. - Allow customization of the
AudioTrack
buffer size calculation by injecting anAudioTrackBufferSizeProvider
toDefaultAudioSink
(#8891). - Retry
AudioTrack
creation if the requested buffer size was > 1MB (#9712).
- Extractors:
- Fix incorrect parsing of H.265 SPS NAL units (#9719).
- Parse Vorbis Comments (including
METADATA_BLOCK_PICTURE
) in Ogg Opus and Ogg Vorbis files.
- Text:
- Add a
MediaItem.SubtitleConfiguration.id
field which is propagated to theFormat.id
field of the subtitle track created from the configuration (#9673). - Add basic support for WebVTT subtitles in Matroska containers (#9886).
- Prevent
Cea708Decoder
from reading more than the declared size of a service block.
- Add a
- DRM:
- Remove
playbackLooper
fromDrmSessionManager.(pre)acquireSession
. When aDrmSessionManager
is used by an app in a customMediaSource
, theplaybackLooper
needs to be passed toDrmSessionManager.setPlayer
instead.
- Remove
- Ad playback / IMA:
- Add support for IMA Dynamic Ad Insertion (DAI) (#8213).
- Add a method to
AdPlaybackState
to allow resetting an ad group so that it can be played again (#9615). - Enforce playback speed of 1.0 during ad playback (#9018).
- Fix issue where an ad group that failed to load caused an immediate playback reset (#9929).
- UI:
- DASH:
- HLS:
- Use chunkless preparation by default to improve start up time. If your renditions contain muxed closed-caption tracks that are not declared in the master playlist, you should add them to the master playlist to be available for playback, or turn off chunkless preparation with
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
. - Support key-frame accurate seeking in HLS (#2882).
- Correctly populate
Format.label
for audio only HLS streams (#9608).
- Use chunkless preparation by default to improve start up time. If your renditions contain muxed closed-caption tracks that are not declared in the master playlist, you should add them to the master playlist to be available for playback, or turn off chunkless preparation with
- RTSP:
- Transformer:
- Increase required min API version to 21.
TransformationException
is now used to describe errors that occur during a transformation.- Add
TransformationRequest
for specifying the transformation options. - Allow multiple listeners to be registered.
- Fix Transformer being stuck when the codec output is partially read.
- Fix potential NPE in
Transformer.getProgress
when releasing the muxer throws. - Add a demo app for applying transformations.
- The transformer module is no longer included by depending on
com.google.android.exoplayer:exoplayer
. To continue using transformer, add an additional dependency oncom.google.android.exoplayer:exoplayer-transformer
.
- MediaSession extension:
- By default,
MediaSessionConnector
now clears the playlist on stop. Apps that want the playlist to be retained can callsetClearMediaItemsOnStop(false)
on the connector.
- By default,
- Cast extension:
- FFmpeg extension:
- Make
build_ffmpeg.sh
depend on LLVM's bin utils instead of GNU's (#9933).
- Make
- Android 12 compatibility:
- Upgrade the Cast extension to depend on
com.google.android.gms:play-services-cast-framework:20.1.0
. Earlier versions ofplay-services-cast-framework
are not compatible with apps targeting Android 12, and will crash with anIllegalArgumentException
when creatingPendingIntent
s (#9528).
- Upgrade the Cast extension to depend on
- Remove deprecated symbols:
- Remove
Player.EventListener
. UsePlayer.Listener
instead. - Remove
MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
, andMediaSourceFactory#setDrmUserAgent
. UseMediaSourceFactory#setDrmSessionManagerProvider
instead. - Remove
MediaSourceFactory#setStreamKeys
. UseMediaItem.Builder#setStreamKeys
instead. - Remove
MediaSourceFactory#createMediaSource(Uri)
. UseMediaSourceFactory#createMediaSource(MediaItem)
instead. - Remove
setTag
fromDashMediaSource
,HlsMediaSource
andSsMediaSource
. UseMediaItem.Builder#setTag
instead. - Remove
DashMediaSource#setLivePresentationDelayMs(long, boolean)
. UseMediaItem.Builder#setLiveConfiguration
andMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
to override the manifest, orDashMediaSource#setFallbackTargetLiveOffsetMs
to provide a fallback value. - Remove
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
. Opting out of the thread enforcement is no longer possible. - Remove
ActionFile
andActionFileUpgradeUtil
. Use ExoPlayer 2.16.1 or before to useActionFileUpgradeUtil
to merge legacy action files intoDefaultDownloadIndex
. - Remove `ProgressiveMedia...
- Remove
r2.16.1
- Core Library:
- Fix track selection issue where overriding one track group did not disable other track groups of the same type (#9675).
- Fix track selection issue where a mixture of non-empty and empty track overrides is not applied correctly (#9649).
- Add protected method
DefaultRenderersFactory.getCodecAdapterFactory()
so that subclasses ofDefaultRenderersFactory
that overridebuildVideoRenderers()
orbuildAudioRenderers()
can access the codec adapter factory and pass it toMediaCodecRenderer
instances they create. - Propagate ICY header fields
name
andgenre
toMediaMetadata.station
andMediaMetadata.genre
respectively so that
they reach the app viaPlayer.Listener.onMediaMetadataChanged()
(#9677). - Remove null keys from
DefaultHttpDataSource#getResponseHeaders
.
- Extractors:
- WAV: Add support for RF64 streams (#9543).
- DASH:
- Add parsed essential and supplemental properties to the
Representation
(#9579).
- Add parsed essential and supplemental properties to the
- HLS:
- Correctly populate
Format.label
for audio only HLS streams (#9608).
- Correctly populate
r2.16.0
- Core Library:
- Deprecate
SimpleExoPlayer
. All functionality has been moved toExoPlayer
instead.ExoPlayer.Builder
can be used instead ofSimpleExoPlayer.Builder
. - Add track selection methods to the
Player
interface, for example,Player.getCurrentTracksInfo
andPlayer.setTrackSelectionParameters
. These methods can be used instead of directly accessing the track selector. - Enable MediaCodec asynchronous queueing by default on devices with API level >= 31. Add methods in
DefaultMediaCodecRendererFactory
andDefaultRenderersFactory
to force enable or force disable asynchronous queueing (6348). - Remove final dependency on
jcenter()
. - Fix
mediaMetadata
being reset when media is repeated (#9458). - Adjust
ExoPlayer
MediaMetadata
update priority, such that values input through theMediaItem.MediaMetadata
are used above media derived values. - Move
com.google.android.exoplayer2.device.DeviceInfo
tocom.google.android.exoplayer2.DeviceInfo
. - Move
com.google.android.exoplayer2.drm.DecryptionException
tocom.google.android.exoplayer2.decoder.CryptoException
. - Move
com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
tocom.google.android.exoplayer2.upstream.CachedRegionTracker
. - Move
Player.addListener(EventListener)
andPlayer.removeListener(EventListener)
out ofPlayer
into subclasses.
- Deprecate
- Android 12 compatibility:
- Keep
DownloadService
started and in the foreground whilst waiting for requirements to be met on Android 12. This is necessary due to new foreground service launch restrictions.DownloadService.getScheduler
will not be called on Android 12 devices. - Disable platform transcoding when playing content URIs on Android 12.
- Add
ExoPlayer.setVideoChangeFrameRateStrategy
to allow disabling of calls from the player toSurface.setFrameRate
. This is useful for applications wanting to callSurface.setFrameRate
directly from application code with Android 12'sSurface.CHANGE_FRAME_RATE_ALWAYS
. - Upgrade the WorkManager extension to depend on
androidx.work:work-runtime:2.7.0
. Earlier versions ofwork-runtime
are not compatible with apps targeting Android 12, and will crash with anIllegalArgumentException
when creatingPendingIntent
s (#9181).
- Keep
- Video:
- Fix bug in
MediaCodecVideoRenderer
that resulted in re-using a releasedSurface
when playing without an app-providedSurface
(#9476).
- Fix bug in
- DRM:
- Log an error (instead of throwing
IllegalStateException
) when callingDefaultDrmSession#release()
on a fully released session
(#9392).
- Log an error (instead of throwing
- UI:
- Extractors:
- MP4: Correctly handle HEVC tracks with pixel aspect ratios other than 1.
- MP4: Add support for Dolby TrueHD (only for unfragmented streams) (#9496).
- MP4: Avoid throwing
ArrayIndexOutOfBoundsException
when parsing invalidcolr
boxes produced by some device cameras (#9332). - MP4: Parse HDR static metadata from the
clli
andmdcv
boxes. - TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1.
- TS: Map stream type 0x80 to H262 (#9472).
- Downloads and caching:
- Modify
DownloadService
behavior whenDownloadService.getScheduler
returnsnull
, or returns aScheduler
that does not support the requirements for downloads to continue. In both cases,DownloadService
will now remain started and in the foreground whilst waiting for requirements to be met. - Modify
DownloadService
behavior when running on Android 12 and above. See the "Android 12 compatibility" section above.
- Modify
- RTSP:
- Support RFC4566 SDP attribute field grammar (#9430).
- DASH:
- Populate
Format.sampleMimeType
,width
andheight
for imageAdaptationSet
elements (#9500).
- Populate
- HLS:
- RTMP extension:
- Upgrade to
io.antmedia:rtmp_client
, which does not rely onjcenter()
(#9591).
- Upgrade to
- MediaSession extension:
- Rename
MediaSessionConnector.QueueNavigator#onCurrentWindowIndexChanged
toonCurrentMediaItemIndexChanged
.
- Rename
- Transformer:
- Avoid sending a duplicate timestamp to the encoder with the end of stream buffer.
- Remove deprecated symbols:
- Remove
Renderer.VIDEO_SCALING_MODE_*
constants. Use identically named constants inC
instead. - Remove
C.MSG_*
constants. Use identically named constants inRenderer
instead, except forC.MSG_SET_SURFACE
, which is replaced withRenderer.MSG_SET_VIDEO_OUTPUT
. - Remove
DeviceListener
. UsePlayer.Listener
instead. - Remove
CacheDataSourceFactory
. UseCacheDataSource.Factory
instead. - Remove
CacheDataSinkFactory
. UseCacheDataSink.Factory
instead. - Remove
FileDataSourceFactory
. UseFileDataSource.Factory
instead. - Remove
SimpleExoPlayer.addMetadataOutput
andremoveMetadataOutput
. UsePlayer.addListener
andPlayer.Listener
instead. - Remove
SimpleExoPlayer.addAudioListener
,removeAudioListener
andAudioListener
. UsePlayer.addListener
andPlayer.Listener
instead. - Remove
SimpleExoPlayer.addVideoListener
,removeVideoListener
andVideoListener
. UsePlayer.addListener
andPlayer.Listener
instead. - Remove
DefaultHttpDataSourceFactory
. UseDefaultHttpDataSource.Factory
instead. - Remove
SingleSampleMediaSource.createMediaSource(Uri, Format, long)
. UseSingleSampleMediaSource.createMediaSource(MediaItem.Subtitle, long)
instead. - Remove
HttpDataSource.Factory.getDefaultRequestProperties
. UseHttpDataSource.Factory.setDefaultRequestProperties
instead. - Remove
GvrAudioProcessor
and the GVR extension, which has been deprecated since 2.11.0. - Remove
DownloadService.onDownloadChanged
andDownloadService.onDownloadRemoved
. Instead, use
DownloadManager.addListener
to register a listener directly to theDownloadManager
returned throughDownloadService.getDownloadManager
. - Remove
Player.getCurrentStaticMetadata
,Player.Listener.onStaticMetadataChanged
and
Player.EVENT_STATIC_METADATA_CHANGED
. UsePlayer.getMediaMetadata
,Player.Listener.onMediaMetadataChanged
and
Player.EVENT_MEDIA_METADATA_CHANGED
for convenient access to structured metadata, or access the raw static metadata directly from theTrackSelection#getFormat()
. - Remove
ControlDispatcher
andDefaultControlDispatcher
. Operations can be customized by using aForwardingPlayer
, or when configuring the player (for example by usingExoPlayer.Builder.setSeekBackIncrementMs
).
- Remove
r2.15.1
- Core Library:
- Fix track selection in
StyledPlayerControlView
when usingForwardingPlayer
. - Fix
FlagSet#equals
on API levels below 24. - Fix
NullPointerException
being thrown fromCacheDataSource
when reading a fully cached resource withDataSpec.position
equal to the resource length. - Fix a bug when depending on ExoPlayer locally with a relative path (#9403).
- Better handle invalid seek requests. Seeks to positions that are before the start or after the end of the media are now handled as seeks to the start and end respectively (8906).
- Rename
MimeTypes.AUDIO_DTS_UHD
toMimeTypes.AUDIO_DTS_X
and add required profile to its value (#9429).
- Fix track selection in
- Extractors:
- Video:
- Request smaller decoder input buffers for Dolby Vision. This fixes an issue that could cause UHD Dolby Vision playbacks to fail on some devices, including Amazon Fire TV 4K.
- DRM:
- Fix
DefaultDrmSessionManager
to correctly eagerly release preacquired DRM sessions when there's a shortage of DRM resources on the device.
- Fix
- Downloads and caching:
- Workaround platform issue that can cause a
SecurityException
to be thrown fromRequirements.isInternetConnectivityValidated
on devices running Android 11 (#9002).
- Workaround platform issue that can cause a
- DASH:
- Use identical cache keys for downloading and playing DASH segments (#9370).
- Fix base URL selection and load error handling when base URLs are shared across adaptation sets.
- HLS:
- Fix bug where the player would get stuck if all download attempts fail and would not raise an error to the application (#9390).
- RTSP:
- UI:
- Cast extension:
- Implement
CastPlayer.setPlaybackParameters(PlaybackParameters)
to support setting the playback speed (#6784).
- Implement
r2.15.0
- Core Library:
- Add
MediaCodecAdapter.needsReconfiguration
method. - Add
getSeekBackIncrement
,seekBack
,getSeekForwardIncrement
,seekForward
,getMaxSeekToPreviousPosition
,seekToPrevious
andseekToNext
methods toPlayer
. - Rename
Player
methods:hasPrevious
tohasPreviousWindow
.previous
toseekToPreviousWindow
.hasNext
tohasNextWindow
.next
toseekToNextWindow
.
- Rename
Player
commands:COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM
toCOMMAND_SEEK_IN_CURRENT_WINDOW
.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM
toCOMMAND_SEEK_TO_NEXT_WINDOW
.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM
toCOMMAND_SEEK_TO_PREVIOUS_WINDOW
.COMMAND_SEEK_TO_MEDIA_ITEM
toCOMMAND_SEEK_TO_WINDOW
.COMMAND_GET_MEDIA_ITEMS
toCOMMAND_GET_TIMELINE
.
- Rename
Player.EventFlags
IntDef toPlayer.Event
. - Make
Player
depend on the newPlaybackException
class instead ofExoPlaybackException
:Player.getPlayerError
now returns aPlaybackException
.Player.Listener.onPlayerError
now receives aPlaybackException
.- Add a new listener method
Player.Listener.onPlayerErrorChanged
, which is equivalent toonPlayerError
except that it is also called when the player error becomesnull
. Player
implementations likeExoPlayer
may usePlaybackException
subclasses (likeExoPlaybackException
), so users can downcast thePlaybackException
instance to obtain implementation-specific fields (likeExoPlaybackException.rendererIndex
).
PlaybackException
introduces anerrorCode
which identifies the cause of the failure in order to simplify error handling (#1611).- Add a
DefaultMediaDescriptionAdapter
for thePlayerNotificationManager
, that makes use of thePlayer
MediaMetadata
to populate the notification fields. - Add
@FallbackType
toLoadErrorHandlingPolicy
to support customization of the exclusion duration for locations and tracks. - Change interface of
LoadErrorHandlingPolicy
to support configuring the behavior of track and location fallback. Location fallback is currently only supported for DASH manifests with multiple base URLs. - Restrict use of
AudioTrack.isDirectPlaybackSupported
to TVs, to avoid listing audio offload encodings as supported for passthrough mode on mobile devices (#9239).
- Add
- Extractors:
- Add support for DTS-UHD in MP4 (#9163).
- Text:
- TTML: Inherit the
rubyPosition
value from a containing<span ruby="container">
element. - WebVTT: Add support for CSS
font-size
property (#8964).
- TTML: Inherit the
- Ad playback:
- Support changing ad break positions in the player logic (#5067).
- Support resuming content with an offset after an ad group.
- UI:
- Add
setUseRewindAction
andsetUseFastForwardAction
toPlayerNotificationManager
, andsetUseFastForwardActionInCompactView
andsetUseRewindActionInCompactView
to show the actions in compact view mode. - Remove
rewind_increment
andfastforward_increment
attributes fromPlayerControlView
andStyledPlayerControlView
. These increments can be customized by configuring thePlayer
(seesetSeekBackIncrementMs
andsetSeekForwardIncrementMs
inSimpleExoPlayer.Builder
), or by using aForwardingPlayer
that overridesgetSeekBackIncrement
,seekBack
,getSeekForwardIncrement
andseekForward
. The rewind and fast forward buttons can be disabled by using aForwardingPlayer
that removesCOMMAND_SEEK_BACK
andCOMMAND_SEEK_FORWARD
from the available commands. - Update
DefaultControlDispatcher
getRewindIncrementMs
andgetFastForwardIncrementMs
to take the player as parameter.
- Add
- DASH:
- HLS:
- RTSP:
- SmoothStreaming:
- Propagate
StreamIndex
elementName
attribute value asFormat
label (#9252).
- Propagate
- Cronet extension:
- Add
CronetDataSource.Factory.setRequestPriority
to allow setting the priority of requests made byCronetDataSource
instances.
- Add
- OkHttp extension:
- Switch to OkHttp 4.9.1. This increases the extension's minimum SDK version requirement from 16 to 21.
- Remove deprecated symbols:
- Remove
CastPlayer
specific playlist manipulation methods. UsesetMediaItems
,addMediaItems
,removeMediaItem
andmoveMediaItem
instead. - Remove
Format.create
methods. UseFormat.Builder
instead. - Remove
MediaSource.getTag
. UseMediaSource.getMediaItem
andMediaItem.PlaybackProperties.tag
instead. - Remove
PlaybackPreparer
. UI components that previously hadsetPlaybackPreparer
methods will now callPlayer.prepare
by default. If this behavior is sufficient, use ofPlaybackPreparer
can be removed from application code without replacement. For custom preparation logic, use aForwardingPlayer
that implements custom preparation logic inprepare
. - Remove
Player.Listener.onTimelineChanged(Timeline, Object, int)
. UsePlayer.Listener.onTimelineChanged(Timeline, int)
instead. The manifest can be accessed usingPlayer.getCurrentManifest
. - Remove
Player.getCurrentTag
. UsePlayer.getCurrentMediaItem
andMediaItem.PlaybackProperties.tag
instead. - Remove
Player.getPlaybackError
. UsePlayer.getPlayerError
instead. - Remove
PlayerNotificationManager
constructors andcreateWith
methods. UsePlayerNotificationManager.Builder
instead. - Remove
PlayerNotificationManager.setNotificationListener
. UsePlayerNotificationManager.Builder.setNotificationListener
instead. - Remove
PlayerNotificationManager
setUseNavigationActions
andsetUseNavigationActionsInCompactView
. UsesetUseNextAction
,setUsePreviousAction
,setUseNextActionInCompactView
andsetUsePreviousActionInCompactView
instead. - Remove
setRewindIncrementMs
andsetFastForwardIncrementMs
from UI components. These increments can be customized by configuring thePlayer
(seesetSeekBackIncrementMs
andsetSeekForwardIncrementMs
inSimpleExoPlayer.Builder
), or by using aForwardingPlayer
that overridesgetSeekBackIncrement
,seekBack
,getSeekForwardIncrement
andseekForward
. The rewind and fast forward buttons can be disabled by using aForwardingPlayer
that removesCOMMAND_SEEK_BACK
andCOMMAND_SEEK_FORWARD
from the available commands. - Remove
Timeline.getWindow(int, Window, boolean)
. UseTimeline.getWindow(int, Window)
instead, which will always set tags.
- Remove
r2.14.2
- Core Library:
- Explicitly mark several methods on
SimpleExoPlayer
as@Deprecated
. These methods are all overrides and are already deprecated onPlayer
and the respectiveExoPlayer
component classes (since 2.14.0).
- Explicitly mark several methods on
- Video:
- Fix
IncorrectContextUseViolation
strict mode warning on Android 11 (#8246).
- Fix
- Audio:
- Fix track selection for E-AC-3 streams.
- Use
AudioTrack.isDirectPlaybackSupported
to check for encoded audio passthrough capability from API 29 onwards, instead of using the HDMI audio plug intent (#6500).
- Extractors:
- Fix issue where a
trun
atom could be associated with the wrong track in an FMP4 stream (#9056). The fix removes a previous workaround to handle content in which thetrack_ID
is set incorrectly (#4083). Such content is malformed and should be re-encoded. - Improve support for truncated Ogg streams (#7608).
- Add support for MP4 H263 atom type (#9158).
- Fix issue around TS synchronization when reading a file's duration (#9100).
- Fix issue where a
- HLS:
- Fix issue where playback of a live event could become stuck rather than transitioning to
STATE_ENDED
when the event ends (#9067). - Fix issue where a new initialization segment, as specified by an
EXT-X-MAP
tag in a media playlist, would not be loaded when encountered during playback (#9004). - Forward the FRAME-RATE value from the master playlist to renditions (#8960).
- Fix issue where HLS events would start at positions greater than specified by an
EXT-X-START
tag when placed in a playlist (#9037).
- Fix issue where playback of a live event could become stuck rather than transitioning to
- Ad playback:
- Use the content URI when auto-generating an ad ID (in addition to the media ID and ad tag URI) (#9106.
- DRM:
- Allow repeated provisioning in
DefaultDrmSession(Manager)
. - Fix a crash due to
DefaultDrmSessionManager.release()
incorrectly releasing too many keep-aliveDefaultDrmSession
references, resulting inDefaultDrmSession.release()
throwing anIllegalStateException
(#9193).
- Allow repeated provisioning in
- Metadata:
- Fix handling of emsg messages with an unset duration (#9123).
- UI:
- Add
PendingIntent.FLAG_IMMUTABLE
flag when creating a broadcast intent inPlayerNotificationManager
. This is required to avoid an error on Android 12. - Fix focusability of
StyledPlayerView
andStyledPlayerControlView
popup menus on API levels prior to 26 (#9061). - Fix progress bar flickering immediately after the user seeks (#9049).
- Fix
StyledPlayerView
andStyledPlayerControlView
popup menu items not expanding to occupy the full width of the popup (#9086). - Don't propagate
AttributeSet
fromSubtitleView
constructor intoCanvasSubtitleOutput
. Just passing theContext
is enough, and ensures programmatic changes to theSubtitleView
will propagate down.
- Add
- RTSP:
r2.14.1
- Core Library:
- Fix gradle config to allow specifying a relative path for
exoplayerRoot
when depending on ExoPlayer locally
(#8927). - Update
MediaItem.Builder
javadoc to discourage calling setters that will be (currently) ignored if another setter is not also called.
- Fix gradle config to allow specifying a relative path for
- Extractors:
- Add support for MPEG-H 3D Audio in MP4 extractors (#8860).
- Video:
- Fix bug that could cause
CodecException: Error 0xffffffff
to be thrown fromMediaCodec.native_setSurface
in use cases that involve both swapping the outputSurface
and a mixture of secure and non-secure content being played (#8776).
- Fix bug that could cause
- HLS:
- Use the
PRECISE
attribute inEXT-X-START
to select the default start position. - Fix a bug where skipping into spliced-in chunks triggered an assertion error (#8937).
- Use the
- DRM:
- Keep secure
MediaCodec
instances initialized when disabling (but not resetting)MediaCodecRenderer
. This helps re-use secure decoders in more contexts, which avoids the 'black flash' caused by detaching aSurface
from a secure decoder on some devices (#8842). It will also result in DRM license refresh network requests while the player is stopped ifPlayer#setForegroundMode
is true. - Fix issue where offline keys were unnecessarily (and incorrectly) restored into a session before being released. This call sequence is explicitly disallowed in OEMCrypto v16.
- Keep secure
- UI:
- Keep subtitle language features embedded (e.g. rubies & tate-chu-yoko) in
Cue.text
even whenSubtitleView#setApplyEmbeddedStyles()
isfalse
. - Fix
NullPointerException
inStyledPlayerView
that could occur after callingStyledPlayerView.setPlayer(null)
(#8985).
- Keep subtitle language features embedded (e.g. rubies & tate-chu-yoko) in
- RTSP:
- GL demo app:
- Fix texture transformation to avoid green bars shown on some videos (#8992).
r2.14.0
- Core Library:
- Move
Player
components toExoPlayer
. For examplePlayer.VideoComponent
is nowExoPlayer.VideoComponent
. - The most used methods of
Player
's audio, video, text and metadata components have been added directly toPlayer
. - Add
Player.getAvailableCommands
,Player.isCommandAvailable
andListener.onAvailableCommandsChanged
to query which commands that can be executed on the player. - Add a
Player.Listener
interface to receive all player events. Component listeners andEventListener
have been deprecated. - Add
Player.getMediaMetadata
, which returns a combined and structuredMediaMetadata
object. Changes to metadata are reported toListener.onMediaMetadataChanged
. Player.setPlaybackParameters
no longer accepts null, usePlaybackParameters.DEFAULT
instead.- Report information about the old and the new playback positions to
Listener.onPositionDiscontinuity
. AddDISCONTINUITY_REASON_SKIP
andDISCONTINUITY_REASON_REMOVE
as discontinuity reasons, and renameDISCONTINUITY_REASON_PERIOD_TRANSITION
toDISCONTINUITY_REASON_AUTO_TRANSITION
. RemoveDISCONTINUITY_REASON_AD_INSERTION
, for whichDISCONTINUITY_REASON_AUTO_TRANSITION
is used instead (#6163, #4768). - Deprecate
ExoPlayer.Builder
. UseSimpleExoPlayer.Builder
instead. - Move
Player.getRendererCount
andPlayer.getRendererType
toExoPlayer
. - Use an empty string instead of the URI if the media ID is not explicitly set with
MediaItem.Builder.setMediaId(String)
. - Remove
MediaCodecRenderer.configureCodec()
and addMediaCodecRenderer.getMediaCodecConfiguration()
. The new method is called just before theMediaCodec
is created and returns the parameters needed to create and configure theMediaCodec
instance. Applications can overrideMediaCodecRenderer.onCodecInitialized()
to be notified after aMediaCodec
is initialized, or they can inject a customMediaCodecAdapter.Factory
if they want to control how theMediaCodec
is configured. - Promote
AdaptiveTrackSelection.AdaptationCheckpoint
topublic
visibility to allow Kotlin subclasses ofAdaptiveTrackSelection.Factory
(#8830). - Fix bug when transitions from content to ad periods called
onMediaItemTransition
by mistake. AdsLoader.AdViewProvider
andAdsLoader.OverlayInfo
have been renamedcom.google.android.exoplayer2.ui.AdViewProvider
andcom.google.android.exoplayer2.ui.AdOverlayInfo
respectively.CaptionStyleCompat
has been moved to thecom.google.android.exoplayer2.ui
package.DebugTextViewHelper
has been moved from theui
package to theutil
package.
- Move
- RTSP:
- Initial support for RTSP playbacks (#55).
- Downloads and caching:
- Fix
CacheWriter
to correctly handle cases where the requestDataSpec
extends beyond the end of the underlying resource. Caching will now succeed in this case, with data up to the end of the resource being cached. This behaviour is enabled by default, and so theallowShortContent
parameter has been removed (#7326). - Fix
CacheWriter
to correctly handleDataSource.close
failures, for which it cannot be assumed that data was successfully written to the cache.
- Fix
- DRM:
- Prepare DRM sessions (and fetch keys) ahead of the playback position (#4133).
- Only dispatch DRM session acquire and release events once per period when playing content that uses the same encryption keys for both audio & video tracks. Previously, separate acquire and release events were dispatched for each track in each period.
- Include the session state in DRM session-acquired listener methods.
- UI:
- Add
PlayerNotificationManager.Builder
, with the ability to specify which group the notification should belong to. - Remove
setUseSensorRotation
fromPlayerView
andStyledPlayerView
. Instead, cast the view returned bygetVideoSurfaceView
toSphericalGLSurfaceView
, and then callsetUseSensorRotation
on theSphericalGLSurfaceView
directly.
- Add
- Analytics:
- Add
onAudioCodecError
andonVideoCodecError
toAnalyticsListener
.
- Add
- Video:
- Add
Player.getVideoSize()
to retrieve the current size of the video stream. AddListener.onVideoSizeChanged(VideoSize)
and deprecateListener.onVideoSizeChanged(int, int, int, float)
.
- Add
- Audio:
- Report unexpected audio discontinuities to
AnalyticsListener.onAudioSinkError
(#6384). - Allow forcing offload for gapless content even if gapless playback is not supported.
- Allow fall back from DTS-HD to DTS when playing via passthrough.
- Report unexpected audio discontinuities to
- Text:
- Fix overlapping lines when using
SubtitleView.VIEW_TYPE_WEB
. - Parse SSA/ASS underline & strikethrough info in
Style:
lines (#8435). - Ensure TTML
tts:textAlign
is correctly propagated from<p>
nodes to child nodes. - Support TTML
ebutts:multiRowAlign
attributes.
- Fix overlapping lines when using
- Allow the use of Android platform extractors through MediaParser:
- Supported on API 30+:
- You can use platform extractors for progressive media by passing
MediaParserExtractorAdapter.FACTORY
when creating aProgressiveMediaSource.Factory
. - You can use platform extractors for HLS by passing
MediaParserHlsMediaChunkExtractor.FACTORY
when creating aHlsMediaSource.Factory
. - You can use platform extractors for DASH by passing a
DefaultDashChunkSource
that usesMediaParserChunkExtractor.FACTORY
when creating aDashMediaSource.Factory
.
- Cast extension:
- Trigger
onMediaItemTransition
event for all reasons exceptMEDIA_ITEM_TRANSITION_REASON_REPEAT
.
- Trigger
- MediaSession extension:
- Remove dependency on
exoplayer-core
, relying onlyexoplayer-common
instead. To achieve this,TimelineQueueEditor
uses a newMediaDescriptionConverter
interface, and no longer relies onConcatenatingMediaSource
.
- Remove dependency on
- Remove deprecated symbols:
- Remove
ExoPlayerFactory
. UseSimpleExoPlayer.Builder
instead. - Remove
Player.DefaultEventListener
. UsePlayer.Listener
instead. - Remove
ExtractorMediaSource
. UseProgressiveMediaSource
instead. - Remove
DefaultMediaSourceEventListener
. UseMediaSourceEventListener
instead. - Remove
DashManifest
constructor. Use the remaining constructor withprogramInformation
andserviceDescription
set tonull
instead. - Remove
CryptoInfo.getFrameworkCryptoInfoV16
. UseCryptoInfo.getFrameworkCryptoInfo
instead. - Remove
NotificationUtil.createNotificationChannel(Context, String, int, int)
. UsecreateNotificationChannel(Context, String, int, int, int)
instead. - Remove
PlayerNotificationManager.setNotificationListener
. UsePlayerNotificationManager.Builder.setNotificationListener
instead. - Remove
PlayerNotificationManager.NotificationListener
onNotificationStarted(int, Notification)
andonNotificationCancelled(int)
. UseonNotificationPosted(int, Notification, boolean)
andonNotificationCancelled(int, boolean)
instead. - Remove
DownloadNotificationUtil
. UseDownloadNotificationHelper
instead. - Remove
extension-jobdispatcher
module. Use theextension-workmanager
module instead.
- Remove
r2.13.3
- Published via the Google Maven repository (i.e., google()) rather than JCenter.
- Core:
- UI:
- DASH:
- Parse
forced_subtitle
role from DASH manifests (#8781).
- Parse
- HLS:
- Fix bug of ignoring
EXT-X-START
when setting the live target offset (#8764). - Fix incorrect application of byte ranges to
EXT-X-MAP
tags (#8783). - Fix issue that could cause playback to become stuck if corresponding
EXT-X-DISCONTINUITY
tags in different media playlists occur at different positions in time (#8372). - Fix issue that could cause playback of on-demand content to not start in cases where the media playlists referenced by the master playlist have different starting
EXT-X-PROGRAM-DATE-TIME
tags. - Fix container type detection for segments with incorrect file extension or HTTP Content-Type (#8733).
- Fix bug of ignoring
- Extractors:
- Add support for
GContainer
andGContainerItem
XMP namespace prefixes in JPEG motion photo parsing. - Allow JFIF APP0 marker segment preceding Exif APP1 segment in
JpegExtractor
.
- Add support for
- Text:
- Parse SSA/ASS bold & italic info in
Style:
lines (#8435). - Don't display subtitles after the end position of the current media period (if known). This ensures sideloaded subtitles respect the end point of
ClippingMediaPeriod
and prevents content subtitles from continuing to be displayed over mid-roll ads (#5317, #8456). - Fix CEA-708 priority handling to sort cues in the order defined by the spec (#8704).
- Support TTML
textEmphasis
attributes, used for Japanese boutens. - Support TTML
shear
attributes.
- Parse SSA/ASS bold & italic info in
- Metadata:
- Ensure that timed metadata near the end of a period is not dropped (#8710).
- Cast extension:
- Fix
onPositionDiscontinuity
event so that it is not triggered with reasonDISCONTINUITY_REASON_PERIOD_TRANSITION
after a seek to another media item and so that it is not triggered after a timeline change.
- Fix
- IMA extension:
- FFmpeg extension: Fix playback failure when switching to TrueHD tracks during playback (#8616).