Skip to content

Latest commit

 

History

History
5086 lines (4857 loc) · 276 KB

RELEASENOTES.md

File metadata and controls

5086 lines (4857 loc) · 276 KB

Release notes

2.19.1 (2023-08-14)

This is the last planned release of the com.google.android.exoplayer2 artifacts. This project is now deprecated. All users should migrate to androidx.media3 (which contains the same ExoPlayer code). See the migration guide for more details, including a script to help with the migration.

This release corresponds to the AndroidX Media3 1.1.1 release.

  • Common Library:
    • Remove accidentally added multidex dependency from all modules (#499).
  • ExoPlayer:
    • Fix issue in PlaybackStatsListener where spurious PlaybackStats are created after the playlist is cleared.
    • Add additional fields to Common Media Client Data (CMCD) logging: streaming format (sf), stream type (st), version (v), top birate (tb), object duration (d), measured throughput (mtp) and object type (ot) (#8699).
  • Audio:
    • Fix a bug where Player.getState() never transitioned to STATE_ENDED when playing very short files (#538).
  • Audio Offload:
    • Prepend Ogg ID Header and Comment Header Pages to bitstream for offloaded Opus playback in accordance with RFC 7845.
  • Video:
    • H.265/HEVC: Fix parsing SPS short and long term reference picture info.
  • Text:
    • CEA-608: Change cue truncation logic to only consider visible text. Previously indent and tab offset were included when limiting the cue length to 32 characters (which was technically correct by the spec) (#11019).
  • IMA extension:
    • Bump IMA SDK version to 3.30.3.

2.19.0 (2023-07-05)

This release corresponds to the AndroidX Media3 1.1.0 release.

  • Common Library:
    • Add suppression reason for unsuitable audio route and play when ready change reason for suppressed too long. (#15).
    • Add commands to Player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Add overloaded methods to Player which allow users to specify volume flags:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Add Builder for DeviceInfo and deprecate existing constructor.
    • Add DeviceInfo.routingControllerId to specify the routing controller ID for remote playbacks.
    • Add Player.replaceMediaItem(s) as a shortcut to adding and removing items at the same position (#8046).
  • ExoPlayer:
    • Allow ExoPlayer to have control of device volume methods only if explicitly opted in. Use ExoPlayer.Builder.setDeviceVolumeControlEnabled to have access to:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) and setDeviceVolume(int, int)
      • increaseDeviceVolume(int) and increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) and decreaseDeviceVolume(int, int)
    • Add FilteringMediaSource that allows to filter available track types from a MediaSource.
    • Add support for including Common Media Client Data (CMCD) in the outgoing requests of adaptive streaming formats DASH, HLS, and SmoothStreaming. The following fields, br, bl, cid, rtp, and sid, have been incorporated (#8699). API structure and API methods:
      • CMCD logging is disabled by default, use MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) to enable it.
      • All keys are enabled by default, override CmcdConfiguration.RequestConfig.isKeyAllowed(String key) to filter out which keys are logged.
      • Override CmcdConfiguration.RequestConfig.getCustomData() to enable custom key logging.
    • Add additional action to manifest of main demo to make it easier to start the demo app with a custom *.exolist.json file (#439).
    • Add ExoPlayer.setVideoEffects() for using Effect during video playback.
    • Update SampleQueue to store sourceId as a long rather than an int. This changes the signatures of public methods SampleQueue.sourceId and SampleQueue.peekSourceId.
    • Add parameters to LoadControl methods shouldStartPlayback and onTracksSelected that allow associating these methods with the relevant MediaPeriod.
    • Change signature of ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) by adding a timeline parameter that contains the periods with the UIDs used as keys in the map. This is required to avoid concurrency issues with multi-period live streams.
    • Deprecate EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) and BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). The variant of the methods without the mediaTimeOffsetUs can be called instead. Note that even for the deprecated variants, the offset is not anymore added to startTimeUs and endTimeUs of the MediaLoadData objects that are dispatched by the dispatcher.
    • Rename ExoTrackSelection.blacklist to excludeTrack and isBlacklisted to isTrackExcluded.
    • Fix inconsistent behavior between ExoPlayer.setMediaItem(s) and addMediaItem(s) when called on an empty playlist.
  • Transformer:
    • Remove Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Use ExoPlayerAssetLoader.Factory(MediaSource.Factory) and Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) instead.
    • Remove Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Fix a bug where transformation could get stuck (leading to muxer timeout) if the end of the video stream was signaled at the moment when an input frame was pending processing.
    • Query codecs via MediaCodecList instead of using findDecoder/EncoderForFormat utilities, to expand support.
    • Remove B-frame configuration in DefaultEncoderFactory because it doesn't work on some devices.
  • Track selection:
    • Add DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange which is disabled by default. When enabled, the DefaultTrackSelector will trigger a new track selection when the renderer capabilities changed.
  • Extractors:
    • Ogg: Fix bug when seeking in files with a long duration (#391).
    • FMP4: Fix issue where TimestampAdjuster initializes a wrong timestamp offset with metadata sample time from emsg atom (#356).
  • Audio:
    • Fix bug where some playbacks fail when tunneling is enabled and AudioProcessors are active, e.g. for gapless trimming (#10847).
    • Encapsulate Opus frames in Ogg packets in direct playbacks (offload).
    • Extrapolate current position during sleep with offload scheduling.
    • Add Renderer.release() and AudioSink.release() for releasing the resources at the end of player's lifecycle.
    • Listen to audio capabilities changes in DefaultAudioSink. Add a required parameter context in the constructor of DefaultAudioSink, with which the DefaultAudioSink will register as the listener to the AudioCapabilitiesReceiver and update its audioCapabilities property when informed with a capabilities change.
    • Propagate audio capabilities changes via a new event onAudioCapabilitiesChanged in AudioSink.Listener interface, and a new interface RendererCapabilities.Listener which triggers onRendererCapabilitiesChanged events.
    • Add ChannelMixingAudioProcessor for applying scaling/mixing to audio channels.
    • Add new int value DISCARD_REASON_AUDIO_BYPASS_POSSIBLE to DecoderDiscardReasons to discard audio decoder when bypass mode is possible after audio capabilities change.
    • Add direct playback support for DTS Express and DTS:X (#335).
  • Video:
    • Make MediaCodecVideoRenderer report a VideoSize with a width and height of 0 when the renderer is disabled. Player.Listener.onVideoSizeChanged is called accordingly when Player.getVideoSize() changes. With this change, ExoPlayer's video size with MediaCodecVideoRenderer has a width and height of 0 when Player.getCurrentTracks does not support video, or the size of the supported video track is not yet determined.
  • DRM:
    • Reduce the visibility of several internal-only methods on DefaultDrmSession that aren't expected to be called from outside the DRM package:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Add a new muxer library which can be used to create an MP4 container file.
  • IMA extension:
    • Enable multi-period live DASH streams for DAI. Please note that the current implementation does not yet support seeking in live streams (#10912).
    • Fix a bug where a new ad group is inserted in live streams because the calculated content position in consecutive timelines varies slightly.
  • UI:
    • Add Util methods shouldShowPlayButton and handlePlayPauseButtonAction to write custom UI elements with a play/pause button.
  • RTSP Extension:
    • For MPEG4-LATM, use default profile-level-id value if absent in Describe Response SDP message (#302).
    • Use base Uri for relative path resolution from the RTSP session if present in DESCRIBE response header (#11160).
  • DASH Extension:
    • Remove the media time offset from MediaLoadData.startTimeMs and MediaLoadData.endTimeMs for multi period DASH streams.
    • Fix a bug where re-preparing a multi-period live Dash media source produced a IndexOutOfBoundsException (#10838).
  • HLS Extension:
    • Add HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) to set a timeout for the loading thread to wait for the TimestampAdjuster to initialize. If the initialization doesn't complete before the timeout, a PlaybackException is thrown to avoid the playback endless stalling. The timeout is set to zero by default (#323).
  • Test Utilities:
    • Check for URI scheme case insensitivity in DataSourceContractTest.
  • Remove deprecated symbols:
    • Remove DefaultAudioSink constructors, use DefaultAudioSink.Builder instead.
    • Remove HlsMasterPlaylist, use HlsMultivariantPlaylist instead.
    • Remove Player.stop(boolean). Use Player.stop() and Player.clearMediaItems() (if reset is true) instead.
    • Remove two deprecated SimpleCache constructors, use a non-deprecated constructor that takes a DatabaseProvider instead for better performance.
    • Remove DefaultBandwidthMeter constructor, use DefaultBandwidthMeter.Builder instead.
    • Remove DefaultDrmSessionManager constructors, use DefaultDrmSessionManager.Builder instead.
    • Remove two deprecated HttpDataSource.InvalidResponseCodeException constructors, use a non-deprecated constructor that accepts additional fields(cause, responseBody) to enhance error logging.
    • Remove DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash, and DownloadHelper.forSmoothStreaming, use DownloadHelper.forMediaItem instead.
    • Remove deprecated DownloadService constructor, use a non deprecated constructor that includes the option to provide a channelDescriptionResourceId parameter.
    • Remove deprecated String constants for Charsets (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME and UTF16LE_NAME), use Kotlin Charsets from the kotlin.text package, the java.nio.charset.StandardCharsets or the com.google.common.base.Charsets instead.
    • Remove deprecated WorkManagerScheduler constructor, use a non deprecated constructor that includes the option to provide a Context parameter instead.
    • Remove the deprecated methods createVideoSampleFormat, createAudioSampleFormat, createContainerFormat, and createSampleFormat, which were used to instantiate the Format class. Instead use Format.Builder for creating instances of Format.
    • Remove the deprecated methods copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate and copyWithVideoSize, use Format.buildUpon() and setter methods instead.
    • Remove deprecated ExoPlayer.retry(), use prepare() instead.
    • Remove deprecated zero-arg DefaultTrackSelector constructor, use DefaultTrackSelector(Context) instead.
    • Remove deprecated OfflineLicenseHelper constructor, use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) instead.
    • Remove deprecated DownloadManager constructor, use the constructor that takes an Executor instead.
    • Remove deprecated Cue constructors, use Cue.Builder instead.
    • Remove deprecated OfflineLicenseHelper constructor, use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) instead.
    • Remove four deprecated AnalyticsListener methods:
      • onDecoderEnabled, use onAudioEnabled and/or onVideoEnabled instead.
      • onDecoderInitialized, use onAudioDecoderInitialized and/or onVideoDecoderInitialized instead.
      • onDecoderInputFormatChanged, use onAudioInputFormatChanged and/or onVideoInputFormatChanged instead.
      • onDecoderDisabled, use onAudioDisabled and/or onVideoDisabled instead.
    • Remove the deprecated Player.Listener.onSeekProcessed and AnalyticsListener.onSeekProcessed, use onPositionDiscontinuity with DISCONTINUITY_REASON_SEEK instead.
    • Remove ExoPlayer.setHandleWakeLock(boolean), use setWakeMode(int) instead.
    • Remove deprecated DefaultLoadControl.Builder.createDefaultLoadControl(), use build() instead.
    • Remove deprecated MediaItem.PlaybackProperties, use MediaItem.LocalConfiguration instead. Deprecated field MediaItem.playbackProperties is now of type MediaItem.LocalConfiguration.

2.18.7 (2023-05-18)

This release corresponds to the AndroidX Media3 1.0.2 release.

  • Core library:
    • Add Buffer.isLastSample() that denotes if Buffer contains flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Fix issue where last frame may not be rendered if the last sample with frames is dequeued without reading the 'end of stream' sample. (#11079).
  • Extractors:
    • Fix parsing of H.265 SPS in MPEG-TS files by re-using the parsing logic already used by RTSP and MP4 extractors (#303).
  • Text:
    • SSA: Add support for UTF-16 files if they start with a byte order mark (#319).

2.18.6 (2023-04-18)

This release corresponds to the AndroidX Media3 1.0.1 release.

  • Core library:
    • Reset target live stream override when seeking to default position (#11051).
    • Fix bug where empty sample streams in the media could cause playback to be stuck.
  • DASH:
    • Fix handling of empty segment timelines (#11014).
  • RTSP:
    • Retry with TCP if RTSP Setup with UDP fails with RTSP Error 461 UnsupportedTransport (#11069).

2.18.5 (2023-03-22)

This release corresponds to the AndroidX Media3 1.0.0 release.

  • Migration script
    • Fix bug where backup files for each touched file were left in a migrated project on OSX.

2.18.4 (2023-03-02)

This release corresponds to the AndroidX Media3 1.0.0-rc02 release.

  • Core library:
    • Fix network type detection on API 33 (#10970).
    • Fix NullPointerException when calling ExoPlayer.isTunnelingEnabled (#10977).
  • Downloads:
    • Make the maximum difference of the start time of two segments to be merged configurable in SegmentDownloader and subclasses (#248).
  • Audio:
    • Fix broken gapless MP3 playback on Samsung devices (#8594).
    • Fix bug where playback speeds set immediately after disabling audio may be overridden by a previous speed change (#10882).
  • Video:
    • Map HEVC HDR10 format to HEVCProfileMain10HDR10 instead of HEVCProfileMain10.
    • Add workaround for a device issue on Chromecast with Google TV and Lenovo M10 FHD Plus that causes 60fps AVC streams to be marked as unsupported (#10898).
    • Fix frame release performance issues when playing media with a frame rate far higher than the screen refresh rate.
  • Cast:
    • Fix transient STATE_IDLE when transitioning between media items (#245).
  • RTSP:
    • Catch the IllegalArgumentException thrown in parsing of invalid RTSP Describe response messages (#10971).
  • IMA extension:
    • Fix a bug which prevented DAI streams without any ads from starting because the first (and in the case without ads the only) LOADED event wasn't received.

2.18.3 (2023-02-16)

This release corresponds to the AndroidX Media3 1.0.0-rc01 release.

  • Core library:
    • Tweak the renderer's decoder ordering logic to uphold the MediaCodecSelector's preferences, even if a decoder reports it may not be able to play the media performantly. For example with default selector, hardware decoder with only functional support will be preferred over software decoder that fully supports the format (#10604).
    • Add ExoPlayer.Builder.setPlaybackLooper that sets a pre-existing playback thread for a new ExoPlayer instance.
    • Allow download manager helpers to be cleared (#10776).
    • Add parameter to BasePlayer.seekTo to also indicate the command used for seeking.
    • Use theme when loading drawables on API 21+ (#220).
    • Add ConcatenatingMediaSource2 that allows combining multiple media items into a single window (#247).
  • Extractors:
    • Throw a ParserException instead of a NullPointerException if the sample table (stbl) is missing a required sample description (stsd) when parsing trak atoms.
    • Correctly skip samples when seeking directly to a sync frame in fMP4 (#10941).
  • Audio:
    • Use the compressed audio format bitrate to calculate the min buffer size for AudioTrack in direct playbacks (passthrough).
  • Text:
    • Fix TextRenderer passing an invalid (negative) index to Subtitle.getEventTime if a subtitle file contains no cues.
    • SubRip: Add support for UTF-16 files if they start with a byte order mark.
  • Metadata:
    • Parse multiple null-separated values from ID3 frames, as permitted by ID3 v2.4.
    • Add MediaMetadata.mediaType to denote the type of content or the type of folder described by the metadata.
    • Add MediaMetadata.isBrowsable as a replacement for MediaMetadata.folderType. The folder type will be deprecated in the next release.
  • DASH:
    • Add full parsing for image adaptation sets, including tile counts (#3752).
  • UI:
    • Fix the deprecated StyledPlayerView.setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener) to ensure visibility changes are passed to the registered listener (#229).
    • Fix the ordering of the center player controls in StyledPlayerView when using a right-to-left (RTL) layout (#227).
  • Cast extension:
    • Bump Cast SDK version to 21.2.0.
  • IMA extension:
    • Remove player listener of the ImaServerSideAdInsertionMediaSource on the application thread to avoid threading issues.
    • Add a property focusSkipButtonWhenAvailable to the ImaServerSideAdInsertionMediaSource.AdsLoader.Builder to request focusing the skip button on TV devices and set it to true by default.
    • Add a method focusSkipButton() to the ImaServerSideAdInsertionMediaSource.AdsLoader to programmatically request to focus the skip button.
    • Fix a bug which prevented playback from starting for a DAI stream without any ads.
    • Bump IMA SDK version to 3.29.0.
  • Demo app:
    • Request notification permission for download notifications at runtime (#10884).

2.18.2 (2022-11-22)

This release corresponds to the AndroidX Media3 1.0.0-beta03 release.

  • Core library:
    • Add ExoPlayer.isTunnelingEnabled to check if tunneling is enabled for the currently selected tracks (#2518).
    • Add WrappingMediaSource to simplify wrapping a single MediaSource (#7279).
    • Discard back buffer before playback gets stuck due to insufficient available memory.
    • Close the Tracing "doSomeWork" block when offload is enabled.
    • Fix session tracking problem with fast seeks in PlaybackStatsListener (#180).
    • Send missing onMediaItemTransition callback when calling seekToNext or seekToPrevious in a single-item playlist (#10667).
    • Add Player.getSurfaceSize that returns the size of the surface on which the video is rendered.
    • Fix bug where removing listeners during the player release can cause an IllegalStateException (#10758).
  • Build:
    • Enforce minimum compileSdkVersion to avoid compilation errors (#10684).
  • Track selection:
    • Prefer other tracks to Dolby Vision if display does not support it. (#8944).
  • Downloads:
    • Fix potential infinite loop in ProgressiveDownloader caused by simultaneous download and playback with the same PriorityTaskManager (#10570).
    • Make download notification appear immediately (#183).
    • Limit parallel download removals to 1 to avoid excessive thread creation (#10458).
  • Video:
    • Try alternative decoder for Dolby Vision if display does not support it. (#9794).
  • Audio:
    • Use SingleThreadExecutor for releasing AudioTrack instances to avoid OutOfMemory errors when releasing multiple players at the same time (#10057).
    • Adds AudioOffloadListener.onExperimentalOffloadedPlayback for the AudioTrack offload state. (#134).
    • Make AudioTrackBufferSizeProvider a public interface.
    • Add ExoPlayer.setPreferredAudioDevice to set the preferred audio output device (#135).
    • Map 8-channel and 12-channel audio to the 7.1 and 7.1.4 channel masks respectively on all Android versions (#10701).
  • Metadata:
    • MetadataRenderer can now be configured to render metadata as soon as they are available. Create an instance with MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) to specify whether the renderer will output metadata early or in sync with the player position.
  • DRM:
    • Work around a bug in the Android 13 ClearKey implementation that returns a non-empty but invalid license URL.
    • Fix setMediaDrmSession failed: session not opened error when switching between DRM schemes in a playlist (e.g. Widevine to ClearKey).
  • Text:
    • CEA-608: Ensure service switch commands on field 2 are handled correctly (#10666).
  • DASH:
    • Parse EventStream.presentationTimeOffset from manifests (#10460).
  • UI:
    • Use current overrides of the player as preset in TrackSelectionDialogBuilder (#10429).
  • RTSP:
    • Add H263 fragmented packet handling (#119).
    • Add support for MP4A-LATM (#162).
  • IMA:
    • Add timeout for loading ad information to handle cases where the IMA SDK gets stuck loading an ad (#10510).
    • Prevent skipping mid-roll ads when seeking to the end of the content (#10685).
    • Correctly calculate window duration for live streams with server-side inserted ads, for example IMA DAI (#10764).
  • FFmpeg extension:
    • Add newly required flags to link FFmpeg libraries with NDK 23.1.7779620 and above (#9933).
  • AV1 extension:
    • Update CMake version to avoid incompatibilities with the latest Android Studio releases (#9933).
  • Cast extension:
    • Implement getDeviceInfo() to be able to identify CastPlayer when controlling playback with a MediaController (#142).
  • Transformer:
    • Add muxer watchdog timer to detect when generating an output sample is too slow.
  • Remove deprecated symbols:
    • Remove Transformer.Builder.setOutputMimeType(String). This feature has been removed. The MIME type will always be MP4 when the default muxer is used.

2.18.1 (2022-07-21)

This release corresponds to the AndroidX media3 1.0.0-beta02 release.

  • Core library:
    • Ensure that changing the ShuffleOrder with ExoPlayer.setShuffleOrder results in a call to Player.Listener#onTimelineChanged with reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • For progressive media, only include selected tracks in buffered position (#10361).
    • Allow custom logger for all ExoPlayer log output (#9752).
    • Fix implementation of setDataSourceFactory in DefaultMediaSourceFactory, which was non-functional in some cases (#116).
  • Extractors:
    • Fix parsing of H265 short term reference picture sets (#10316).
    • Fix parsing of bitrates from esds boxes (#10381).
  • DASH:
    • Parse ClearKey license URL from manifests (#10246).
  • UI:
    • Ensure TalkBack announces the currently active speed option in the playback controls menu (#10298).
  • RTSP:
    • Add VP8 fragmented packet handling (#110).
  • Leanback extension:
    • Listen to playWhenReady changes in LeanbackAdapter (10420).
  • Cast:
    • Use the MediaItem that has been passed to the playlist methods as Window.mediaItem in CastTimeline (#25, #8212).
    • Support Player.getMetadata() and Listener.onMediaMetadataChanged() with CastPlayer (#25).

2.18.0 (2022-06-16)

This release corresponds to the AndroidX media3 1.0.0-beta01 release.

  • Core library:
    • Enable support for Android platform diagnostics via MediaMetricsManager. ExoPlayer will forward playback events and performance data to the platform, which helps to provide system performance and debugging information on the device. This data may also be collected by Google if sharing usage and diagnostics data is enabled by the user of the device. Apps can opt-out of contributing to platform diagnostics for ExoPlayer with ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Fix bug that tracks are reset too often when using MergingMediaSource, for example when side-loading subtitles and changing the selected subtitle mid-playback (#10248).
    • Stop detecting 5G-NSA network type on API 29 and 30. These playbacks will assume a 4G network.
    • Disallow passing null to MediaSource.Factory.setDrmSessionManagerProvider and MediaSource.Factory.setLoadErrorHandlingPolicy. Instances of DefaultDrmSessionManagerProvider and DefaultLoadErrorHandlingPolicy can be passed explicitly if required.
    • Add MediaItem.RequestMetadata to represent metadata needed to play media when the exact LocalConfiguration is not known. Also remove MediaMetadata.mediaUrl as this is now included in RequestMetadata.
    • Add Player.Command.COMMAND_SET_MEDIA_ITEM to enable players to allow setting a single item.
  • Track selection:
    • Flatten TrackSelectionOverrides class into TrackSelectionParameters, and promote TrackSelectionOverride to a top level class.
    • Rename TracksInfo to Tracks and TracksInfo.TrackGroupInfo to Tracks.Group. Player.getCurrentTracksInfo and Player.Listener.onTracksInfoChanged have also been renamed to Player.getCurrentTracks and Player.Listener.onTracksChanged. This includes 'un-deprecating' the Player.Listener.onTracksChanged method name, but with different parameter types.
    • Change DefaultTrackSelector.buildUponParameters and DefaultTrackSelector.Parameters.buildUpon to return DefaultTrackSelector.Parameters.Builder instead of the deprecated DefaultTrackSelector.ParametersBuilder.
    • Add DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities which is enabled by default. When enabled, the DefaultTrackSelector will prefer audio tracks whose channel count does not exceed the device output capabilities. On handheld devices, the DefaultTrackSelector will prefer stereo/mono over multichannel audio formats, unless the multichannel format can be Spatialized (Android 12L+) or is a Dolby surround sound format. In addition, on devices that support audio spatialization, the DefaultTrackSelector will monitor for changes in the Spatializer properties and trigger a new track selection upon these. Devices with a television UI mode are excluded from these constraints and the format with the highest channel count will be preferred. To enable this feature, the DefaultTrackSelector instance must be constructed with a Context.
  • Video:
    • Rename DummySurface to PlaceholderSurface.
    • Add AV1 support to the MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Audio:
    • Use LG AC3 audio decoder advertising non-standard MIME type.
    • Change the return type of AudioAttributes.getAudioAttributesV21() from android.media.AudioAttributes to a new AudioAttributesV21 wrapper class, to prevent slow ART verification on API < 21.
    • Query the platform (API 29+) or assume the audio encoding channel count for audio passthrough when the format audio channel count is unset, which occurs with HLS chunkless preparation (10204).
    • Configure AudioTrack with channel mask AudioFormat.CHANNEL_OUT_7POINT1POINT4 if the decoder outputs 12 channel PCM audio (#10322.
  • DRM
    • Ensure the DRM session is always correctly updated when seeking immediately after a format change (10274).
  • Text:
    • Change Player.getCurrentCues() to return CueGroup instead of List<Cue>.
    • SSA: Support OutlineColour style setting when BorderStyle == 3 (i.e. OutlineColour sets the background of the cue) (#8435).
    • CEA-708: Parse data into multiple service blocks and ignore blocks not associated with the currently selected service number.
    • Remove RawCcExtractor, which was only used to handle a Google-internal subtitle format.
  • Extractors:
    • Add support for AVI (#2092).
    • Matroska: Parse DiscardPadding for Opus tracks.
    • MP4: Parse bitrates from esds boxes.
    • Ogg: Allow duplicate Opus ID and comment headers (#10038).
  • UI:
    • Fix delivery of events to OnClickListeners set on StyledPlayerView and PlayerView, in the case that useController=false (#9605). Also fix delivery of events to OnLongClickListener for all view configurations.
    • Fix incorrectly treating a sequence of touch events that exit the bounds of StyledPlayerView and PlayerView before ACTION_UP as a click (#9861).
    • Fix PlayerView accessibility issue where tapping might toggle playback rather than hiding the controls (#8627).
    • Rewrite TrackSelectionView and TrackSelectionDialogBuilder to work with the Player interface rather than ExoPlayer. This allows the views to be used with other Player implementations, and removes the dependency from the UI module to the ExoPlayer module. This is a breaking change.
    • Don't show forced text tracks in the PlayerView track selector, and keep a suitable forced text track selected if "None" is selected (#9432).
  • DASH:
    • Parse channel count from DTS AudioChannelConfiguration elements. This re-enables audio passthrough for DTS streams (#10159).
    • Disallow passing null to DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. Instances of DefaultCompositeSequenceableLoaderFactory can be passed explicitly if required.
  • HLS:
    • Fallback to chunkful preparation if the playlist CODECS attribute does not contain the audio codec (#10065).
    • Disallow passing null to HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory, and HlsMediaSource.Factory.setPlaylistTrackerFactory. Instances of DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory, or a reference to DefaultHlsPlaylistTracker.FACTORY can be passed explicitly if required.
  • Smooth Streaming:
    • Disallow passing null to SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. Instances of DefaultCompositeSequenceableLoaderFactory can be passed explicitly if required.
  • RTSP:
    • Add RTP reader for H263 (#63).
    • Add RTP reader for MPEG4 (#35).
    • Add RTP reader for HEVC (#36).
    • Add RTP reader for AMR. Currently only mono-channel, non-interleaved AMR streams are supported. Compound AMR RTP payload is not supported. (#46)
    • Add RTP reader for VP8 (#47).
    • Add RTP reader for WAV (#56).
    • Fix RTSP basic authorization header. (#9544).
    • Stop checking mandatory SDP fields as ExoPlayer doesn't need them (#10049).
    • Throw checked exception when parsing RTSP timing (#10165).
    • Add RTP reader for VP9 (#47).
    • Add RTP reader for OPUS (#53).
  • Data sources:
    • Rename DummyDataSource to PlaceholderDataSource.
    • Workaround OkHttp interrupt handling.
  • Ad playback / IMA:
    • Decrease ad polling rate from every 100ms to every 200ms, to line up with Media Rating Council (MRC) recommendations.
  • FFmpeg extension:
    • Update CMake version to 3.21.0+ to avoid a CMake bug causing AndroidStudio's gradle sync to fail (#9933).
  • Remove deprecated symbols:
    • Remove Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Use Player.Listener.onTracksChanged(Tracks) instead.
    • Remove Player.getCurrentTrackGroups and Player.getCurrentTrackSelections. Use Player.getCurrentTracks instead. You can also continue to use ExoPlayer.getCurrentTrackGroups and ExoPlayer.getCurrentTrackSelections, although these methods remain deprecated.
    • Remove DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT and DEFAULT_TRACK_SELECTOR_PARAMETERS constants. Use getDefaultTrackSelectorParameters(Context) instead when possible, and DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT otherwise.
    • Remove constructor DefaultTrackSelector(ExoTrackSelection.Factory). Use DefaultTrackSelector(Context, ExoTrackSelection.Factory) instead.
    • Remove Transformer.Builder.setContext. The Context should be passed to the Transformer.Builder constructor instead.

2.17.1 (2022-03-10)

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 and MediaItem.SubtitleConfiguration.Builder.setId to prioritise the SubtitleConfiguration field and fall back to the Factory value if it's not set (#10016).
  • Ad playback:
    • Fix audio underruns between ad periods in live HLS SSAI streams.

2.17.0 (2022-02-24)

This release corresponds to the AndroidX media3 1.0.0-alpha02 release.

  • 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 from MediaCodec. (#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 to queuedInputBufferCount.
    • Make SimpleExoPlayer.renderers private. Renderers can be accessed via ExoPlayer.getRenderer.
    • Updated some AnalyticsListener.EventFlags constant values to match values in Player.EventFlags.
    • Split AnalyticsCollector into an interface and default implementation to allow it to be stripped by R8 if an app doesn't need it.
  • 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 TrackGroups in a TrackGroupArray. TrackGroups can always be made distinguishable by setting an id in the TrackGroup 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 explicitly AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES instead of null.
    • Allow customization of the AudioTrack buffer size calculation by injecting an AudioTrackBufferSizeProvider to DefaultAudioSink (#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 the Format.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.
  • DRM:
    • Remove playbackLooper from DrmSessionManager.(pre)acquireSession. When a DrmSessionManager is used by an app in a custom MediaSource, the playbackLooper needs to be passed to DrmSessionManager.setPlayer instead.
  • 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:
    • Fix the color of the numbers in StyledPlayerView rewind and fastforward buttons when using certain themes (#9765).
    • Correctly translate playback speed strings (#9811).
  • DASH:
    • Support the forced-subtitle track role (#9727).
    • Stop interpreting the main track role as C.SELECTION_FLAG_DEFAULT.
    • Fix base URL exclusion logic for manifests that do not declare the DVB namespace (#9856).
    • Support relative MPD.Location URLs (#9939).
  • 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).
  • RTSP:
    • Provide a client API to override the SocketFactory used for any server connection (#9606).
    • Prefer DIGEST authentication method over BASIC if both are present (#9800).
    • Handle when RTSP track timing is not available (#9775).
    • Ignore invalid RTP-Info header values (#9619).
  • 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 on com.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 call setClearMediaItemsOnStop(false) on the connector.
  • Cast extension:
    • Fix bug that prevented CastPlayer from calling onIsPlayingChanged correctly (#9792).
    • Support audio metadata including artwork with DefaultMediaItemConverter (#9663).
  • FFmpeg extension:
    • Make build_ffmpeg.sh depend on LLVM's bin utils instead of GNU's (#9933).
  • Android 12 compatibility:
    • Upgrade the Cast extension to depend on com.google.android.gms:play-services-cast-framework:20.1.0. Earlier versions of play-services-cast-framework are not compatible with apps targeting Android 12, and will crash with an IllegalArgumentException when creating PendingIntents (#9528).
  • Remove deprecated symbols:
    • Remove Player.EventListener. Use Player.Listener instead.
    • Remove MediaSourceFactory.setDrmSessionManager, MediaSourceFactory.setDrmHttpDataSourceFactory, and MediaSourceFactory.setDrmUserAgent. Use MediaSourceFactory.setDrmSessionManagerProvider instead.
    • Remove MediaSourceFactory.setStreamKeys. Use MediaItem.Builder.setStreamKeys instead.
    • Remove MediaSourceFactory.createMediaSource(Uri). Use MediaSourceFactory.createMediaSource(MediaItem) instead.
    • Remove setTag from DashMediaSource, HlsMediaSource and SsMediaSource. Use MediaItem.Builder.setTag instead.
    • Remove DashMediaSource.setLivePresentationDelayMs(long, boolean). Use MediaItem.Builder.setLiveConfiguration and MediaItem.LiveConfiguration.Builder.setTargetOffsetMs to override the manifest, or DashMediaSource.setFallbackTargetLiveOffsetMs to provide a fallback value.
    • Remove (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Opting out of the thread enforcement is no longer possible.
    • Remove ActionFile and ActionFileUpgradeUtil. Use ExoPlayer 2.16.1 or before to use ActionFileUpgradeUtil to merge legacy action files into DefaultDownloadIndex.
    • Remove ProgressiveMediaSource.setExtractorsFactory. Use ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) constructor instead.
    • Remove ProgressiveMediaSource.Factory.setTag and ProgressiveMediaSource.Factory.setCustomCacheKey. Use MediaItem.Builder.setTag and MediaItem.Builder.setCustomCacheKey instead.
    • Remove DefaultRenderersFactory(Context, @ExtensionRendererMode int) and DefaultRenderersFactory(Context, @ExtensionRendererMode int, long) constructors. Use the DefaultRenderersFactory(Context) constructor, DefaultRenderersFactory.setExtensionRendererMode, and DefaultRenderersFactory.setAllowedVideoJoiningTimeMs instead.
    • Remove all public CronetDataSource constructors. Use CronetDataSource.Factory instead.
  • Change the following IntDefs to @Target(TYPE_USE) only. This may break the compilation of usages in Kotlin, which can be fixed by moving the annotation to annotate the type (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (in com.google.android.exoplayer2.ext.flac package)
    • @FlacExtractor.Flags (in com.google.android.exoplayer2.extractor.flac package)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

2.16.1 (2021-11-18)

  • 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 of DefaultRenderersFactory that override buildVideoRenderers() or buildAudioRenderers() can access the codec adapter factory and pass it to MediaCodecRenderer instances they create.
    • Propagate ICY header fields name and genre to MediaMetadata.station and MediaMetadata.genre respectively so that they reach the app via Player.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).
  • HLS:
    • Correctly populate Format.label for audio only HLS streams (#9608).

2.16.0 (2021-11-04)

  • Core Library:
    • Deprecate SimpleExoPlayer. All functionality has been moved to ExoPlayer instead. ExoPlayer.Builder can be used instead of SimpleExoPlayer.Builder.
    • Add track selection methods to the Player interface, for example, Player.getCurrentTracksInfo and Player.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 and DefaultRenderersFactory 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 the MediaItem.MediaMetadata are used above media derived values.
    • Move com.google.android.exoplayer2.device.DeviceInfo to com.google.android.exoplayer2.DeviceInfo.
    • Move com.google.android.exoplayer2.drm.DecryptionException to com.google.android.exoplayer2.decoder.CryptoException.
    • Move com.google.android.exoplayer2.upstream.cache.CachedRegionTracker to com.google.android.exoplayer2.upstream.CachedRegionTracker.
    • Move Player.addListener(EventListener) and Player.removeListener(EventListener) out of Player into subclasses.
  • 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 to Surface.setFrameRate. This is useful for applications wanting to call Surface.setFrameRate directly from application code with Android 12's Surface.CHANGE_FRAME_RATE_ALWAYS.
    • Upgrade the WorkManager extension to depend on androidx.work:work-runtime:2.7.0. Earlier versions of work-runtime are not compatible with apps targeting Android 12, and will crash with an IllegalArgumentException when creating PendingIntents (#9181).
  • Video:
    • Fix bug in MediaCodecVideoRenderer that resulted in re-using a released Surface when playing without an app-provided Surface (#9476).
  • DRM:
    • Log an error (instead of throwing IllegalStateException) when calling DefaultDrmSession#release() on a fully released session (#9392).
  • UI:
    • SubtitleView no longer implements TextOutput. SubtitleView implements Player.Listener, so can be registered to a player with Player.addListener.
    • Fix initial timestamp display in PlayerControlView (#9524).
    • Fix capitalization of languages in the track selector (#9452).
  • 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 invalid colr boxes produced by some device cameras (#9332).
    • MP4: Parse HDR static metadata from the clli and mdcv 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 when DownloadService.getScheduler returns null, or returns a Scheduler 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.
  • RTSP:
    • Support RFC4566 SDP attribute field grammar (#9430).
  • DASH:
    • Populate Format.sampleMimeType, width and height for image AdaptationSet elements (#9500).
  • HLS:
    • Fix rounding error in HLS playlists (#9575).
    • Fix NoSuchElementException thrown when an HLS manifest declares #EXT-X-RENDITION-REPORT at the beginning of the playlist (#9592).
  • RTMP extension:
    • Upgrade to io.antmedia:rtmp_client, which does not rely on jcenter() (#9591).
  • MediaSession extension:
    • Rename MediaSessionConnector.QueueNavigator#onCurrentWindowIndexChanged to onCurrentMediaItemIndexChanged.
  • 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 in C instead.
    • Remove C.MSG_* constants. Use identically named constants in Renderer instead, except for C.MSG_SET_SURFACE, which is replaced with Renderer.MSG_SET_VIDEO_OUTPUT.
    • Remove DeviceListener. Use Player.Listener instead.
    • Remove CacheDataSourceFactory. Use CacheDataSource.Factory instead.
    • Remove CacheDataSinkFactory. Use CacheDataSink.Factory instead.
    • Remove FileDataSourceFactory. Use FileDataSource.Factory instead.
    • Remove SimpleExoPlayer.addMetadataOutput and removeMetadataOutput. Use Player.addListener and Player.Listener instead.
    • Remove SimpleExoPlayer.addAudioListener, removeAudioListener and AudioListener. Use Player.addListener and Player.Listener instead.
    • Remove SimpleExoPlayer.addVideoListener, removeVideoListener and VideoListener. Use Player.addListener and Player.Listener instead.
    • Remove DefaultHttpDataSourceFactory. Use DefaultHttpDataSource.Factory instead.
    • Remove SingleSampleMediaSource.createMediaSource(Uri, Format, long). Use SingleSampleMediaSource.createMediaSource(MediaItem.Subtitle, long) instead.
    • Remove HttpDataSource.Factory.getDefaultRequestProperties. Use HttpDataSource.Factory.setDefaultRequestProperties instead.
    • Remove GvrAudioProcessor and the GVR extension, which has been deprecated since 2.11.0.
    • Remove DownloadService.onDownloadChanged and DownloadService.onDownloadRemoved. Instead, use DownloadManager.addListener to register a listener directly to the DownloadManager returned through DownloadService.getDownloadManager.
    • Remove Player.getCurrentStaticMetadata, Player.Listener.onStaticMetadataChanged and Player.EVENT_STATIC_METADATA_CHANGED. Use Player.getMediaMetadata, Player.Listener.onMediaMetadataChanged and Player.EVENT_MEDIA_METADATA_CHANGED for convenient access to structured metadata, or access the raw static metadata directly from the TrackSelection#getFormat().
    • Remove ControlDispatcher and DefaultControlDispatcher. Operations can be customized by using a ForwardingPlayer, or when configuring the player (for example by using ExoPlayer.Builder.setSeekBackIncrementMs).

2.15.1 (2021-09-20)

  • Core Library:
    • Fix track selection in StyledPlayerControlView when using ForwardingPlayer.
    • Fix FlagSet#equals on API levels below 24.
    • Fix NullPointerException being thrown from CacheDataSource when reading a fully cached resource with DataSpec.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 to MimeTypes.AUDIO_DTS_X and add required profile to its value (#9429).
  • Extractors:
    • Support TS packets without PTS flag (#9294).
    • Fix issue decoding ID3 tags containing UTF-16 encoded strings (#9087).
  • 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.
  • Downloads and caching:
    • Workaround platform issue that can cause a SecurityException to be thrown from Requirements.isInternetConnectivityValidated on devices running Android 11 (#9002).
  • 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:
    • Handle when additional spaces are in SDP's RTPMAP atrribute (#9379).
    • Handle partial URIs in RTP-Info headers (#9346).
    • Fix RTSP Session header handling (#9416).
    • Fix RTSP WWW-Authenticate header parsing (#9428).
  • UI:
    • Use defStyleAttr when obtaining styled attributes in StyledPlayerView, PlayerView and PlayerControlView (#9024).
    • Fix accessibility focus in PlayerControlView (#9111).
    • Fix issue that StyledPlayerView and PlayerView don't update UI when available player commands change.
  • Cast extension:
    • Implement CastPlayer.setPlaybackParameters(PlaybackParameters) to support setting the playback speed (#6784).

2.15.0 (2021-08-10)

  • Core Library:
    • Add MediaCodecAdapter.needsReconfiguration method.
    • Add getSeekBackIncrement, seekBack, getSeekForwardIncrement, seekForward, getMaxSeekToPreviousPosition, seekToPrevious and seekToNext methods to Player.
    • Rename Player methods:
      • hasPrevious to hasPreviousWindow.
      • previous to seekToPreviousWindow.
      • hasNext to hasNextWindow.
      • next to seekToNextWindow.
    • Rename Player commands:
      • COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM to COMMAND_SEEK_IN_CURRENT_WINDOW.
      • COMMAND_SEEK_TO_NEXT_MEDIA_ITEM to COMMAND_SEEK_TO_NEXT_WINDOW.
      • COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM to COMMAND_SEEK_TO_PREVIOUS_WINDOW.
      • COMMAND_SEEK_TO_MEDIA_ITEM to COMMAND_SEEK_TO_WINDOW.
      • COMMAND_GET_MEDIA_ITEMS to COMMAND_GET_TIMELINE.
    • Rename Player.EventFlags IntDef to Player.Event.
    • Make Player depend on the new PlaybackException class instead of ExoPlaybackException:
      • Player.getPlayerError now returns a PlaybackException.
      • Player.Listener.onPlayerError now receives a PlaybackException.
      • Add a new listener method Player.Listener.onPlayerErrorChanged, which is equivalent to onPlayerError except that it is also called when the player error becomes null.
      • Player implementations like ExoPlayer may use PlaybackException subclasses (like ExoPlaybackException), so users can downcast the PlaybackException instance to obtain implementation-specific fields (like ExoPlaybackException.rendererIndex).
    • PlaybackException introduces an errorCode which identifies the cause of the failure in order to simplify error handling (#1611).
    • Add a DefaultMediaDescriptionAdapter for the PlayerNotificationManager, that makes use of the Player MediaMetadata to populate the notification fields.
    • Add @FallbackType to LoadErrorHandlingPolicy 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).
  • 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).
  • 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 and setUseFastForwardAction to PlayerNotificationManager, and setUseFastForwardActionInCompactView and setUseRewindActionInCompactView to show the actions in compact view mode.
    • Remove rewind_increment and fastforward_increment attributes from PlayerControlView and StyledPlayerControlView. These increments can be customized by configuring the Player (see setSeekBackIncrementMs and setSeekForwardIncrementMs in SimpleExoPlayer.Builder), or by using a ForwardingPlayer that overrides getSeekBackIncrement, seekBack, getSeekForwardIncrement and seekForward. The rewind and fast forward buttons can be disabled by using a ForwardingPlayer that removes COMMAND_SEEK_BACK and COMMAND_SEEK_FORWARD from the available commands.
    • Update DefaultControlDispatcher getRewindIncrementMs and getFastForwardIncrementMs to take the player as parameter.
  • DASH:
    • Add support for multiple base URLs and DVB attributes in the manifest. Apps that are using DefaultLoadErrorHandlingPolicy with such manifests have base URL fallback automatically enabled (#771, #7654).
  • HLS:
    • Fix issue that could cause some playbacks to be stuck buffering (#8850, #9153).
    • Report audio track type in AnalyticsListener.onDownstreamFormatChanged() for audio-only playlists, so that the PlaybackStatsListener can derive audio format-related information (#9175).
  • RTSP:
    • Use standard RTSP header names (#9182).
    • Handle an extra semicolon in SDP fmtp attribute (#9247).
    • Fix handling of special characters in the RTSP session ID (#9254).
  • SmoothStreaming:
    • Propagate StreamIndex element Name attribute value as Format label (#9252).
  • Cronet extension:
    • Add CronetDataSource.Factory.setRequestPriority to allow setting the priority of requests made by CronetDataSource instances.
  • 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. Use setMediaItems, addMediaItems, removeMediaItem and moveMediaItem instead.
    • Remove Format.create methods. Use Format.Builder instead.
    • Remove MediaSource.getTag. Use MediaSource.getMediaItem and MediaItem.PlaybackProperties.tag instead.
    • Remove PlaybackPreparer. UI components that previously had setPlaybackPreparer methods will now call Player.prepare by default. If this behavior is sufficient, use of PlaybackPreparer can be removed from application code without replacement. For custom preparation logic, use a ForwardingPlayer that implements custom preparation logic in prepare.
    • Remove Player.Listener.onTimelineChanged(Timeline, Object, int). Use Player.Listener.onTimelineChanged(Timeline, int) instead. The manifest can be accessed using Player.getCurrentManifest.
    • Remove Player.getCurrentTag. Use Player.getCurrentMediaItem and MediaItem.PlaybackProperties.tag instead.
    • Remove Player.getPlaybackError. Use Player.getPlayerError instead.
    • Remove PlayerNotificationManager constructors and createWith methods. Use PlayerNotificationManager.Builder instead.
    • Remove PlayerNotificationManager.setNotificationListener. Use PlayerNotificationManager.Builder.setNotificationListener instead.
    • Remove PlayerNotificationManager setUseNavigationActions and setUseNavigationActionsInCompactView. Use setUseNextAction, setUsePreviousAction, setUseNextActionInCompactView and setUsePreviousActionInCompactView instead.
    • Remove setRewindIncrementMs and setFastForwardIncrementMs from UI components. These increments can be customized by configuring the Player (see setSeekBackIncrementMs and setSeekForwardIncrementMs in SimpleExoPlayer.Builder), or by using a ForwardingPlayer that overrides getSeekBackIncrement, seekBack, getSeekForwardIncrement and seekForward. The rewind and fast forward buttons can be disabled by using a ForwardingPlayer that removes COMMAND_SEEK_BACK and COMMAND_SEEK_FORWARD from the available commands.
    • Remove Timeline.getWindow(int, Window, boolean). Use Timeline.getWindow(int, Window) instead, which will always set tags.

2.14.2 (2021-07-20)

  • Core Library:
    • Explicitly mark several methods on SimpleExoPlayer as @Deprecated. These methods are all overrides and are already deprecated on Player and the respective ExoPlayer component classes (since 2.14.0).
  • Video:
    • Fix IncorrectContextUseViolation strict mode warning on Android 11 (#8246).
  • 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 the track_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).
  • 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).
  • 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-alive DefaultDrmSession references, resulting in DefaultDrmSession.release() throwing an IllegalStateException (#9193).
  • Metadata:
    • Fix handling of emsg messages with an unset duration (#9123).
  • UI:
    • Add PendingIntent.FLAG_IMMUTABLE when creating broadcast intents in PlayerNotificationManager. This is required by a behaviour change in Android 12.
    • Fix focusability of StyledPlayerView and StyledPlayerControlView popup menus on API levels prior to 26 (#9061).
    • Fix progress bar flickering immediately after the user seeks (#9049).
    • Fix StyledPlayerView and StyledPlayerControlView popup menu items not expanding to occupy the full width of the popup (#9086).
    • Don't propagate AttributeSet from SubtitleView constructor into CanvasSubtitleOutput. Just passing the Context is enough, and ensures programmatic changes to the SubtitleView will propagate down.
  • RTSP:
    • Fix session description (SDP) parsing to use a HashMap-like behaviour for duplicated attributes. (#9014).
    • Allow using absolute URI in the control attribute in a media description (#9183).
    • Allow the timeout to be customised via RtspMediaSource.Factory.setTimeoutMs.

2.14.1 (2021-06-11)

  • 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.
  • Extractors:
    • Add support for MPEG-H 3D Audio in MP4 extractors (#8860).
  • Video:
    • Fix bug that could cause CodecException: Error 0xffffffff to be thrown from MediaCodec.native_setSurface in use cases that involve both swapping the output Surface and a mixture of secure and non-secure content being played (#8776).
  • HLS:
    • Use the PRECISE attribute in EXT-X-START to select the default start position.
    • Fix a bug where skipping into spliced-in chunks triggered an assertion error (#8937).
  • 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 a Surface from a secure decoder on some devices (#8842). It will also result in DRM license refresh network requests while the player is stopped if Player#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.
  • UI:
    • Keep subtitle language features embedded (e.g. rubies & tate-chu-yoko) in Cue.text even when SubtitleView#setApplyEmbeddedStyles() is false.
    • Fix NullPointerException in StyledPlayerView that could occur after calling StyledPlayerView.setPlayer(null) (#8985).
  • RTSP:
    • Add support for RTSP basic and digest authentication (#8941).
    • Enable using repeat mode and playlist with RTSP (#8994).
    • Add RtspMediaSource.Factory option to set the RTSP user agent.
    • Add RtspMediaSource.Factory option to force using TCP for streaming.
  • GL demo app:
    • Fix texture transformation to avoid green bars shown on some videos (#8992).

2.14.0 (2021-05-13)

  • Core Library:
    • Move Player components to ExoPlayer. For example Player.VideoComponent is now ExoPlayer.VideoComponent.
    • The most used methods of Player's audio, video, text and metadata components have been added directly to Player.
    • Add Player.getAvailableCommands, Player.isCommandAvailable and Listener.onAvailableCommandsChanged to query which commands that can be executed on the player.
    • Add a Player.Listener interface to receive all player events. Component listeners and EventListener have been deprecated.
    • Add Player.getMediaMetadata, which returns a combined and structured MediaMetadata object. Changes to metadata are reported to Listener.onMediaMetadataChanged.
    • Player.setPlaybackParameters no longer accepts null, use PlaybackParameters.DEFAULT instead.
    • Report information about the old and the new playback positions to Listener.onPositionDiscontinuity. Add DISCONTINUITY_REASON_SKIP and DISCONTINUITY_REASON_REMOVE as discontinuity reasons, and rename DISCONTINUITY_REASON_PERIOD_TRANSITION to DISCONTINUITY_REASON_AUTO_TRANSITION. Remove DISCONTINUITY_REASON_AD_INSERTION, for which DISCONTINUITY_REASON_AUTO_TRANSITION is used instead (#6163, #4768).
    • Deprecate ExoPlayer.Builder. Use SimpleExoPlayer.Builder instead.
    • Move Player.getRendererCount and Player.getRendererType to ExoPlayer.
    • 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 add MediaCodecRenderer.getMediaCodecConfiguration(). The new method is called just before the MediaCodec is created and returns the parameters needed to create and configure the MediaCodec instance. Applications can override MediaCodecRenderer.onCodecInitialized() to be notified after a MediaCodec is initialized, or they can inject a custom MediaCodecAdapter.Factory if they want to control how the MediaCodec is configured.
    • Promote AdaptiveTrackSelection.AdaptationCheckpoint to public visibility to allow Kotlin subclasses of AdaptiveTrackSelection.Factory (#8830).
    • Fix bug when transitions from content to ad periods called onMediaItemTransition by mistake.
    • AdsLoader.AdViewProvider and AdsLoader.OverlayInfo have been renamed com.google.android.exoplayer2.ui.AdViewProvider and com.google.android.exoplayer2.ui.AdOverlayInfo respectively.
    • CaptionStyleCompat has been moved to the com.google.android.exoplayer2.ui package.
    • DebugTextViewHelper has been moved from the ui package to the util package.
  • RTSP:
    • Initial support for RTSP playbacks (#55).
  • Downloads and caching:
    • Fix CacheWriter to correctly handle cases where the request DataSpec 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 the allowShortContent parameter has been removed (#7326).
    • Fix CacheWriter to correctly handle DataSource.close failures, for which it cannot be assumed that data was successfully written to the cache.
  • 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 from PlayerView and StyledPlayerView. Instead, cast the view returned by getVideoSurfaceView to SphericalGLSurfaceView, and then call setUseSensorRotation on the SphericalGLSurfaceView directly.
  • Analytics:
    • Add onAudioCodecError and onVideoCodecError to AnalyticsListener.
  • Video:
    • Add Player.getVideoSize() to retrieve the current size of the video stream. Add Listener.onVideoSizeChanged(VideoSize) and deprecate Listener.onVideoSizeChanged(int, int, int, float).
  • 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.
  • 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.
  • Allow the use of Android platform extractors through MediaParser. Only supported on API 30+.
    • You can use platform extractors for progressive media by passing MediaParserExtractorAdapter.FACTORY when creating a ProgressiveMediaSource.Factory.
    • You can use platform extractors for HLS by passing MediaParserHlsMediaChunkExtractor.FACTORY when creating a HlsMediaSource.Factory.
    • You can use platform extractors for DASH by passing a DefaultDashChunkSource that uses MediaParserChunkExtractor.FACTORY when creating a DashMediaSource.Factory.
  • Cast extension:
    • Trigger onMediaItemTransition event for all reasons except MEDIA_ITEM_TRANSITION_REASON_REPEAT.
  • MediaSession extension:
    • Remove dependency on exoplayer-core, relying only exoplayer-common instead. To achieve this, TimelineQueueEditor uses a new MediaDescriptionConverter interface, and no longer relies on ConcatenatingMediaSource.
  • Remove deprecated symbols:
    • Remove ExoPlayerFactory. Use SimpleExoPlayer.Builder instead.
    • Remove Player.DefaultEventListener. Use Player.Listener instead.
    • Remove ExtractorMediaSource. Use ProgressiveMediaSource instead.
    • Remove DefaultMediaSourceEventListener. Use MediaSourceEventListener instead.
    • Remove DashManifest constructor. Use the remaining constructor with programInformation and serviceDescription set to null instead.
    • Remove CryptoInfo.getFrameworkCryptoInfoV16. Use CryptoInfo.getFrameworkCryptoInfo instead.
    • Remove NotificationUtil.createNotificationChannel(Context, String, int, int). Use createNotificationChannel(Context, String, int, int, int) instead.
    • Remove PlayerNotificationManager.setNotificationListener. Use PlayerNotificationManager.Builder.setNotificationListener instead.
    • Remove PlayerNotificationManager.NotificationListener onNotificationStarted(int, Notification) and onNotificationCancelled(int). Use onNotificationPosted(int, Notification, boolean) and onNotificationCancelled(int, boolean) instead.
    • Remove DownloadNotificationUtil. Use DownloadNotificationHelper instead.
    • Remove extension-jobdispatcher module. Use the extension-workmanager module instead.

2.13.3 (2021-04-14)

  • Published via the Google Maven repository (i.e., google()) rather than JCenter.
  • Core:
    • Reset playback speed when live playback speed control becomes unused (#8664).
    • Fix playback position issue when re-preparing playback after a BehindLiveWindowException (#8675).
    • Assume Dolby Vision content is encoded as H264 when calculating maximum codec input size (#8705).
  • UI:
    • Fix StyledPlayerView scrubber not reappearing correctly in some cases (#8646).
    • Fix measurement of StyledPlayerView and StyledPlayerControlView when wrap_content is used (#8726).
    • Fix StyledPlayerControlView to stay in full mode (rather than minimal mode) when possible (#8763).
  • DASH:
    • Parse forced_subtitle role from DASH manifests (#8781).
  • DASH:
    • Fix rounding error that could cause SegmentTemplate.getSegmentCount() to return incorrect values (#8804).
  • 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).
  • Extractors:
    • Add support for GContainer and GContainerItem XMP namespace prefixes in JPEG motion photo parsing.
    • Allow JFIF APP0 marker segment preceding Exif APP1 segment in JpegExtractor.
  • 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.
  • 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 reason DISCONTINUITY_REASON_PERIOD_TRANSITION after a seek to another media item and so that it is not triggered after a timeline change.
  • IMA extension:
    • Fix error caused by AdPlaybackState ad group times being cleared, which can occur if the ImaAdsLoader is released while an ad is pending loading (#8693).
    • Upgrade IMA SDK dependency to 3.23.0, fixing an issue with NullPointerExceptions within WebView callbacks (#8447).
  • FFmpeg extension: Fix playback failure when switching to TrueHD tracks during playback (#8616).

2.13.2 (2021-02-25)

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

2.13.1 (2021-02-12)

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

2.13.0 (2021-02-04)

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

2.12.3 (2021-01-13)

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

2.12.2 (2020-12-01)

  • Core library:
    • Suppress exceptions from registering and 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:
    • 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 (#8047).

2.12.1 (2020-10-23)

  • Core library:
    • Fix issue where Player.setMediaItems would ignore its resetPosition argument (#8024).
    • Fix bug where streams with highly uneven track durations may get stuck in a buffering state (#7943).
    • Switch Guava dependency from implementation to api (#7905, #7993).
    • Add 403, 500 and 503 to the list of HTTP status codes that can trigger failover to another quality variant during adaptive playbacks.
  • Data sources:
    • Add support for android.resource URI scheme in RawResourceDataSource (#7866).
  • Text:
    • Add support for \h SSA/ASS style override code (non-breaking space).
    • Fix playback of WebVTT subtitles in MP4 containers in DASH streams (#7985).
    • Fix NullPointerException in TextRenderer when playing content with a single subtitle buffer (#8017).
  • UI:
    • Fix animation when StyledPlayerView first shows its playback controls.
    • Improve touch targets in StyledPlayerView to make tapping easier.
    • Allow subtitleButton to be omitted in custom StyledPlayerView layouts (#7962).
    • Add an option to sort tracks by Format in TrackSelectionView and TrackSelectionDialogBuilder (#7709).
  • Audio:
    • Fix the default audio sink position not advancing correctly when using AudioTrack based speed adjustment (#7982).
    • Fix NoClassDefFoundError warning for AudioTrack$StreamEventCallback (#8058).
  • Extractors:
    • MP4:
      • Add support for _mp2 boxes (#7967).
      • Fix playback of files containing pcm_alaw or pcm_mulaw audio tracks, by enabling sample rechunking for such tracks.
    • MPEG-TS:
      • Add TsExtractor parameter to configure the number of bytes in which to search for timestamps when seeking and determining stream duration (#7988).
      • Ignore negative payload size in PES packets (#8005).
    • MP3: Use TLEN ID3 tag to compute the stream duration (#7949).
    • Ogg: Fix regression playing files with packets that span multiple pages (#7992).
    • FLV: Make files seekable by using the key frame index (#7378).
  • Downloads: Fix issue retrying progressive downloads, which could also result in a crash in DownloadManager.InternalHandler.onContentLengthChanged (#8078).
  • HLS: Fix crash affecting chunkful preparation of master playlists that start with an I-FRAME only variant (#8025).
  • IMA extension:
    • Fix position reporting after fetch errors (#7956).
    • Allow apps to specify a VideoAdPlayerCallback (#7944).
    • Accept ad tags via the AdsMediaSource constructor and deprecate passing them via the ImaAdsLoader constructor/builders. Passing the ad tag via media item playback properties continues to be supported. This is in preparation for supporting ads in playlists (#3750).
    • Add a way to override ad media MIME types (#7961).
    • Fix incorrect truncation of large cue point positions (#8067).
    • Upgrade IMA SDK dependency to 3.20.1. This brings in a fix for companion ads rendering when targeting API 29 (#6432).

2.12.0 (2020-09-11)

To learn more about what's new in 2.12, read the corresponding blog post.

  • Core library:
    • Player:
      • Add a top level playlist API based on a new MediaItem class (#6161). The new methods for playlist manipulation are setMediaItem(s), addMediaItem(s), moveMediaItem(s), removeMediaItem(s) and clearMediaItems. The playlist can be queried using getMediaItemCount and getMediaItemAt. This API should be used instead of ConcatenatingMediaSource in most cases. Learn more by reading this blog post.
      • Add getCurrentMediaItem for getting the currently playing item in the playlist.
      • Add EventListener.onMediaItemTransition to report when playback transitions from one item to another in the playlist.
      • Add play and pause convenience methods. They are equivalent to setPlayWhenReady(true) and setPlayWhenReady(false) respectively.
      • Add getCurrentLiveOffset for getting the offset of the current playback position from the live edge of a live stream.
      • Add getTrackSelector for getting the TrackSelector used by the player.
      • Add AudioComponent.setAudioSessionId to set the audio session ID. This method is also available on SimpleExoPlayer.
      • Remove PlaybackParameters.skipSilence, and replace it with AudioComponent.setSkipSilenceEnabled. This method is also available on SimpleExoPlayer. An AudioListener.onSkipSilenceEnabledChanged callback is also added.
      • Add TextComponent.getCurrentCues to get the current cues. This method is also available on SimpleExoPlayer. The current cues are no longer automatically forwarded to a TextOutput when it's added to a SimpleExoPlayer.
      • Add Player.DeviceComponent to query and control the device volume. SimpleExoPlayer implements this interface.
      • Deprecate and rename getPlaybackError to getPlayerError for consistency.
      • Deprecate and rename onLoadingChanged to onIsLoadingChanged for consistency.
      • Deprecate EventListener.onPlayerStateChanged, replacing it with EventListener.onPlayWhenReadyChanged and EventListener.onPlaybackStateChanged.
      • Deprecate EventListener.onSeekProcessed because seek changes now happen instantly and listening to onPositionDiscontinuity is sufficient.
    • ExoPlayer:
      • Add setMediaSource(s) and addMediaSource(s) to ExoPlayer, for adding MediaSource instances directly to the playlist.
      • Add ExoPlayer.setPauseAtEndOfMediaItems to let the player pause at the end of each media item (#5660).
      • Allow passing C.TIME_END_OF_SOURCE to PlayerMessage.setPosition to send a PlayerMessage at the end of a stream.
    • SimpleExoPlayer:
      • SimpleExoPlayer implements the new MediaItem based playlist API, using a MediaSourceFactory to convert MediaItem instances to playable MediaSource instances. A DefaultMediaSourceFactory is used by default. Builder.setMediaSourceFactory allows setting a custom factory.
      • Update APK shrinking guide to explain how shrinking works with the new MediaItem and DefaultMediaSourceFactory implementations (#7937).
      • Add additional options to Builder that were previously only accessible via setters.
      • Add opt-in to verify correct thread usage with setThrowsWhenUsingWrongThread(true) (#4463).
    • Format:
      • Add a Builder and deprecate all create methods and most Format.copyWith methods.
      • Split bitrate into averageBitrate and peakBitrate (#2863).
    • LoadControl:
      • Add a playbackPositionUs parameter to shouldContinueLoading.
      • Set the default minimum buffer duration in DefaultLoadControl to 50 seconds (equal to the default maximum buffer), and treat audio and video the same.
    • Add a MetadataRetriever API for retrieving track information and static metadata for a media item (#3609).
    • Attach an identifier and extra information to load error events passed to LoadErrorHandlingPolicy (#7309). LoadErrorHandlingPolicy implementations should migrate to implementing the non-deprecated methods of the interface.
    • Add an option to MergingMediaSource to adjust the time offsets between the merged sources (#6103).
    • Move MediaSourceEventListener.LoadEventInfo and MediaSourceEventListener.MediaLoadData to be top-level classes in com.google.android.exoplayer2.source.
    • Move SimpleDecoderVideoRenderer and SimpleDecoderAudioRenderer to DecoderVideoRenderer and DecoderAudioRenderer respectively, and generalize them to work with Decoder rather than SimpleDecoder.
    • Deprecate C.MSG_* constants, replacing them with constants in Renderer.
    • Split the library-core module into library-core, library-common and library-extractor. The library-core module has an API dependency on both of the new modules, so this change should be transparent to developers including ExoPlayer using Gradle dependencies.
    • Add a dependency on Guava.
  • Video:
    • Pass frame rate hint to Surface.setFrameRate on Android 11.
    • Fix incorrect aspect ratio when transitioning from one video to another with the same resolution, but a different pixel aspect ratio (#6646).
  • Audio:
    • Add experimental support for power efficient playback using audio offload.
    • Add support for using framework audio speed adjustment instead of ExoPlayer's implementation (#7502). This option can be set using DefaultRenderersFactory.setEnableAudioTrackPlaybackParams.
    • Add an event for the audio position starting to advance, to make it easier for apps to determine when audio playout started (#7577).
    • Generalize support for floating point audio.
      • Add an option to DefaultAudioSink for enabling floating point output. This option can also be set using DefaultRenderersFactory.setEnableAudioFloatOutput.
      • Add floating point output capability to MediaCodecAudioRenderer and LibopusAudioRenderer, which is enabled automatically if the audio sink supports floating point output and if it makes sense for the content being played.
      • Enable the floating point output capability of FfmpegAudioRenderer automatically if the audio sink supports floating point output and if it makes sense for the content being played. The option to manually enable floating point output has been removed, since this now done with the generalized option on DefaultAudioSink.
    • In MediaCodecAudioRenderer, stop passing audio samples through MediaCodec when playing PCM audio or encoded audio using passthrough mode.
    • Reuse audio decoders when transitioning through playlists of gapless audio, rather than reinstantiating them.
    • Check DefaultAudioSink supports passthrough, in addition to checking the AudioCapabilities (#7404).
  • Text:
    • Many of the changes described below improve support for Japanese subtitles. Read this blog post to learn more.
    • Add a WebView-based output option to SubtitleView. This can display some features not supported by the existing Canvas-based output such as vertical text and rubies. It can be enabled by calling SubtitleView#setViewType(VIEW_TYPE_WEB).
    • Recreate the decoder when handling and swallowing decode errors in TextRenderer. This fixes a case where playback would never end when playing content with malformed subtitles (#7590).
    • Only apply CaptionManager font scaling in SubtitleView.setUserDefaultTextSize if the CaptionManager is enabled.
    • Improve positioning of vertical cues when rendered horizontally.
    • Redefine Cue.lineType=LINE_TYPE_NUMBER in terms of aligning the cue text lines to grid of viewport lines. Only consider Cue.lineAnchor when Cue.lineType=LINE_TYPE_FRACTION.
    • WebVTT:
      • Add support for default text and background colors (#6581).
      • Update position alignment parsing to recognise line-left, center and line-right.
      • Implement steps 4-10 of the WebVTT line computation algorithm.
      • Stop parsing unsupported CSS properties. The spec provides an exhaustive list of which properties are supported.
      • Parse the ruby-position CSS property.
      • Parse the text-combine-upright CSS property (i.e., tate-chu-yoko).
      • Parse the <ruby> and <rt> tags.
    • TTML:
      • Parse the tts:combineText property (i.e., tate-chu-yoko).
      • Parse ttts:ruby and tts:rubyPosition properties.
    • CEA-608:
      • Implement timing-out of stuck captions, as permitted by ANSI/CTA-608-E R-2014 Annex C.9. The default timeout is set to 16 seconds (#7181).
      • Trim lines that exceed the maximum length of 32 characters (#7341).
      • Fix positioning of roll-up captions in the top half of the screen (#7475).
      • Stop automatically generating a CEA-608 track when playing standalone MPEG-TS files. The previous behavior can still be obtained by manually injecting a customized DefaultTsPayloadReaderFactory into TsExtractor.
  • Metadata: Add minimal DVB Application Information Table (AIT) support.
  • DASH:
    • Add support for canceling in-progress segment fetches (#2848).
    • Add support for CEA-708 embedded in FMP4.
  • SmoothStreaming:
    • Add support for canceling in-progress segment fetches (#2848).
  • HLS:
    • Add support for discarding buffered media (e.g., to allow faster adaptation to a higher quality variant) (#6322).
    • Add support for canceling in-progress segment fetches (#2848).
    • Respect 33-bit PTS wrapping when applying X-TIMESTAMP-MAP to WebVTT timestamps (#7464).
  • Extractors:
    • Optimize the Extractor sniffing order to reduce start-up latency in DefaultExtractorsFactory and DefaultHlsExtractorsFactory (#6410).
    • Use filename extensions and response header MIME types to further optimize Extractor sniffing order on a per-media basis.
    • MP3: Add IndexSeeker for accurate seeks in VBR MP3 streams (#6787). This seeker can be enabled by passing FLAG_ENABLE_INDEX_SEEKING to the Mp3Extractor. A significant portion of the file may need to be scanned when a seek is performed, which may be costly for large files.
    • MP4: Fix playback of MP4 streams that contain Opus audio.
    • FMP4: Add support for partially fragmented MP4s (#7308).
    • Matroska:
      • Support Dolby Vision (#7267).
      • Populate Format.label with track titles.
      • Remove support for the Invisible block header flag.
    • MPEG-TS: Add support for MPEG-4 Part 2 and H.263 (#1603, #5107).
    • Ogg: Fix handling of non-contiguous pages (#7230).
  • UI:
    • Add StyledPlayerView and StyledPlayerControlView, which provide a more polished user experience than PlayerView and PlayerControlView at the cost of decreased customizability.
    • Remove the previously deprecated SimpleExoPlayerView and PlaybackControlView classes, along with the corresponding exo_simple_player_view.xml and exo_playback_control_view.xml layout resources. Use the equivalent PlayerView, PlayerControlView, exo_player_view.xml and exo_player_control_view.xml instead.
    • Add setter methods to PlayerView and PlayerControlView to set whether the rewind, fast forward, previous and next buttons are shown (#7410).
    • Update TrackSelectionDialogBuilder to use the AndroidX app compat AlertDialog rather than the platform version, if available (#7357).
    • Make UI components dispatch previous, next, fast forward and rewind actions via their ControlDispatcher (#6926).
  • Downloads and caching:
    • Add DownloadRequest.Builder.
    • Add DownloadRequest.keySetId to make it easier to store an offline license keyset identifier alongside the other information that's persisted in DownloadIndex.
    • Support passing an Executor to DefaultDownloaderFactory on which data downloads are performed.
    • Parallelize and merge downloads in SegmentDownloader to improve download speeds (#5978).
    • Replace CacheDataSinkFactory and CacheDataSourceFactory with CacheDataSink.Factory and CacheDataSource.Factory respectively.
    • Remove DownloadConstructorHelper and instead use CacheDataSource.Factory directly.
    • Add Requirements.DEVICE_STORAGE_NOT_LOW, which can be specified as a requirement to a DownloadManager for it to proceed with downloading.
    • For failed downloads, propagate the Exception that caused the failure to DownloadManager.Listener.onDownloadChanged.
    • Support multiple non-overlapping write locks for the same key in SimpleCache.
    • Remove CacheUtil. Equivalent functionality is provided by a new CacheWriter class, Cache.getCachedBytes, Cache.removeResource and CacheKeyFactory.DEFAULT.
  • DRM:
    • Remove previously deprecated APIs to inject DrmSessionManager into Renderer instances. DrmSessionManager must now be injected into MediaSource instances via the MediaSource factories.
    • Add the ability to inject a custom DefaultDrmSessionManager into OfflineLicenseHelper (#7078).
    • Keep DRM sessions alive for a short time before fully releasing them (#7011, #6725, #7066).
    • Remove support for cbc1 and cens encrytion schemes. Support for these schemes was removed from the Android platform from API level 30, and the range of API levels for which they are supported is too small to be useful.
    • Remove generic types from DRM components.
    • Rename DefaultDrmSessionEventListener to DrmSessionEventListener.
  • Track selection:
    • Add TrackSelection.shouldCancelMediaChunkLoad to check whether an ongoing load should be canceled (#2848).
    • Add DefaultTrackSelector constraints for minimum video resolution, bitrate and frame rate (#4511).
    • Remove previously deprecated DefaultTrackSelector members.
  • Data sources:
    • Add HttpDataSource.InvalidResponseCodeException#responseBody field (#6853).
    • Add DataSpec.Builder and deprecate most DataSpec constructors.
    • Add DataSpec.customData to allow applications to pass custom data through DataSource chains.
    • Deprecate CacheDataSinkFactory and CacheDataSourceFactory, which are replaced by CacheDataSink.Factory and CacheDataSource.Factory respectively.
  • Analytics:
    • Extend EventTime with more details about the current player state (#7332).
    • Add AnalyticsListener.onVideoFrameProcessingOffset to report how early or late video frames are processed relative to them needing to be presented. Video frame processing offset fields are also added to DecoderCounters.
    • Fix incorrect MediaPeriodId for some renderer errors reported by AnalyticsListener.onPlayerError.
    • Remove onMediaPeriodCreated, onMediaPeriodReleased and onReadingStarted from AnalyticsListener.
  • Test utils: Add TestExoPlayer, a utility class with APIs to create SimpleExoPlayer instances with fake components for testing.
  • Media2 extension: This is a new extension that makes it easy to use ExoPlayer together with AndroidX Media2. Read this blog post to learn more.
  • Cast extension: Implement playlist API and deprecate the old queue manipulation API.
  • IMA extension:
    • Migrate to new 'friendly obstruction' IMA SDK APIs, and allow apps to register a purpose and detail reason for overlay views via AdsLoader.AdViewProvider.
    • Add support for audio-only ads display containers by returning null from AdsLoader.AdViewProvider.getAdViewGroup, and allow skipping audio-only ads via ImaAdsLoader.skipAd (#7689).
    • Add ImaAdsLoader.Builder.setCompanionAdSlots so it's possible to set companion ad slots without accessing the AdDisplayContainer.
    • Add missing notification of VideoAdPlayerCallback.onLoaded.
    • Fix handling of incompatible VPAID ads (#7832).
    • Fix handling of empty ads at non-integer cue points (#7889).
  • Demo app:
    • Replace the extensions variant with decoderExtensions and update the demo app use the Cronet and IMA extensions by default.
    • Expand the exolist.json schema, as well the structure of intents that can be used to launch PlayerActivity. See the Demo application page for the latest versions. Changes include:
      • Add drm_session_for_clear_content to allow attaching DRM sessions to clear audio and video tracks.
      • Add clip_start_position_ms and clip_end_position_ms to allow clipped samples.
    • Use StyledPlayerControlView rather than PlayerView.
    • Remove support for media tunneling, random ABR and playback of spherical video. Developers wishing to experiment with these features can enable them by modifying the demo app source code.
    • Add support for downloading DRM-protected content using offline Widevine licenses.

2.11.8 (2020-08-25)

  • Fix distorted playback of floating point audio when samples exceed the [-1, 1] nominal range.
  • MP4:
    • Add support for piff and isml brands (#7584).
    • Fix playback of very short MP4 files.
  • FMP4:
    • Fix saiz and senc sample count checks, resolving a "length mismatch" ParserException when playing certain protected FMP4 streams (#7592).
    • Fix handling of traf boxes containing multiple sbgp or sgpd boxes.
  • FLV: Ignore SCRIPTDATA segments with invalid name types, rather than failing playback (#7675).
  • Better infer the content type of .ism and .isml streaming URLs.
  • Workaround an issue on Broadcom based devices where playbacks would not transition to STATE_ENDED when using video tunneling mode (#7647).
  • IMA extension: Upgrade to IMA SDK 3.19.4, bringing in a fix for setting the media load timeout (#7170).
  • Demo app: Fix playback of ClearKey protected content on API level 26 and earlier (#7735).

2.11.7 (2020-06-29)

  • IMA extension: Fix the way postroll "content complete" notifications are handled to avoid repeatedly refreshing the timeline after playback ends.

2.11.6 (2020-06-19)

  • UI: Prevent PlayerView from temporarily hiding the video surface when seeking to an unprepared period within the current window. For example when seeking over an ad group, or to the next period in a multi-period DASH stream (#5507).
  • IMA extension:
    • Add option to skip ads before the start position.
    • Catch unexpected errors in stopAd to avoid a crash (#7492).
    • Fix a bug that caused playback to be stuck buffering on resuming from the background after all ads had played to the end (#7508).
    • Fix a bug where the number of ads in an ad group couldn't change (#7477).
    • Work around unexpected pauseAd/stopAd for ads that have preloaded on seeking to another position (#7492).
    • Fix incorrect rounding of ad cue points.
    • Fix handling of postrolls preloading (#7518).

2.11.5 (2020-06-05)

  • Improve the smoothness of video playback immediately after starting, seeking or resuming a playback (#6901).
  • Add SilenceMediaSource.Factory to support tags.
  • Enable the configuration of SilenceSkippingAudioProcessor (#6705).
  • Fix bug where PlayerMessages throw an exception after MediaSources are removed from the playlist (#7278).
  • Fix "Not allowed to start service" IllegalStateException in DownloadService (#7306).
  • Fix issue in AudioTrackPositionTracker that could cause negative positions to be reported at the start of playback and immediately after seeking (#7456).
  • Fix further cases where downloads would sometimes not resume after their network requirements are met (#7453).
  • DASH:
    • Merge trick play adaptation sets (i.e., adaptation sets marked with http://dashif.org/guidelines/trickmode) into the same TrackGroup as the main adaptation sets to which they refer. Trick play tracks are marked with the C.ROLE_FLAG_TRICK_PLAY flag.
    • Fix assertion failure in SampleQueue when playing DASH streams with EMSG tracks (#7273).
  • MP4: Store the Android capture frame rate only in Format.metadata. Format.frameRate now stores the calculated frame rate.
  • FMP4: Avoid throwing an exception while parsing default sample values whose most significant bits are set (#7207).
  • MP3: Fix issue parsing the XING headers belonging to files larger than 2GB (#7337).
  • MPEG-TS: Fix issue where SEI NAL units were incorrectly dropped from H.265 samples (#7113).
  • UI:
    • Fix DefaultTimeBar to respect touch transformations (#7303).
    • Add showScrubber and hideScrubber methods to DefaultTimeBar.
  • Text:
    • Use anti-aliasing and bitmap filtering when displaying bitmap subtitles.
    • Fix SubtitlePainter to render EDGE_TYPE_OUTLINE using the correct color.
  • IMA extension:
    • Upgrade to IMA SDK version 3.19.0, and migrate to new preloading APIs (#6429). This fixes several issues involving preloading and handling of ad loading error cases: (#4140, #5006, #6030, #6097, #6425, #6967, #7041, #7161, #7212, #7340).
    • Add support for timing out ad preloading, to avoid playback getting stuck if an ad group unexpectedly fails to load (#5444, #5966, #7002).
    • Fix AdsMediaSource child MediaSources not being released.
  • Cronet extension: Default to using the Cronet implementation in Google Play Services rather than Cronet Embedded. This allows Cronet to be used with a negligible increase in application size, compared to approximately 8MB when embedding the library.
  • OkHttp extension: Upgrade OkHttp dependency to 3.12.11.
  • MediaSession extension:
    • Only set the playback state to BUFFERING if playWhenReady is true (#7206).
    • Add missing @Nullable annotations to MediaSessionConnector (#7234).
  • AV1 extension: Add a heuristic to determine the default number of threads used for AV1 playback using the extension.

2.11.4 (2020-04-08)

  • Add SimpleExoPlayer.setWakeMode to allow automatic WifiLock and WakeLock handling (#6914). To use this feature, you must add the WAKE_LOCK permission to your application's manifest file.
  • Text:
    • Catch and log exceptions in TextRenderer rather than re-throwing. This allows playback to continue even if subtitle decoding fails (#6885).
    • Allow missing hours and milliseconds in SubRip (.srt) timecodes (#7122).
  • Audio:
    • Enable playback speed adjustment and silence skipping for floating point PCM audio, via resampling to 16-bit integer PCM. To output the original floating point audio without adjustment, pass enableFloatOutput=true to the DefaultAudioSink constructor (#7134).
    • Workaround issue that could cause slower than realtime playback of AAC on Android 10 (#6671).
    • Fix case where another app spuriously holding transient audio focus could prevent ExoPlayer from acquiring audio focus for an indefinite period of time (#7182).
    • Fix case where the player volume could be permanently ducked if audio focus was released whilst ducking.
    • Fix playback of WAV files with trailing non-media bytes (#7129).
    • Fix playback of ADTS files with mid-stream ID3 metadata.
  • DRM:
    • Fix stuck ad playbacks with DRM protected content (#7188).
    • Fix playback of Widevine protected content that only provides V1 PSSH atoms on API levels 21 and 22.
    • Fix playback of PlayReady content on Fire TV Stick (Gen 2).
  • DASH:
    • Update the manifest URI to avoid repeated HTTP redirects (#6907).
    • Parse period AssetIdentifier elements.
  • HLS: Recognize IMSC subtitles (#7185).
  • UI: Add an option to set whether to use the orientation sensor for rotation in spherical playbacks (#6761).
  • Analytics: Fix PlaybackStatsListener behavior when not keeping history (#7160).
  • FFmpeg extension: Add support for x86_64 architecture.
  • Opus extension: Fix parsing of negative gain values (#7046).
  • Cast extension: Upgrade play-services-cast-framework dependency to 18.1.0. This fixes an issue where RemoteServiceException was thrown due to Context.startForegroundService() not calling Service.startForeground() (#7191).

2.11.3 (2020-02-19)

  • SmoothStreaming: Fix regression that broke playback in 2.11.2 (#6981).
  • DRM: Fix issue switching from protected content that uses a 16-byte initialization vector to one that uses an 8-byte initialization vector (#6982).

2.11.2 (2020-02-13)

  • Add Java FLAC extractor (#6406).
  • Startup latency optimization:
    • Reduce startup latency for DASH and SmoothStreaming playbacks by allowing codec initialization to occur before the network connection for the first media segment has been established.
    • Reduce startup latency for on-demand DASH playbacks by allowing codec initialization to occur before the sidx box has been loaded.
  • Downloads:
    • Fix download resumption when the requirements for them to continue are met (#6733, #6798).
    • Fix DownloadHelper.createMediaSource to use customCacheKey when creating ProgressiveMediaSource instances.
  • DRM: Fix NullPointerException when playing DRM protected content (#6951).
  • Metadata:
    • Update IcyDecoder to try ISO-8859-1 decoding if UTF-8 decoding fails. Also change IcyInfo.rawMetadata from String to byte[] to allow developers to handle data that's neither UTF-8 nor ISO-8859-1 (#6753).
    • Select multiple metadata tracks if multiple metadata renderers are available (#6676).
    • Add support for ID3 genres added in Wimamp 5.6 (2010).
  • UI:
    • Show ad group markers in DefaultTimeBar even if they are after the end of the current window (#6552).
    • Don't use notification chronometer if playback speed is != 1.0 (#6816).
  • HLS: Fix playback of DRM protected content that uses key rotation (#6903).
  • WAV:
    • Support IMA ADPCM encoded data.
    • Improve support for G.711 A-law and mu-law encoded data.
  • MP4: Support "twos" codec (big endian PCM) (#5789).
  • FMP4: Add support for encrypted AC-4 tracks.
  • HLS: Fix slow seeking into long MP3 segments (#6155).
  • Fix handling of E-AC-3 streams that contain AC-3 syncframes (#6602).
  • Fix playback of TrueHD streams in Matroska (#6845).
  • Fix MKV subtitles to disappear when intended instead of lasting until the next cue (#6833).
  • OkHttp extension: Upgrade OkHttp dependency to 3.12.8, which fixes a class of SocketTimeoutException issues when using HTTP/2 (#4078).
  • FLAC extension: Fix handling of bit depths other than 16 in FLACDecoder. This issue caused FLAC streams with other bit depths to sound like white noise on earlier releases, but only when embedded in a non-FLAC container such as Matroska or MP4.
  • Demo apps: Add GL demo app to show how to render video to a GLSurfaceView while applying a GL shader. (#6920).

2.11.1 (2019-12-20)

  • UI: Exclude DefaultTimeBar region from system gesture detection (#6685).
  • ProGuard fixes:
    • Ensure Libgav1VideoRenderer constructor is kept for use by DefaultRenderersFactory (#6773).
    • Ensure VideoDecoderOutputBuffer and its members are kept for use by video decoder extensions.
    • Ensure raw resources used with RawResourceDataSource are kept.
    • Suppress spurious warnings about the javax.annotation package, and restructure use of IntDef annotations to remove spurious warnings about SsaStyle$SsaAlignment (#6771).
  • Fix CacheDataSource to correctly propagate DataSpec.httpRequestHeaders.
  • Fix issue with DefaultDownloadIndex that could result in an IllegalStateException being thrown from DefaultDownloadIndex.getDownloadForCurrentRow (#6785).
  • Fix IndexOutOfBoundsException in SinglePeriodTimeline.getWindow (#6776).
  • Add missing @Nullable to MediaCodecAudioRenderer.getMediaClock and SimpleDecoderAudioRenderer.getMediaClock (#6792).

2.11.0 (2019-12-11)

  • Core library:
    • Replace ExoPlayerFactory by SimpleExoPlayer.Builder and ExoPlayer.Builder.
    • Add automatic WakeLock handling to SimpleExoPlayer, which can be enabled by calling SimpleExoPlayer.setHandleWakeLock (#5846). To use this feature, you must add the WAKE_LOCK permission to your application's manifest file.
    • Add automatic "audio becoming noisy" handling to SimpleExoPlayer, which can be enabled by calling SimpleExoPlayer.setHandleAudioBecomingNoisy.
    • Wrap decoder exceptions in a new DecoderException class and report them as renderer errors.
    • Add Timeline.Window.isLive to indicate that a window is a live stream (#2668 and #5973).
    • Add Timeline.Window.uid to uniquely identify window instances.
    • Deprecate setTag parameter of Timeline.getWindow. Tags will always be set.
    • Deprecate passing the manifest directly to Player.EventListener.onTimelineChanged. It can be accessed through Timeline.Window.manifest or Player.getCurrentManifest()
    • Add MediaSource.enable and MediaSource.disable to improve resource management in playlists.
    • Add MediaPeriod.isLoading to improve Player.isLoading state.
    • Fix issue where player errors are thrown too early at playlist transitions (#5407).
    • Add Format and renderer support flags to renderer ExoPlaybackExceptions.
    • Where there are multiple platform decoders for a given MIME type, prefer to use one that advertises support for the profile and level of the media being played over one that does not, even if it does not come first in the MediaCodecList.
  • DRM:
    • Inject DrmSessionManager into the MediaSources instead of Renderers. This allows each MediaSource in a ConcatenatingMediaSource to use a different DrmSessionManager (#5619).
    • Add DefaultDrmSessionManager.Builder, and remove DefaultDrmSessionManager static factory methods that leaked ExoMediaDrm instances (#4721).
    • Add support for the use of secure decoders when playing clear content (#4867). This can be enabled using DefaultDrmSessionManager.Builder's setUseDrmSessionsForClearContent method.
    • Add support for custom LoadErrorHandlingPolicies in key and provisioning requests (#6334). Custom policies can be passed via DefaultDrmSessionManager.Builder's setLoadErrorHandlingPolicy method.
    • Use ExoMediaDrm.Provider in OfflineLicenseHelper to avoid leaking ExoMediaDrm instances (#4721).
  • Track selection:
    • Update DefaultTrackSelector to set a viewport constraint for the default display by default.
    • Update DefaultTrackSelector to set text language and role flag constraints for the device's accessibility settings by default (#5749).
    • Add option to set preferred text role flags using DefaultTrackSelector.ParametersBuilder.setPreferredTextRoleFlags.
  • LoadControl:
    • Default prioritizeTimeOverSizeThresholds to false to prevent OOM errors (#6647).
  • Android 10:
    • Set compileSdkVersion to 29 to enable use of Android 10 APIs.
    • Expose new isHardwareAccelerated, isSoftwareOnly and isVendor flags in MediaCodecInfo (#5839).
    • Add allowedCapturePolicy field to AudioAttributes to allow to configuration of the audio capture policy.
  • Video:
    • Pass the codec output MediaFormat to VideoFrameMetadataListener.
    • Fix byte order of HDR10+ static metadata to match CTA-861.3.
    • Support out-of-band HDR10+ dynamic metadata for VP9 in WebM/Matroska.
    • Assume that protected content requires a secure decoder when evaluating whether MediaCodecVideoRenderer supports a given video format (#5568).
    • Fix Dolby Vision fallback to AVC and HEVC.
    • Fix early end-of-stream detection when using video tunneling, on API level 23 and above.
    • Fix an issue where a keyframe was rendered rather than skipped when performing an exact seek to a non-zero position close to the start of the stream.
  • Audio:
    • Fix the start of audio getting truncated when transitioning to a new item in a playlist of Opus streams.
    • Workaround broken raw audio decoding on Oppo R9 (#5782).
    • Reconfigure audio sink when PCM encoding changes (#6601).
    • Allow AdtsExtractor to encounter EOF when calculating average frame size (#6700).
  • Text:
    • Add support for position and overlapping start/end times in SSA/ASS subtitles (#6320).
    • Require an end time or duration for SubRip (SRT) and SubStation Alpha (SSA/ASS) subtitles. This applies to both sidecar files & subtitles embedded in Matroska streams.
  • UI:
    • Make showing and hiding player controls accessible to TalkBack in PlayerView.
    • Rename spherical_view surface type to spherical_gl_surface_view.
    • Make it easier to override the shuffle, repeat, fullscreen, VR and small notification icon assets (#6709).
  • Analytics:
    • Remove AnalyticsCollector.Factory. Instances should be created directly, and the Player should be set by calling AnalyticsCollector.setPlayer.
    • Add PlaybackStatsListener to collect PlaybackStats for analysis and analytics reporting.
  • DataSource
    • Add DataSpec.httpRequestHeaders to support setting per-request headers for HTTP and HTTPS.
    • Remove the DataSpec.FLAG_ALLOW_ICY_METADATA flag. Use is replaced by setting the IcyHeaders.REQUEST_HEADER_ENABLE_METADATA_NAME header in DataSpec.httpRequestHeaders.
    • Fail more explicitly when local file URIs contain invalid parts (e.g. a fragment) (#6470).
  • DASH: Support negative @r values in segment timelines (#1787).
  • HLS:
    • Use peak bitrate rather than average bitrate for adaptive track selection.
    • Fix issue where streams could get stuck in an infinite buffering state after a postroll ad (#6314).
  • Matroska: Support lacing in Blocks (#3026).
  • AV1 extension:
    • New in this release. The AV1 extension allows use of the libgav1 software decoder in ExoPlayer. You can read more about playing AV1 videos with ExoPlayer here.
  • VP9 extension:
    • Update to use NDK r20.
    • Rename VpxVideoSurfaceView to VideoDecoderSurfaceView and move it to the core library.
    • Move LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER to C.MSG_SET_OUTPUT_BUFFER_RENDERER.
    • Use VideoDecoderRenderer as an implementation of VideoDecoderOutputBufferRenderer, instead of VideoDecoderSurfaceView.
  • FLAC extension: Update to use NDK r20.
  • Opus extension: Update to use NDK r20.
  • FFmpeg extension:
    • Update to use NDK r20.
    • Update to use FFmpeg version 4.2. It is necessary to rebuild the native part of the extension after this change, following the instructions in the extension's readme.
  • MediaSession extension: Add MediaSessionConnector.setCaptionCallback to support ACTION_SET_CAPTIONING_ENABLED events.
  • GVR extension: This extension is now deprecated.
  • Demo apps:
  • TestUtils: Publish the testutils module to simplify unit testing with ExoPlayer (#6267).
  • IMA extension: Remove AdsManager listeners on release to avoid leaking an AdEventListener provided by the app (#6687).

2.10.8 (2019-11-19)

  • E-AC3 JOC
    • Handle new signaling in DASH manifests (#6636).
    • Fix E-AC3 JOC passthrough playback failing to initialize due to incorrect channel count check.
  • FLAC
    • Fix sniffing for some FLAC streams.
    • Fix FLAC Format.bitrate values.
  • Parse ALAC channel count and sample rate information from a more robust source when contained in MP4 (#6648).
  • Fix seeking into multi-period content in the edge case that the period containing the seek position has just been removed (#6641).

2.10.7 (2019-11-06)

  • HLS: Fix detection of Dolby Atmos to match the HLS authoring specification.
  • MediaSession extension: Update shuffle and repeat modes when playback state is invalidated (#6582).
  • Fix the start of audio getting truncated when transitioning to a new item in a playlist of Opus streams.

2.10.6 (2019-10-17)

  • Add Player.onPlaybackSuppressionReasonChanged to allow listeners to detect playbacks suppressions (e.g. transient audio focus loss) directly (#6203).
  • DASH:
    • Support Label elements (#6297).
    • Support legacy audio channel configuration (#6523).
  • HLS: Add support for ID3 in EMSG when using FMP4 streams (spec).
  • MP3: Add workaround to avoid prematurely ending playback of some SHOUTcast live streams (#6537, #6315 and #5658).
  • Metadata: Expose the raw ICY metadata through IcyInfo (#6476).
  • UI:
    • Setting app:played_color on PlayerView and PlayerControlView no longer adjusts the colors of the scrubber handle , buffered and unplayed parts of the time bar. These can be set separately using app:scrubber_color, app:buffered_color and app_unplayed_color respectively.
    • Setting app:ad_marker_color on PlayerView and PlayerControlView no longer adjusts the color of played ad markers. The color of played ad markers can be set separately using app:played_ad_marker_color.

2.10.5 (2019-09-20)

  • Add Player.isPlaying and EventListener.onIsPlayingChanged to check whether the playback position is advancing. This helps to determine if playback is suppressed due to audio focus loss. Also add Player.getPlaybackSuppressedReason to determine the reason of the suppression (#6203).
  • Track selection
    • Add allowAudioMixedChannelCountAdaptiveness parameter to DefaultTrackSelector to allow adaptive selections of audio tracks with different channel counts.
    • Improve text selection logic to always prefer the better language matches over other selection parameters.
    • Fix audio selection issue where languages are compared by bitrate (#6335).
  • Performance
    • Increase maximum video buffer size from 13MB to 32MB. The previous default was too small for high quality streams.
    • Reset DefaultBandwidthMeter to initial values on network change.
    • Bypass sniffing in ProgressiveMediaPeriod in case a single extractor is provided (#6325).
  • Metadata
    • Support EMSG V1 boxes in FMP4.
    • Support unwrapping of nested metadata (e.g. ID3 and SCTE-35 in EMSG).
  • Add HttpDataSource.getResponseCode to provide the status code associated with the most recent HTTP response.
  • Fix transitions between packed audio and non-packed audio segments in HLS (#6444).
  • Fix issue where a request would be retried after encountering an error, even though the LoadErrorHandlingPolicy classified the error as fatal.
  • Fix initialization data handling for FLAC in MP4 (#6396, #6397).
  • Fix decoder selection for E-AC3 JOC streams (#6398).
  • Fix PlayerNotificationManager to show play icon rather than pause icon when playback is ended (#6324).
  • RTMP extension: Upgrade LibRtmp-Client-for-Android to fix RTMP playback issues (#4200, #4249, #4319, #4337).
  • IMA extension: Fix crash in ImaAdsLoader.onTimelineChanged (#5831).

2.10.4 (2019-07-26)

  • Offline: Add Scheduler implementation that uses WorkManager.
  • Add ability to specify a description when creating notification channels via ExoPlayer library classes.
  • Switch normalized BCP-47 language codes to use 2-letter ISO 639-1 language tags instead of 3-letter ISO 639-2 language tags.
  • Ensure the SilenceMediaSource position is in range (#6229).
  • WAV: Calculate correct duration for clipped streams (#6241).
  • MP3: Use CBR header bitrate, not calculated bitrate. This reverts a change from 2.9.3 (#6238).
  • FLAC extension: Parse VORBIS_COMMENT and PICTURE metadata (#5527).
  • Fix issue where initial seek positions get ignored when playing a preroll ad (#6201).
  • Fix issue where invalid language tags were normalized to "und" instead of keeping the original (#6153).
  • Fix DataSchemeDataSource re-opening and range requests (#6192).
  • Fix FLAC and ALAC playback on some LG devices (#5938).
  • Fix issue when calling performClick on PlayerView without PlayerControlView (#6260).
  • Fix issue where playback speeds are not used in adaptive track selections after manual selection changes for other renderers (#6256).

2.10.3 (2019-07-09)

  • Display last frame when seeking to end of stream (#2568).
  • Audio:
    • Fix an issue where not all audio was played out when the configuration for the underlying track was changing (e.g., at some period transitions).
    • Fix an issue where playback speed was applied inaccurately in playlists (#6117).
  • UI: Fix PlayerView incorrectly consuming touch events if no controller is attached (#6109).
  • CEA608: Fix repetition of special North American characters (#6133).
  • FLV: Fix bug that caused playback of some live streams to not start (#6111).
  • SmoothStreaming: Parse text stream Subtype into Format.roleFlags.
  • MediaSession extension: Fix MediaSessionConnector.play() not resuming playback (#6093).

2.10.2 (2019-06-03)

  • Add ResolvingDataSource for just-in-time resolution of DataSpecs (#5779).
  • Add SilenceMediaSource that can be used to play silence of a given duration (#5735).
  • Offline:
    • Prevent unexpected DownloadHelper.Callback.onPrepared callbacks after preparation of a DownloadHelper fails (#5915).
    • Fix CacheUtil.cache() downloading too much data (#5927).
    • Fix misreporting cached bytes when caching is paused (#5573).
  • UI:
    • Allow setting DefaultTimeBar attributes on PlayerView and PlayerControlView.
    • Change playback controls toggle from touch down to touch up events (#5784).
    • Fix issue where playback controls were not kept visible on key presses (#5963).
  • Subtitles:
    • CEA-608: Handle XDS and TEXT modes (#5807).
    • TTML: Fix bitmap rendering (#5633).
  • IMA: Fix ad pod index offset calculation without preroll (#5928).
  • Add a playWhenReady flag to MediaSessionConnector.PlaybackPreparer methods to indicate whether a controller sent a play or only a prepare command. This allows to take advantage of decoder reuse with the MediaSessionConnector (#5891).
  • Add ProgressUpdateListener to PlayerControlView (#5834).
  • Add support for auto-detecting UDP streams in DefaultDataSource (#6036).
  • Allow enabling decoder fallback with DefaultRenderersFactory (#5942).
  • Gracefully handle revoked ACCESS_NETWORK_STATE permission (#6019).
  • Fix decoding problems when seeking back after seeking beyond a mid-roll ad (#6009).
  • Fix application of maxAudioBitrate for adaptive audio track groups (#6006).
  • Fix bug caused by parallel adaptive track selection using Formats without bitrate information (#5971).
  • Fix bug in CastPlayer.getCurrentWindowIndex() (#5955).

2.10.1 (2019-05-16)

  • Offline: Add option to remove all downloads.
  • HLS: Fix NullPointerException when using HLS chunkless preparation (#5868).
  • Fix handling of empty values and line terminators in SHOUTcast ICY metadata (#5876).
  • Fix DVB subtitles for SDK 28 (#5862).
  • Add a workaround for a decoder failure on ZTE Axon7 mini devices when playing 48kHz audio (#5821).

2.10.0 (2019-04-15)

  • Core library:
    • Improve decoder re-use between playbacks (#2826). Read this blog post for more details.
    • Rename ExtractorMediaSource to ProgressiveMediaSource.
    • Fix issue where using ProgressiveMediaSource.Factory would mean that DefaultExtractorsFactory would be kept by proguard. Custom ExtractorsFactory instances must now be passed via the ProgressiveMediaSource.Factory constructor, and setExtractorsFactory is deprecated.
    • Make the default minimum buffer size equal the maximum buffer size for video playbacks (#2083).
    • Move PriorityTaskManager from DefaultLoadControl to SimpleExoPlayer.
    • Add new ExoPlaybackException types for remote exceptions and out-of-memory errors.
    • Use full BCP 47 language tags in Format.
    • Do not retry failed loads whose error is FileNotFoundException.
    • Fix issue where not resetting the position for a new MediaSource in calls to ExoPlayer.prepare causes an IndexOutOfBoundsException (#5520).
  • Offline:
    • Improve offline support. DownloadManager now tracks all offline content, not just tasks in progress. Read this page for more details.
  • Caching:
    • Improve performance of SimpleCache (#4253).
    • Cache data with unknown length by default. The previous flag to opt in to this behavior (DataSpec.FLAG_ALLOW_CACHING_UNKNOWN_LENGTH) has been replaced with an opt out flag (DataSpec.FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN).
  • Extractors:
    • MP4/FMP4: Add support for Dolby Vision.
    • MP4: Fix issue handling meta atoms in some streams (#5698, #5694).
    • MP3: Add support for SHOUTcast ICY metadata (#3735).
    • MP3: Fix ID3 frame unsychronization (#5673).
    • MP3: Fix playback of badly clipped files (#5772).
    • MPEG-TS: Enable HDMV DTS stream detection only if a flag is set. By default (i.e. if the flag is not set), the 0x82 elementary stream type is now treated as an SCTE subtitle track (#5330).
  • Track selection:
    • Add options for controlling audio track selections to DefaultTrackSelector (#3314).
    • Update TrackSelection.Factory interface to support creating all track selections together.
    • Allow to specify a selection reason for a SelectionOverride.
    • Select audio track based on system language if no preference is provided.
    • When no text language preference matches, only select forced text tracks whose language matches the selected audio language.
  • UI:
    • Update DefaultTimeBar based on duration of media and add parameter to set the minimum update interval to control the smoothness of the updates (#5040).
    • Move creation of dialogs for TrackSelectionViews to TrackSelectionDialogBuilder and add option to select multiple overrides.
    • Change signature of PlayerNotificationManager.NotificationListener to better fit service requirements.
    • Add option to include navigation actions in the compact mode of notifications created using PlayerNotificationManager.
    • Fix issues with flickering notifications on KitKat when using PlayerNotificationManager and DownloadNotificationUtil. For the latter, applications should switch to using DownloadNotificationHelper.
    • Fix accuracy of D-pad seeking in DefaultTimeBar (#5767).
  • Audio:
    • Allow AudioProcessors to be drained of pending output after they are reconfigured.
    • Fix an issue that caused audio to be truncated at the end of a period when switching to a new period where gapless playback information was newly present or newly absent.
    • Add support for reading AC-4 streams (#5303).
  • Video:
    • Remove MediaCodecSelector.DEFAULT_WITH_FALLBACK. Apps should instead signal that fallback should be used by passing true as the enableDecoderFallback parameter when instantiating the video renderer.
    • Support video tunneling when the decoder is not listed first for the MIME type (#3100).
    • Query MediaCodecList.ALL_CODECS when selecting a tunneling decoder (#5547).
  • DRM:
    • Fix black flicker when keys rotate in DRM protected content (#3561).
    • Work around lack of LA_URL attribute in PlayReady key request init data.
  • CEA-608: Improved conformance to the specification (#3860).
  • DASH:
    • Parse role and accessibility descriptors into Format.roleFlags.
    • Support multiple CEA-608 channels muxed into FMP4 representations (#5656).
  • HLS:
    • Prevent unnecessary reloads of initialization segments.
    • Form an adaptive track group out of audio renditions with matching name.
    • Support encrypted initialization segments (#5441).
    • Parse EXT-X-MEDIA CHARACTERISTICS attribute into Format.roleFlags.
    • Add metadata entry for HLS tracks to expose master playlist information.
    • Prevent IndexOutOfBoundsException in some live HLS scenarios (#5816).
  • Support for playing spherical videos on Daydream.
  • Cast extension: Work around Cast framework returning a limited-size queue items list (#4964).
  • VP9 extension: Remove RGB output mode and libyuv dependency, and switch to surface YUV output as the default. Remove constructor parameters scaleToFit and useSurfaceYuvOutput.
  • MediaSession extension:
    • Let apps intercept media button events (#5179).
    • Fix issue with TimelineQueueNavigator not publishing the queue in shuffled order when in shuffle mode.
    • Allow handling of custom commands via registerCustomCommandReceiver.
    • Add ability to include an extras Bundle when reporting a custom error.
  • Log warnings when extension native libraries can't be used, to help with diagnosing playback failures (#5788).

2.9.6 (2019-02-19)

  • Remove player and isTopLevelSource parameters from MediaSource.prepare.
  • IMA extension:
    • Require setting the Player on AdsLoader instances before playback.
    • Remove deprecated ImaAdsMediaSource. Create AdsMediaSource with an ImaAdsLoader instead.
    • Remove deprecated AdsMediaSource constructors. Listen for media source events using AdsMediaSource.addEventListener, and ad interaction events by adding a listener when building ImaAdsLoader.
    • Allow apps to register playback-related obstructing views that are on top of their ad display containers via AdsLoader.AdViewProvider. PlayerView implements this interface and will register its control view. This makes it possible for ad loading SDKs to calculate ad viewability accurately.
  • DASH: Fix issue handling large EventStream presentation timestamps (#5490).
  • HLS: Fix transition to STATE_ENDED when playing fragmented mp4 in chunkless preparation (#5524).
  • Revert workaround for video quality problems with Amlogic decoders, as this may cause problems for some devices and/or non-interlaced content (#5003).

2.9.5 (2019-01-31)

  • HLS: Parse CHANNELS attribute from EXT-X-MEDIA tag.
  • ConcatenatingMediaSource:
    • Add Handler parameter to methods that take a callback Runnable.
    • Fix issue with dropped messages when releasing the source (#5464).
  • ExtractorMediaSource: Fix issue that could cause the player to get stuck buffering at the end of the media.
  • PlayerView: Fix issue preventing OnClickListener from receiving events (#5433).
  • IMA extension: Upgrade IMA dependency to 3.10.6.
  • Cronet extension: Upgrade Cronet dependency to 71.3578.98.
  • OkHttp extension: Upgrade OkHttp dependency to 3.12.1.
  • MP3: Wider fix for issue where streams would play twice on some Samsung devices (#4519).

2.9.4 (2019-01-15)

  • IMA extension: Clear ads loader listeners on release (#4114).
  • SmoothStreaming: Fix support for subtitles in DRM protected streams (#5378).
  • FFmpeg extension: Treat invalid data errors as non-fatal to match the behavior of MediaCodec (#5293).
  • GVR extension: upgrade GVR SDK dependency to 1.190.0.
  • Associate fatal player errors of type SOURCE with the loading source in AnalyticsListener.EventTime (#5407).
  • Add startPositionUs to MediaSource.createPeriod. This fixes an issue where using lazy preparation in ConcatenatingMediaSource with an ExtractorMediaSource overrides initial seek positions (#5350).
  • Add subtext to the MediaDescriptionAdapter of the PlayerNotificationManager.
  • Add workaround for video quality problems with Amlogic decoders (#5003).
  • Fix issue where sending callbacks for playlist changes may cause problems because of parallel player access (#5240).
  • Fix issue with reusing a ClippingMediaSource with an inner ExtractorMediaSource and a non-zero start position (#5351).
  • Fix issue where uneven track durations in MP4 streams can cause OOM problems (#3670).

2.9.3 (2018-12-20)

  • Captions: Support PNG subtitles in SMPTE-TT (#1583).
  • MPEG-TS: Use random access indicators to minimize the need for FLAG_ALLOW_NON_IDR_KEYFRAMES.
  • Downloading: Reduce time taken to remove downloads (#5136).
  • MP3:
    • Use the true bitrate for constant-bitrate MP3 seeking.
    • Fix issue where streams would play twice on some Samsung devices (#4519).
  • Fix regression where some audio formats were incorrectly marked as being unplayable due to under-reporting of platform decoder capabilities (#5145).
  • Fix decode-only frame skipping on Nvidia Shield TV devices.
  • Workaround for MiTV (dangal) issue when swapping output surface (#5169).

2.9.2 (2018-11-28)

  • HLS:
    • Fix issue causing unnecessary media playlist requests when playing live streams (#5059).
    • Fix decoder re-instantiation issue for packed audio streams (#5063).
  • MP4: Support Opus and FLAC in the MP4 container, and in DASH (#4883).
  • DASH: Fix detecting the end of live events (#4780).
  • Spherical video: Fall back to TYPE_ROTATION_VECTOR if TYPE_GAME_ROTATION_VECTOR is unavailable (#5119).
  • Support seeking for a wider range of MPEG-TS streams (#5097).
  • Include channel count in audio capabilities check (#4690).
  • Fix issue with applying the show_buffering attribute in PlayerView (#5139).
  • Fix issue where null Metadata was output when it failed to decode (#5149).
  • Fix playback of some invalid but playable MP4 streams by replacing assertions with logged warnings in sample table parsing code (#5162).
  • Fix UUID passed to MediaCrypto when using C.CLEARKEY_UUID before API 27.

2.9.1 (2018-11-01)

  • Add convenience methods Player.next, Player.previous, Player.hasNext and Player.hasPrevious (#4863).
  • Improve initial bandwidth meter estimates using the current country and network type.
  • IMA extension:
    • For preroll to live stream transitions, project forward the loading position to avoid being behind the live window.
    • Let apps specify whether to focus the skip button on ATV (#5019).
  • MP3:
    • Support seeking based on MLLT metadata (#3241).
    • Fix handling of streams with appended data (#4954).
  • DASH: Parse ProgramInformation element if present in the manifest.
  • HLS:
    • Add constructor to DefaultHlsExtractorFactory for adding TS payload reader factory flags (#4861).
    • Fix bug in segment sniffing (#5039).
  • SubRip: Add support for alignment tags, and remove tags from the displayed captions (#4306).
  • Fix issue with blind seeking to windows with non-zero offset in a ConcatenatingMediaSource (#4873).
  • Fix logic for enabling next and previous actions in TimelineQueueNavigator (#5065).
  • Fix issue where audio focus handling could not be disabled after enabling it (#5055).
  • Fix issue where subtitles were positioned incorrectly if SubtitleView had a non-zero position offset to its parent (#4788).
  • Fix issue where the buffered position was not updated correctly when transitioning between periods (#4899).
  • Fix issue where a NullPointerException is thrown when removing an unprepared media source from a ConcatenatingMediaSource with the useLazyPreparation option enabled (#4986).
  • Work around an issue where a non-empty end-of-stream audio buffer would be output with timestamp zero, causing the player position to jump backwards (#5045).
  • Suppress a spurious assertion failure on some Samsung devices (#4532).
  • Suppress spurious "references unknown class member" shrinking warning (#4890).
  • Swap recommended order for google() and jcenter() in gradle config (#4997).

2.9.0 (2018-09-06)

  • Turn on Java 8 compiler support for the ExoPlayer library. Apps may need to add compileOptions { targetCompatibility JavaVersion.VERSION_1_8 } to their gradle settings to ensure bytecode compatibility.
  • Set compileSdkVersion and targetSdkVersion to 28.
  • Support for automatic audio focus handling via SimpleExoPlayer.setAudioAttributes.
  • Add ExoPlayer.retry convenience method.
  • Add AudioListener for listening to changes in audio configuration during playback (#3994).
  • Add LoadErrorHandlingPolicy to allow configuration of load error handling across MediaSource implementations (#3370).
  • Allow passing a Looper, which specifies the thread that must be used to access the player, when instantiating player instances using ExoPlayerFactory (#4278).
  • Allow setting log level for ExoPlayer logcat output (#4665).
  • Simplify BandwidthMeter injection: The BandwidthMeter should now be passed directly to ExoPlayerFactory, instead of to TrackSelection.Factory and DataSource.Factory. The BandwidthMeter is passed to the components that need it internally. The BandwidthMeter may also be omitted, in which case a default instance will be used.
  • Spherical video:
    • Support for spherical video by setting surface_type="spherical_view" on PlayerView.
    • Support for VR180.
  • HLS:
    • Support PlayReady.
    • Add container format sniffing (#2025).
    • Support alternative EXT-X-KEY tags.
    • Support EXT-X-INDEPENDENT-SEGMENTS in the master playlist.
    • Support variable substitution (#4422).
    • Fix the bitrate being unset on primary track sample formats (#3297).
    • Make HlsMediaSource.Factory take a factory of trackers instead of a tracker instance (#4814).
  • DASH:
    • Support messageData attribute for in-manifest event streams.
    • Clip periods to their specified durations (#4185).
  • Improve seeking support for progressive streams:
    • Support seeking in MPEG-TS (#966).
    • Support seeking in MPEG-PS (#4476).
    • Support approximate seeking in ADTS using a constant bitrate assumption (#4548). The FLAG_ENABLE_CONSTANT_BITRATE_SEEKING flag must be set on the extractor to enable this functionality.
    • Support approximate seeking in AMR using a constant bitrate assumption. The FLAG_ENABLE_CONSTANT_BITRATE_SEEKING flag must be set on the extractor to enable this functionality.
    • Add DefaultExtractorsFactory.setConstantBitrateSeekingEnabled to enable approximate seeking using a constant bitrate assumption on all extractors that support it.
  • Video:
    • Add callback to VideoListener to notify of surface size changes.
    • Improve performance when playing high frame-rate content, and when playing at greater than 1x speed (#2777).
    • Scale up the initial video decoder maximum input size so playlist transitions with small increases in maximum sample size do not require reinitialization (#4510).
    • Fix a bug where the player would not transition to the ended state when playing video in tunneled mode.
  • Audio:
    • Support attaching auxiliary audio effects to the AudioTrack via Player.setAuxEffectInfo and Player.clearAuxEffectInfo.
    • Support seamless adaptation while playing xHE-AAC streams. (#4360).
    • Increase AudioTrack buffer sizes to the theoretical maximum required for each encoding for passthrough playbacks (#3803).
    • WAV: Fix issue where white noise would be output at the end of playback (#4724).
    • MP3: Fix issue where streams would play twice on the SM-T530 (#4519).
  • Analytics:
    • Add callbacks to DefaultDrmSessionEventListener and AnalyticsListener to be notified of acquired and released DRM sessions.
    • Add uri field to LoadEventInfo in MediaSourceEventListener and AnalyticsListener callbacks. This uri is the redirected uri if redirection occurred (#2054).
    • Add response headers field to LoadEventInfo in MediaSourceEventListener and AnalyticsListener callbacks (#4361 and #4615).
  • UI:
    • Add option to PlayerView to show buffering view when playWhenReady is false (#4304).
    • Allow any Drawable to be used as PlayerView default artwork.
  • ConcatenatingMediaSource:
    • Support lazy preparation of playlist media sources (#3972).
    • Support range removal with removeMediaSourceRange methods (#4542).
    • Support setting a new shuffle order with setShuffleOrder (#4791).
  • MPEG-TS: Support CEA-608/708 in H262 (#2565).
  • Allow configuration of the back buffer in DefaultLoadControl.Builder (#4857).
  • Allow apps to pass a CacheKeyFactory for setting custom cache keys when creating a CacheDataSource.
  • Provide additional information for adaptive track selection. TrackSelection.updateSelectedTrack has two new parameters for the current queue of media chunks and iterators for information about upcoming chunks.
  • Allow MediaCodecSelectors to return multiple compatible decoders for MediaCodecRenderer, and provide an (optional) MediaCodecSelector that falls back to less preferred decoders like MediaCodec.createDecoderByType (#273).
  • Enable gzip for requests made by SingleSampleMediaSource (#4771).
  • Fix bug reporting buffered position for multi-period windows, and add convenience methods Player.getTotalBufferedDuration and Player.getContentBufferedDuration (#4023).
  • Fix bug where transitions to clipped media sources would happen too early (#4583).
  • Fix bugs reporting events for multi-period media sources (#4492 and #4634).
  • Fix issue where removing looping media from a playlist throws an exception (#4871).
  • Fix issue where the preferred audio or text track would not be selected if mapped onto a secondary renderer of the corresponding type (#4711).
  • Fix issue where errors of upcoming playlist items are thrown too early (#4661).
  • Allow edit lists which do not start with a sync sample. (#4774).
  • Fix issue with audio discontinuities at period transitions, e.g. when looping (#3829).
  • Fix issue where player.getCurrentTag() throws an IndexOutOfBoundsException (#4822).
  • Fix bug preventing use of multiple key session support (multiSession=true) for non-Widevine DefaultDrmSessionManager instances (#4834).
  • Fix issue where audio and video would desynchronize when playing concatenations of gapless content (#4559).
  • IMA extension:
    • Refine the previous fix for empty ad groups to avoid discarding ad breaks unnecessarily (#4030 and #4280).
    • Fix handling of empty postrolls (#4681).
    • Fix handling of postrolls with multiple ads (#4710).
  • MediaSession extension:
    • Add MediaSessionConnector.setCustomErrorMessage to support setting custom error messages.
    • Add MediaMetadataProvider to support setting custom metadata (#3497).
  • Cronet extension: Now distributed via jCenter.
  • FFmpeg extension: Support mu-law and A-law PCM.

2.8.4 (2018-08-17)

  • IMA extension: Improve handling of consecutive empty ad groups (#4030), (#4280).

2.8.3 (2018-07-23)

  • IMA extension:
    • Fix behavior when creating/releasing the player then releasing ImaAdsLoader (#3879).
    • Add support for setting slots for companion ads.
  • Captions:
    • TTML: Fix an issue with TTML using font size as % of cell resolution that makes SubtitleView.setApplyEmbeddedFontSizes() not work correctly. (#4491).
    • CEA-608: Improve handling of embedded styles (#4321).
  • DASH:
    • Exclude text streams from duration calculations (#4029).
    • Fix freezing when playing multi-period manifests with EventStreams (#4492).
  • DRM: Allow DrmInitData to carry a license server URL (#3393).
  • MPEG-TS: Fix bug preventing SCTE-35 cues from being output (#4573).
  • Expose all internal ID3 data stored in MP4 udta boxes, and switch from using CommentFrame to InternalFrame for frames with gapless metadata in MP4.
  • Add PlayerView.isControllerVisible (#4385).
  • Fix issue playing DRM protected streams on Asus Zenfone 2 (#4403).
  • Add support for multiple audio and video tracks in MPEG-PS streams (#4406).
  • Add workaround for track index mismatches between trex and tkhd boxes in fragmented MP4 files (#4477).
  • Add workaround for track index mismatches between tfhd and tkhd boxes in fragmented MP4 files (#4083).
  • Ignore all MP4 edit lists if one edit list couldn't be handled (#4348).
  • Fix issue when switching track selection from an embedded track to a primary track in DASH (#4477).
  • Fix accessibility class name for DefaultTimeBar (#4611).
  • Improved compatibility with FireOS devices.

2.8.2 (2018-06-06)

  • IMA extension: Don't advertise support for video/mpeg ad media, as we don't have an extractor for this (#4297).
  • DASH: Fix playback getting stuck when playing representations that have both sidx atoms and non-zero presentationTimeOffset values.
  • HLS:
    • Allow injection of custom playlist trackers.
    • Fix adaptation in live playlists with EXT-X-PROGRAM-DATE-TIME tags.
  • Mitigate memory leaks when MediaSource loads are slow to cancel (#4249).
  • Fix inconsistent Player.EventListener invocations for recursive player state changes (#4276).
  • Fix MediaCodec.native_setSurface crash on Moto C (#4315).
  • Fix missing whitespace in CEA-608 (#3906).
  • Fix crash downloading HLS media playlists (#4396).
  • Fix a bug where download cancellation was ignored (#4403).
  • Set METADATA_KEY_TITLE on media descriptions (#4292).
  • Allow apps to register custom MIME types (#4264).

2.8.1 (2018-05-22)

  • HLS:
    • Fix playback of livestreams with EXT-X-PROGRAM-DATE-TIME tags (#4239).
    • Fix playback of clipped streams starting from non-keyframe positions (#4241).
  • OkHttp extension: Fix to correctly include response headers in thrown InvalidResponseCodeExceptions.
  • Add possibility to cancel PlayerMessages.
  • UI:
    • Add PlayerView.setKeepContentOnPlayerReset to keep the currently displayed video frame or media artwork visible when the player is reset (#2843).
  • Fix crash when switching surface on Moto E(4) (#4134).
  • Fix a bug that could cause event listeners to be called with inconsistent information if an event listener interacted with the player (#4262).
  • Audio:
    • Fix extraction of PCM in MP4/MOV (#4228).
    • FLAC: Supports seeking for FLAC files without SEEKTABLE (#1808).
  • Captions:
    • TTML:
    • Fix a styling issue when there are multiple regions displayed at the same time that can make text size of each region much smaller than defined.
    • Fix an issue when the caption line has no text (empty line or only line break), and the line's background is still displayed.
    • Support TTML font size using % correctly (as percentage of document cell resolution).

2.8.0 (2018-05-03)

  • Downloading:
    • Add DownloadService, DownloadManager and related classes (#2643). Information on using these components to download progressive formats can be found here. To see how to download DASH, HLS and SmoothStreaming media, take a look at the app.
    • Updated main demo app to support downloading DASH, HLS, SmoothStreaming and progressive media.
  • MediaSources:
    • Allow reusing media sources after they have been released and also in parallel to allow adding them multiple times to a concatenation. (#3498).
    • Merged DynamicConcatenatingMediaSource into ConcatenatingMediaSource and deprecated DynamicConcatenatingMediaSource.
    • Allow clipping of child media sources where the period and window have a non-zero offset with ClippingMediaSource.
    • Allow adding and removing MediaSourceEventListeners to MediaSources after they have been created. Listening to events is now supported for all media sources including composite sources.
    • Added callbacks to MediaSourceEventListener to get notified when media periods are created, released and being read from.
    • Support live stream clipping with ClippingMediaSource.
    • Allow setting tags for all media sources in their factories. The tag of the current window can be retrieved with Player.getCurrentTag.
  • UI:
    • Add support for displaying error messages and a buffering spinner in PlayerView.
    • Add support for listening to AspectRatioFrameLayout's aspect ratio update (#3736).
    • Add PlayerNotificationManager for displaying notifications reflecting the player state.
    • Add TrackSelectionView for selecting tracks with DefaultTrackSelector.
    • Add TrackNameProvider for converting track Formats to textual descriptions, and DefaultTrackNameProvider as a default implementation.
  • Track selection:
    • Reworked MappingTrackSelector and DefaultTrackSelector.
    • DefaultTrackSelector.Parameters now implements Parcelable.
    • Added UI components for track selection (see above).
  • Audio:
    • Support extracting data from AMR container formats, including both narrow and wide band (#2527).
    • FLAC:
    • Sniff FLAC files correctly if they have ID3 headers (#4055).
    • Supports FLAC files with high sample rate (176400 and 192000) (#3769).
    • Factor out AudioTrack position tracking from DefaultAudioSink.
    • Fix an issue where the playback position would pause just after playback begins, and poll the audio timestamp less frequently once it starts advancing (#3841).
    • Add an option to skip silent audio in PlaybackParameters (#2635).
    • Fix an issue where playback of TrueHD streams would get stuck after seeking due to not finding a syncframe (#3845).
    • Fix an issue with eac3-joc playback where a codec would fail to configure (#4165).
    • Handle non-empty end-of-stream buffers, to fix gapless playback of streams with encoder padding when the decoder returns a non-empty final buffer.
    • Allow trimming more than one sample when applying an elst audio edit via gapless playback info.
    • Allow overriding skipping/scaling with custom AudioProcessors (#3142).
  • Caching:
    • Add release method to the Cache interface, and prevent multiple instances of SimpleCache using the same folder at the same time.
    • Cache redirect URLs (#2360).
  • DRM:
    • Allow multiple listeners for DefaultDrmSessionManager.
    • Pass DrmSessionManager to ExoPlayerFactory instead of RendererFactory.
    • Change minimum API requirement for CBC and pattern encryption from 24 to 25 (#4022).
    • Fix handling of 307/308 redirects when making license requests (#4108).
  • HLS:
    • Fix playlist loading error propagation when the current selection does not include all of the playlist's variants.
    • Fix SAMPLE-AES-CENC and SAMPLE-AES-CTR EXT-X-KEY methods (#4145).
    • Preeptively declare an ID3 track in chunkless preparation (#4016).
    • Add support for multiple #EXT-X-MAP tags in a media playlist (#4164).
    • Fix seeking in live streams (#4187).
  • IMA extension:
    • Allow setting the ad media load timeout (#3691).
    • Expose ad load errors via MediaSourceEventListener on AdsMediaSource, and allow setting an ad event listener on ImaAdsLoader. Deprecate the AdsMediaSource.EventListener.
  • Add AnalyticsListener interface which can be registered in SimpleExoPlayer to receive detailed metadata for each ExoPlayer event.
  • Optimize seeking in FMP4 by enabling seeking to the nearest sync sample within a fragment. This benefits standalone FMP4 playbacks, DASH and SmoothStreaming.
  • Updated default max buffer length in DefaultLoadControl.
  • Fix ClearKey decryption error if the key contains a forward slash (#4075).
  • Fix crash when switching surface on Huawei P9 Lite (#4084), and Philips QM163E (#4104).
  • Support ZLIB compressed PGS subtitles.
  • Added getPlaybackError to Player interface.
  • Moved initial bitrate estimate from AdaptiveTrackSelection to DefaultBandwidthMeter.
  • Removed default renderer time offset of 60000000 from internal player. The actual renderer timestamp offset can be obtained by listening to BaseRenderer.onStreamChanged.
  • Added dependencies on checkerframework annotations for static code analysis.

2.7.3 (2018-04-04)

  • Fix ProGuard configuration for Cast, IMA and OkHttp extensions.
  • Update OkHttp extension to depend on OkHttp 3.10.0.

2.7.2 (2018-03-29)

  • Gradle: Upgrade Gradle version from 4.1 to 4.4 so it can work with Android Studio 3.1 (#3708).
  • Match codecs starting with "mp4a" to different Audio MimeTypes (#3779).
  • Fix ANR issue on Redmi 4X and Redmi Note 4 (#4006).
  • Fix handling of zero padded strings when parsing Matroska streams (#4010).
  • Fix "Decoder input buffer too small" error when playing some FLAC streams.
  • MediaSession extension: Omit fast forward and rewind actions when media is not seekable (#4001).

2.7.1 (2018-03-09)

  • Gradle: Replaced 'compile' (deprecated) with 'implementation' and 'api'. This may lead to build breakage for applications upgrading from previous version that rely on indirect dependencies of certain modules. In such cases, application developers need to add the missing dependency to their gradle file. You can read more about the new dependency configurations here.
  • HlsMediaSource: Make HLS periods start at zero instead of the epoch. Applications that rely on HLS timelines having a period starting at the epoch will need to update their handling of HLS timelines. The program date time is still available via the informational Timeline.Window.windowStartTimeMs field (#3865, #3888).
  • Enable seeking in MP4 streams where duration is set incorrectly in the track header (#3926).
  • Video: Force rendering a frame periodically in MediaCodecVideoRenderer and LibvpxVideoRenderer, even if it is late.

2.7.0 (2018-02-19)

  • Player interface:
    • Add optional parameter to stop to reset the player when stopping.
    • Add a reason to EventListener.onTimelineChanged to distinguish between initial preparation, reset and dynamic updates.
    • Add Player.DISCONTINUITY_REASON_AD_INSERTION to the possible reasons reported in Eventlistener.onPositionDiscontinuity to distinguish transitions to and from ads within one period from transitions between periods.
    • Replaced ExoPlayer.sendMessages with ExoPlayer.createMessage to allow more customization of the message. Now supports setting a message delivery playback position and/or a delivery handler (#2189).
    • Add Player.VideoComponent, Player.TextComponent and Player.MetadataComponent interfaces that define optional video, text and metadata output functionality. New getVideoComponent, getTextComponent and getMetadataComponent methods provide access to this functionality.
  • Add ExoPlayer.setSeekParameters for controlling how seek operations are performed. The SeekParameters class contains defaults for exact seeking and seeking to the closest sync points before, either side or after specified seek positions. SeekParameters are not currently supported when playing HLS streams.
  • DefaultTrackSelector:
    • Replace DefaultTrackSelector.Parameters copy methods with a builder.
    • Support disabling of individual text track selection flags.
  • Buffering:
    • Allow a back-buffer of media to be retained behind the current playback position, for fast backward seeking. The back-buffer can be configured by custom LoadControl implementations.
    • Add ability for SequenceableLoader to re-evaluate its buffer and discard buffered media so that it can be re-buffered in a different quality.
    • Allow more flexible loading strategy when playing media containing multiple sub-streams, by allowing injection of custom CompositeSequenceableLoader factories through DashMediaSource.Factory, HlsMediaSource.Factory, SsMediaSource.Factory, and MergingMediaSource.
    • Play out existing buffer before retrying for progressive live streams (#1606).
  • UI:
    • Generalized player and control views to allow them to bind with any Player, and renamed them to PlayerView and PlayerControlView respectively.
    • Made PlayerView automatically apply video rotation when configured to use TextureView (#91).
    • Made PlayerView play button behave correctly when the player is ended (#3689), and call a PlaybackPreparer when the player is idle.
  • DRM: Optimistically attempt playback of DRM protected content that does not declare scheme specific init data in the manifest. If playback of clear samples without keys is allowed, delay DRM session error propagation until keys are actually needed (#3630).
  • DASH:
    • Support in-band Emsg events targeting the player with scheme id urn:mpeg:dash:event:2012 and scheme values "1", "2" and "3".
    • Support EventStream elements in DASH manifests.
  • HLS:
    • Add opt-in support for chunkless preparation in HLS. This allows an HLS source to finish preparation without downloading any chunks, which can significantly reduce initial buffering time (#3149). More details can be found here.
    • Fail if unable to sync with the Transport Stream, rather than entering stuck in an indefinite buffering state.
    • Fix mime type propagation (#3653).
    • Fix ID3 context reuse across segment format changes (#3622).
    • Use long for media sequence numbers (#3747)
    • Add initial support for the EXT-X-GAP tag.
  • Audio:
    • Support TrueHD passthrough for rechunked samples in Matroska files (#2147).
    • Support resampling 24-bit and 32-bit integer to 32-bit float for high resolution output in DefaultAudioSink (#3635).
  • Captions:
    • Basic support for PGS subtitles (#3008).
    • Fix handling of CEA-608 captions where multiple buffers have the same presentation timestamp (#3782).
  • Caching:
    • Fix cache corruption issue (#3762).
    • Implement periodic check in CacheDataSource to see whether it's possible to switch to reading/writing the cache having initially bypassed it.
  • IMA extension:
    • Fix the player getting stuck when an ad group fails to load (#3584).
    • Work around loadAd not being called beore the LOADED AdEvent arrives (#3552).
    • Handle asset mismatch errors (#3801).
    • Add support for playing non-Extractor content MediaSources in the IMA demo app (#3676).
    • Fix handling of ad tags where ad groups are out of order (#3716).
    • Fix handling of ad tags with only preroll/postroll ad groups (#3715).
    • Propagate ad media preparation errors to IMA so that the ads can be skipped.
    • Handle exceptions in IMA callbacks so that can be logged less verbosely.
  • New Cast extension. Simplifies toggling between local and Cast playbacks.
  • EventLogger moved from the demo app into the core library.
  • Fix ANR issue on the Huawei P8 Lite, Huawei Y6II, Moto C+, Meizu M5C, Lenovo K4 Note and Sony Xperia E5. (#3724, #3835).
  • Fix potential NPE when removing media sources from a DynamicConcatenatingMediaSource (#3796).
  • Check sys.display-size on Philips ATVs (#3807).
  • Release Extractors on the loading thread to avoid potentially leaking resources when the playback thread has quit by the time the loading task has completed.
  • ID3: Better handle malformed ID3 data (#3792).
  • Support 14-bit mode and little endianness in DTS PES packets (#3340).
  • Demo app: Add ability to download not DRM protected content.

2.6.1 (2017-12-15)

  • Add factories to ExtractorMediaSource, HlsMediaSource, SsMediaSource, DashMediaSource and SingleSampleMediaSource.
  • Use the same listener MediaSourceEventListener for all MediaSource implementations.
  • IMA extension:
    • Support non-ExtractorMediaSource ads (#3302).
    • Skip ads before the ad preceding the player's initial seek position (#3527).
    • Fix ad loading when there is no preroll.
    • Add an option to turn off hiding controls during ad playback (#3532).
    • Support specifying an ads response instead of an ad tag (#3548).
    • Support overriding the ad load timeout (#3556).
  • DASH: Support time zone designators in ISO8601 UTCTiming elements (#3524).
  • Audio:
    • Support 32-bit PCM float output from DefaultAudioSink, and add an option to use this with FfmpegAudioRenderer.
    • Add support for extracting 32-bit WAVE files (#3379).
    • Support extraction and decoding of Dolby Atmos (#2465).
    • Fix handling of playback parameter changes while paused when followed by a seek.
  • SimpleExoPlayer: Allow multiple audio and video debug listeners.
  • DefaultTrackSelector: Support undefined language text track selection when the preferred language is not available (#2980).
  • Add options to DefaultLoadControl to set maximum buffer size in bytes and to choose whether size or time constraints are prioritized.
  • Use surfaceless context for secure DummySurface, if available (#3558).
  • FLV: Fix playback of live streams that do not contain an audio track (#3188).
  • CEA-608: Fix handling of row count changes in roll-up mode (#3513).
  • Prevent period transitions when seeking to the end of a period when paused (#2439).

2.6.0 (2017-11-03)

  • Removed "r" prefix from versions. This release is "2.6.0", not "r2.6.0".
  • New Player.DefaultEventListener abstract class can be extended to avoid having to implement all methods defined by Player.EventListener.
  • Added a reason to EventListener.onPositionDiscontinuity (#3252).
  • New setShuffleModeEnabled method for enabling shuffled playback.
  • SimpleExoPlayer: Support for multiple video, text and metadata outputs.
  • Support for Renderers that don't consume any media (#3212).
  • Fix reporting of internal position discontinuities via Player.onPositionDiscontinuity. DISCONTINUITY_REASON_SEEK_ADJUSTMENT is added to disambiguate position adjustments during seeks from other types of internal position discontinuity.
  • Fix potential IndexOutOfBoundsException when calling ExoPlayer.getDuration (#3362).
  • Fix playbacks involving looping, concatenation and ads getting stuck when media contains tracks with uneven durations (#1874).
  • Fix issue with ContentDataSource when reading from certain ContentProvider implementations (#3426).
  • Better playback experience when the video decoder cannot keep up, by skipping to key-frames. This is particularly relevant for variable speed playbacks.
  • Allow SingleSampleMediaSource to suppress load errors (#3140).
  • DynamicConcatenatingMediaSource: Allow specifying a callback to be invoked after a dynamic playlist modification has been applied (#3407).
  • Audio: New AudioSink interface allows customization of audio output path.
  • Offline: Added Downloader implementations for DASH, HLS, SmoothStreaming and progressive streams.
  • Track selection:
    • Fixed adaptive track selection logic for live playbacks (#3017).
    • Added ability to select the lowest bitrate tracks.
  • DASH:
    • Don't crash when a malformed or unexpected manifest update occurs (#2795).
  • HLS:
    • Support for Widevine protected FMP4 variants.
    • Support CEA-608 in FMP4 variants.
    • Support extractor injection (#2748).
  • DRM:
    • Improved compatibility with ClearKey content (#3138).
    • Support multiple PSSH boxes of the same type.
    • Retry initial provisioning and key requests if they fail
    • Fix incorrect parsing of non-CENC sinf boxes.
  • IMA extension:
    • Expose AdsLoader via getter (#3322).
    • Handle setPlayWhenReady calls during ad playbacks (#3303).
    • Ignore seeks if an ad is playing (#3309).
    • Improve robustness of ImaAdsLoader in case content is not paused between content to ad transitions (#3430).
  • UI:
    • Allow specifying a Drawable for the TimeBar scrubber (#3337).
    • Allow multiple listeners on TimeBar (#3406).
  • New Leanback extension: Simplifies binding Exoplayer to Leanback UI components.
  • Unit tests moved to Robolectric.
  • Misc bugfixes.

r2.5.4 (2017-10-19)

  • Remove unnecessary media playlist fetches during playback of live HLS streams.
  • Add the ability to inject a HLS playlist parser through HlsMediaSource.
  • Fix potential IndexOutOfBoundsException when using ImaMediaSource (#3334).
  • Fix an issue parsing MP4 content containing non-CENC sinf boxes.
  • Fix memory leak when seeking with repeated periods.
  • Fix playback position when ExoPlayer.prepare is called with resetPosition set to false.
  • Ignore MP4 edit lists that seem invalid (#3351).
  • Add extractor flag for ignoring all MP4 edit lists (#3358).
  • Improve extensibility by exposing public constructors for FrameworkMediaCrypto and by making DefaultDashChunkSource.getNextChunk non-final.

r2.5.3 (2017-09-20)

  • IMA extension: Support skipping of skippable ads on AndroidTV and other non-touch devices (#3258).
  • HLS: Fix broken WebVTT captions when PTS wraps around (#2928).
  • Captions: Fix issues rendering CEA-608 captions (#3250).
  • Workaround broken AAC decoders on Galaxy S6 (#3249).
  • Caching: Fix infinite loop when cache eviction fails (#3260).
  • Caching: Force use of BouncyCastle on JellyBean to fix decryption issue (#2755).

r2.5.2 (2017-09-11)

  • IMA extension: Fix issue where ad playback could end prematurely for some content types (#3180).
  • RTMP extension: Fix SIGABRT on fast RTMP stream restart (#3156).
  • UI: Allow app to manually specify ad markers (#3184).
  • DASH: Expose segment indices to subclasses of DefaultDashChunkSource (#3037).
  • Captions: Added robustness against malformed WebVTT captions (#3228).
  • DRM: Support forcing a specific license URL.
  • Fix playback error when seeking in media loaded through content:// URIs (#3216).
  • Fix issue playing MP4s in which the last atom specifies a size of zero (#3191).
  • Workaround playback failures on some Xiaomi devices (#3171).
  • Workaround SIGSEGV issue on some devices when setting and swapping surface for secure playbacks (#3215).
  • Workaround for Nexus 7 issue when swapping output surface (#3236).
  • Workaround for SimpleExoPlayerView's surface not being hidden properly (#3160).

r2.5.1 (2017-08-08)

  • Fix an issue that could cause the reported playback position to stop advancing in some cases.
  • Fix an issue where a Surface could be released whilst still in use by the player.

r2.5.0 (2017-08-07)

  • IMA extension: Wraps the Google Interactive Media Ads (IMA) SDK to provide an easy and seamless way of incorporating display ads into ExoPlayer playbacks. You can read more about the IMA extension here.
  • MediaSession extension: Provides an easy way to connect ExoPlayer with MediaSessionCompat in the Android Support Library.
  • RTMP extension: An extension for playing streams over RTMP.
  • Build: Made it easier for application developers to depend on a local checkout of ExoPlayer. You can learn how to do this here.
  • Core playback improvements:
    • Eliminated re-buffering when changing audio and text track selections during playback of progressive streams (#2926).
    • New DynamicConcatenatingMediaSource class to support playback of dynamic playlists.
    • New ExoPlayer.setRepeatMode method for dynamic toggling of repeat mode during playback. Use of setRepeatMode should be preferred to LoopingMediaSource for most looping use cases. You can read more about setRepeatMode here.
    • Eliminated jank when switching video playback from one Surface to another on API level 23+ for unencrypted content, and on devices that support the EGL_EXT_protected_content OpenGL extension for protected content (#677).
    • Enabled ExoPlayer instantiation on background threads without Loopers. Events from such players are delivered on the application's main thread.
  • HLS improvements:
    • Optimized adaptive switches for playlists that specify the EXT-X-INDEPENDENT-SEGMENTS tag.
    • Optimized in-buffer seeking (#551).
    • Eliminated re-buffering when changing audio and text track selections during playback, provided the new selection does not require switching to different renditions (#2718).
    • Exposed all media playlist tags in ExoPlayer's MediaPlaylist object.
  • DASH: Support for seamless switching across streams in different AdaptationSet elements (#2431).
  • DRM: Support for additional crypto schemes (cbc1, cbcs and cens) on API level 24+ (#1989).
  • Captions: Initial support for SSA/ASS subtitles (#889).
  • AndroidTV: Fixed issue where tunneled video playback would not start on some devices (#2985).
  • MPEG-TS: Fixed segmentation issue when parsing H262 (#2891).
  • Cronet extension: Support for a user-defined fallback if Cronet library is not present.
  • Fix buffer too small IllegalStateException issue affecting some composite media playbacks (#2900).
  • Misc bugfixes.

r2.4.4 (2017-07-19)

  • HLS/MPEG-TS: Some initial optimizations of MPEG-TS extractor performance (#3040).
  • HLS: Fix propagation of format identifier for CEA-608 (#3033).
  • HLS: Detect playlist stuck and reset conditions (#2872).
  • Video: Fix video dimension reporting on some devices (#3007).

r2.4.3 (2017-06-30)

  • Audio: Workaround custom audio decoders misreporting their maximum supported channel counts (#2940).
  • Audio: Workaround for broken MediaTek raw decoder on some devices (#2873).
  • Captions: Fix TTML captions appearing at the top of the screen (#2953).
  • Captions: Fix handling of some DVB subtitles (#2957).
  • Track selection: Fix setSelectionOverride(index, tracks, null) (#2988).
  • GVR extension: Add support for mono input (#2710).
  • FLAC extension: Fix failing build (#2977).
  • Misc bugfixes.

r2.4.2 (2017-06-06)

  • Stability: Work around Nexus 10 reboot when playing certain content (#2806).
  • MP3: Correctly treat MP3s with INFO headers as constant bitrate (#2895).
  • HLS: Use average rather than peak bandwidth when available (#2863).
  • SmoothStreaming: Fix timeline for live streams (#2760).
  • UI: Fix DefaultTimeBar invalidation (#2871).
  • Misc bugfixes.

r2.4.1 (2017-05-23)

  • Stability: Avoid OutOfMemoryError in extractors when parsing malformed media (#2780).
  • Stability: Avoid native crash on Galaxy Nexus. Avoid unnecessarily large codec input buffer allocations on all devices (#2607).
  • Variable speed playback: Fix interpolation for rate/pitch adjustment (#2774).
  • HLS: Include EXT-X-DATERANGE tags in HlsMediaPlaylist.
  • HLS: Don't expose CEA-608 track if CLOSED-CAPTIONS=NONE (#2743).
  • HLS: Correctly propagate errors loading the media playlist (#2623).
  • UI: DefaultTimeBar enhancements and bug fixes (#2740).
  • Ogg: Fix failure to play some Ogg files (#2782).
  • Captions: Don't select text tack with no language by default.
  • Captions: TTML positioning fixes (#2824).
  • Misc bugfixes.

r2.4.0 (2017-04-25)

  • New modular library structure. You can read more about depending on individual library modules here.
  • Variable speed playback support on API level 16+. You can read more about changing the playback speed here (#26).
  • New time bar view, including support for displaying ad break markers.
  • Support DVB subtitles in MPEG-TS and MKV.
  • Support adaptive playback for audio only DASH, HLS and SmoothStreaming (#1975).
  • Support for setting extractor flags on DefaultExtractorsFactory (#2657).
  • Support injecting custom renderers into SimpleExoPlayer using a new RenderersFactory interface.
  • Correctly set ExoPlayer's internal thread priority to THREAD_PRIORITY_AUDIO.
  • TX3G: Support styling and positioning.
  • FLV:
    • Support MP3 in FLV.
    • Skip unhandled metadata rather than failing (#2634).
    • Fix potential OutOfMemory errors.
  • ID3: Better handle malformed ID3 data (#2604, #2663).
  • FFmpeg extension: Fixed build instructions (#2561).
  • VP9 extension: Reduced binary size.
  • FLAC extension: Enabled 64 bit targets.
  • Misc bugfixes.

r2.3.1 (2017-03-23)

  • Fix NPE enabling WebVTT subtitles in DASH streams (#2596).
  • Fix skipping to keyframes when MediaCodecVideoRenderer is enabled but without a Surface (#2575).
  • Minor fix for CEA-708 decoder (#2595).

r2.3.0 (2017-03-16)

  • GVR extension: Wraps the Google VR Audio SDK to provide spatial audio rendering. You can read more about the GVR extension here.
  • DASH improvements:
    • Support embedded CEA-608 closed captions (#2362).
    • Support embedded EMSG events (#2176).
    • Support mspr:pro manifest element (#2386).
    • Correct handling of empty segment indices at the start of live events (#1865).
  • HLS improvements:
    • Respect initial track selection (#2353).
    • Reduced frequency of media playlist requests when playback position is close to the live edge (#2548).
    • Exposed the master playlist through ExoPlayer.getCurrentManifest() (#2537).
    • Support CLOSED-CAPTIONS #EXT-X-MEDIA type (#341).
    • Fixed handling of negative values in #EXT-X-SUPPORT (#2495).
    • Fixed potential endless buffering state for streams with WebVTT subtitles (#2424).
  • MPEG-TS improvements:
    • Support for multiple programs.
    • Support for multiple closed captions and caption service descriptors (#2161).
  • MP3: Add FLAG_ENABLE_CONSTANT_BITRATE_SEEKING extractor option to enable constant bitrate seeking in MP3 files that would otherwise be unseekable (#2445).
  • ID3: Better handle malformed ID3 data (#2486).
  • Track selection: Added maxVideoBitrate parameter to DefaultTrackSelector.
  • DRM: Add support for CENC ClearKey on API level 21+ (#2361).
  • DRM: Support dynamic setting of key request headers (#1924).
  • SmoothStreaming: Fixed handling of start_time placeholder (#2447).
  • FLAC extension: Fix proguard configuration (#2427).
  • Misc bugfixes.

r2.2.0 (2017-01-30)

  • Demo app: Automatic recovery from BehindLiveWindowException, plus improved handling of pausing and resuming live streams (#2344).
  • AndroidTV: Added Support for tunneled video playback (#1688).
  • DRM: Renamed StreamingDrmSessionManager to DefaultDrmSessionManager and added support for using offline licenses (#876).
  • DRM: Introduce OfflineLicenseHelper to help with offline license acquisition, renewal and release.
  • UI: Updated player control assets. Added vector drawables for use on API level 21 and above.
  • UI: Made player control seek bar work correctly with key events if focusable (#2278).
  • HLS: Improved support for streams that use EXT-X-DISCONTINUITY without EXT-X-DISCONTINUITY-SEQUENCE (#1789).
  • HLS: Support for EXT-X-START tag (#1544).
  • HLS: Check #EXTM3U header is present when parsing the playlist. Fail gracefully if not (#2301).
  • HLS: Fix memory leak (#2319).
  • HLS: Fix non-seamless first adaptation where master playlist omits resolution tags (#2096).
  • HLS: Fix handling of WebVTT subtitle renditions with non-standard segment file extensions (#2025 and #2355).
  • HLS: Better handle inconsistent HLS playlist update (#2249).
  • DASH: Don't overflow when dealing with large segment numbers (#2311).
  • DASH: Fix propagation of language from the manifest (#2335).
  • SmoothStreaming: Work around "Offset to sample data was negative" failures (#2292, #2101 and #1152).
  • MP3/ID3: Added support for parsing Chapter and URL link frames (#2316).
  • MP3/ID3: Handle ID3 frames that end with empty text field (#2309).
  • Added ClippingMediaSource for playing clipped portions of media (#1988).
  • Added convenience methods to query whether the current window is dynamic and seekable (#2320).
  • Support setting of default headers on HttpDataSource.Factory implementations (#2166).
  • Fixed cache failures when using an encrypted cache content index.
  • Fix visual artifacts when switching output surface (#2093).
  • Fix gradle + proguard configurations.
  • Fix player position when replacing the MediaSource (#2369).
  • Misc bug fixes, including #2330, #2269, #2252, #2264 and #2290.

r2.1.1 (2016-12-20)

  • Fix some subtitle types (e.g. WebVTT) being displayed out of sync (#2208).
  • Fix incorrect position reporting for on-demand HLS media that includes EXT-X-PROGRAM-DATE-TIME tags (#2224).
  • Fix issue where playbacks could get stuck in the initial buffering state if over 1MB of data needs to be read to initialize the playback.

r2.1.0 (2016-12-14)

  • HLS: Support for seeking in live streams (#87).
  • HLS: Improved support:
    • Support for EXT-X-PROGRAM-DATE-TIME (#747).
    • Improved handling of sample timestamps and their alignment across variants and renditions.
    • Fix issue that could cause playbacks to get stuck in an endless initial buffering state.
    • Correctly propagate BehindLiveWindowException instead of IndexOutOfBoundsException exception (#1695).
  • MP3/MP4: Support for ID3 metadata, including embedded album art (#979).
  • Improved customization of UI components. You can read about customization of ExoPlayer's UI components here.
  • Robustness improvements when handling MediaSource timeline changes and MediaPeriod transitions.
  • CEA-608: Support for caption styling and positioning.
  • MPEG-TS: Improved support:
    • Support injection of custom TS payload readers.
    • Support injection of custom section payload readers.
    • Support SCTE-35 splice information messages.
    • Support multiple table sections in a single PSI section.
    • Fix NullPointerException when an unsupported stream type is encountered (#2149).
    • Avoid failure when expected ID3 header not found (#1966).
  • Improvements to the upstream cache package.
    • Support caching of media segments for DASH, HLS and SmoothStreaming. Note that caching of manifest and playlist files is still not supported in the (normal) case where the corresponding responses are compressed.
    • Support caching for ExtractorMediaSource based playbacks.
  • Improved flexibility of SimpleExoPlayer (#2102).
  • Fix issue where only the audio of a video would play due to capability detection issues (#2007, #2034 and #2157).
  • Fix issues that could cause ExtractorMediaSource based playbacks to get stuck buffering (#1962).
  • Correctly set SimpleExoPlayerView surface aspect ratio when an active player is attached (#2077).
  • OGG: Fix playback of short OGG files (#1976).
  • MP4: Support .mp3 tracks (#2066).
  • SubRip: Don't fail playbacks if SubRip file contains negative timestamps (#2145).
  • Misc bugfixes.

r2.0.4 (2016-10-20)

  • Fix crash on Jellybean devices when using playback controls (#1965).

r2.0.3 (2016-10-17)

  • Fixed NullPointerException in ExtractorMediaSource (#1914).
  • Fixed NullPointerException in HlsMediaPeriod (#1907).
  • Fixed memory leak in PlaybackControlView (#1908).
  • Fixed strict mode violation when using SimpleExoPlayer.setVideoPlayerTextureView().
  • Fixed L3 Widevine provisioning (#1925).
  • Fixed hiding of controls with use_controller="false" (#1919).
  • Improvements to Cronet network stack extension.
  • Misc bug fixes.

r2.0.2 (2016-10-06)

  • Fixes for MergingMediaSource and sideloaded subtitles. (#1882, #1854, #1900).
  • Reduced effect of application code leaking player references (#1855).
  • Initial support for fragmented MP4 in HLS.
  • Misc bug fixes and minor features.

r2.0.1 (2016-09-30)

  • Fix playback of short duration content (#1837).
  • Fix MergingMediaSource preparation issue (#1853).
  • Fix live stream buffering (out of memory) issue (#1825).

r2.0.0 (2016-09-14)

ExoPlayer 2.x is a major iteration of the library. It includes significant API and architectural changes, new features and many bug fixes. You can read about some of the motivations behind ExoPlayer 2.x here.

  • Root package name changed to com.google.android.exoplayer2. The library structure and class names have also been sanitized. Read more here.
  • Key architectural changes:
    • Late binding between rendering and media source components. Allows the same rendering components to be re-used from one playback to another. Enables features such as gapless playback through playlists and DASH multi-period support.
    • Improved track selection design. More details can be found here.
    • LoadControl now used to control buffering and loading across all playback types.
    • Media source components given additional structure. A new MediaSource class has been introduced. MediaSources expose Timelines that describe the media they expose, and can consist of multiple MediaPeriods. This enables features such as seeking in live playbacks and DASH multi-period support.
    • Responsibility for loading the initial DASH/SmoothStreaming/HLS manifest is promoted to the corresponding MediaSource components and is no longer the application's responsibility.
    • Higher level abstractions such as SimpleExoPlayer have been added to the library. These make the library easier to use for common use cases. The demo app is halved in size as a result, whilst at the same time gaining more functionality. Read more here.
    • Enhanced library support for implementing audio extensions. Read more here.
    • Format and MediaFormat are replaced by a single Format class.
  • Key new features:
    • Playlist support. Includes support for gapless playback between playlist items and consistent application of LoadControl and TrackSelector policies when transitioning between items (#1270).
    • Seeking in live playbacks for DASH and SmoothStreaming (#291).
    • DASH multi-period support (#557).
    • MediaSource composition allows MediaSources to be concatenated into a playlist, merged and looped. Read more here.
    • Looping support (see above) (#490).
    • Ability to query information about all tracks in a piece of media (including those not supported by the device) (#1121).
    • Improved player controls.
    • Support for PSSH in fMP4 moof atoms (#1143).
    • Support for Opus in Ogg (#1447).
    • CacheDataSource support for standalone media file playbacks (mp3, mp4 etc).
    • FFMPEG extension (for audio only).
  • Key bug fixes:
    • Removed unnecessary secondary requests when playing standalone media files (#1041).
    • Fixed playback of video only (i.e. no audio) live streams (#758).
    • Fixed silent failure when media buffer is too small (#583).
    • Suppressed "Sending message to a Handler on a dead thread" warnings (#426).

Legacy release notes

Note: Since ExoPlayer V1 is still being maintained alongside V2, there is some overlap between these notes and the notes above. r2.0.0 followed from r1.5.11, and hence it can be assumed that all changes in r1.5.11 and earlier are included in all V2 releases. This cannot be assumed for changes in r1.5.12 and later, however it can be assumed that all such changes are included in the most recent V2 release.

r1.5.16

  • VP9 extension: Reduced binary size.
  • FLAC extension: Enabled 64 bit targets and fixed proguard config.
  • Misc bugfixes.

r1.5.15

  • SmoothStreaming: Fixed handling of start_time placeholder (#2447).
  • Misc bugfixes.

r1.5.14

  • Fixed cache failures when using an encrypted cache content index.
  • SmoothStreaming: Work around "Offset to sample data was negative" failures (#2292, #2101 and #1152).

r1.5.13

  • Improvements to the upstream cache package.
  • MP4: Support .mp3 tracks (#2066).
  • SubRip: Don't fail playbacks if SubRip file contains negative timestamps (#2145).
  • MPEG-TS: Avoid failure when expected ID3 header not found (#1966).
  • Misc bugfixes.

r1.5.12

  • Improvements to Cronet network stack extension.
  • Fix bug in demo app introduced in r1.5.11 that caused L3 Widevine provisioning requests to fail.
  • Misc bugfixes.

r1.5.11

  • Cronet network stack extension.
  • HLS: Fix propagation of language for alternative audio renditions (#1784).
  • WebM: Support for subsample encryption.
  • ID3: Fix EOS detection for 2-byte encodings (#1774).
  • MPEG-TS: Support multiple tracks of the same type.
  • MPEG-TS: Work toward robust handling of stream corruption.
  • Fix ContentDataSource failures triggered by garbage collector (#1759).

r1.5.10

  • HLS: Stability fixes.
  • MP4: Support for stz2 Atoms.
  • Enable 4K format selection on Sony AndroidTV + nVidia SHIELD.
  • TX3G caption fixes.

r1.5.9

  • MP4: Fixed incorrect sniffing in some cases (#1523).
  • MP4: Improved file compatibility (#1567).
  • ID3: Support for TIT2 and APIC frames.
  • Fixed querying of platform decoders on some devices.
  • Misc bug fixes.

r1.5.8

  • HLS: Fix handling of HTTP redirects.
  • Audio: Minor adjustment to improve A/V sync.
  • OGG: Support FLAC in OGG.
  • TTML: Support regions.
  • WAV/PCM: Support 8, 24 and 32-bit WAV and PCM audio.
  • Misc bug fixes and performance optimizations.

r1.5.7

  • OGG: Support added for OGG.
  • FLAC: Support for FLAC extraction and playback (via an extension).
  • HLS: Multiple audio track support (via Renditions).
  • FMP4: Support multiple tracks in fragmented MP4 (not applicable to DASH/SmoothStreaming).
  • WAV: Support for 16-bit WAV files.
  • MKV: Support non-square pixel formats.
  • Misc bug fixes.

r1.5.6

  • MP3: Fix mono streams playing at 2x speed on some MediaTek based devices (#801).
  • MP3: Fix playback of some streams when stream length is unknown.
  • ID3: Support multiple frames of the same type in a single tag.
  • CEA-608: Correctly handle repeated control characters, fixing an issue in which captions would immediately disappear.
  • AVC3: Fix decoder failures on some MediaTek devices in the case where the first buffer fed to the decoder does not start with SPS/PPS NAL units.
  • Misc bug fixes.

r1.5.5

  • DASH: Enable MP4 embedded WebVTT playback (#1185)
  • HLS: Fix handling of extended ID3 tags in MPEG-TS (#1181)
  • MP3: Fix incorrect position calculation in VBRI header (#1197)
  • Fix issue seeking backward using SingleSampleSource (#1193)

r1.5.4

  • HLS: Support for variant selection and WebVtt subtitles.
  • MP4: Support for embedded WebVtt.
  • Improved device compatibility.
  • Fix for resource leak (Issue #1066).
  • Misc bug fixes + minor features.

r1.5.3

  • Support for FLV (without seeking).
  • MP4: Fix for playback of media containing basic edit lists.
  • QuickTime: Fix parsing of QuickTime style audio sample entry.
  • HLS: Add H262 support for devices that have an H262 decoder.
  • Allow AudioTrack PlaybackParams (e.g. speed/pitch) on API level 23+.
  • Correctly detect 4K displays on API level 23+.
  • Misc bug fixes.

r1.5.2

  • MPEG-TS/HLS: Fix frame drops playing H265 video.
  • SmoothStreaming: Fix parsing of ProtectionHeader.

r1.5.1

  • Enable smooth frame release by default.
  • Added OkHttpDataSource extension.
  • AndroidTV: Correctly detect 4K display size on Bravia devices.
  • FMP4: Handle non-sample data in mdat boxes.
  • TTML: Fix parsing of some colors on Jellybean.
  • SmoothStreaming: Ignore tfdt boxes.
  • Misc bug fixes.

r1.5.0

  • Multi-track support.
  • DASH: Limited support for multi-period manifests.
  • HLS: Smoother format adaptation.
  • HLS: Support for MP3 media segments.
  • TTML: Support for most embedded TTML styling.
  • WebVTT: Enhanced positioning support.
  • Initial playback tests.
  • Misc bug fixes.

r1.4.2

  • Implemented automatic format detection for regular container formats.
  • Added UdpDataSource for connecting to multicast streams.
  • Improved robustness for MP4 playbacks.
  • Misc bug fixes.

r1.4.1

  • HLS: Fix premature playback failures that could occur in some cases.

r1.4.0

  • Support for extracting Matroska streams (implemented by WebmExtractor).
  • Support for tx3g captions in MP4 streams.
  • Support for H.265 in MPEG-TS streams on supported devices.
  • HLS: Added support for MPEG audio (e.g. MP3) in TS media segments.
  • HLS: Improved robustness against missing chunks and variants.
  • MP4: Added support for embedded MPEG audio (e.g. MP3).
  • TTML: Improved handling of whitespace.
  • DASH: Support Mpd.Location element.
  • Add option to TsExtractor to allow non-IDR keyframes.
  • Added MulticastDataSource for connecting to multicast streams.
  • (WorkInProgress) - First steps to supporting seeking in DASH DVR window.
  • (WorkInProgress) - First steps to supporting styled + positioned subtitles.
  • Misc bug fixes.

r1.3.3

  • HLS: Fix failure when playing HLS AAC streams.
  • Misc bug fixes.

r1.3.2

  • DataSource improvements: DefaultUriDataSource now handles http://, https://, file://, asset:// and content:// URIs automatically. It also handles file:///android_asset/* URIs, and file paths like /path/to/media.mp4 where the scheme is omitted.
  • HLS: Fix for some ID3 events being dropped.
  • HLS: Correctly handle 0x0 and floating point RESOLUTION tags.
  • Mp3Extractor: robustness improvements.

r1.3.1

  • No notes provided.