1# Release notes 2 3### dev-v2 (not yet released) 4 5* Core library: 6 * Support preferred video role flags in track selection 7 ((#9402)[https://github.com/google/ExoPlayer/issues/9402]). 8 * Prefer audio content preferences (for example, "default" audio track or 9 track matching system Locale language) over technical track selection 10 constraints (for example, preferred MIME type, or maximum channel 11 count). 12 * Prohibit duplicate `TrackGroup`s in a `TrackGroupArray`. `TrackGroup`s 13 can always be made distinguishable by setting an `id` in the 14 `TrackGroup` constructor. This fixes a crash when resuming playback 15 after backgrounding the app with an active track override 16 ((#9718)[https://github.com/google/ExoPlayer/issues/9718]). 17 * Sleep and retry when creating a `MediaCodec` instance fails. This works 18 around an issue that occurs on some devices when switching a surface 19 from a secure codec to another codec 20 (#8696)[https://github.com/google/ExoPlayer/issues/8696]. 21 * Add `MediaCodecAdapter.getMetrics()` to allow users obtain metrics data 22 from `MediaCodec`. 23 ([#9766](https://github.com/google/ExoPlayer/issues/9766)). 24 * Amend logic in `AdaptiveTrackSelection` to allow a quality increase 25 under sufficient network bandwidth even if playback is very close to the 26 live edge ((#9784)[https://github.com/google/ExoPlayer/issues/9784]). 27 * Fix Maven dependency resolution 28 ((#8353)[https://github.com/google/ExoPlayer/issues/8353]). 29* Android 12 compatibility: 30 * Upgrade the Cast extension to depend on 31 `com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier 32 versions of `play-services-cast-framework` are not compatible with apps 33 targeting Android 12, and will crash with an `IllegalArgumentException` 34 when creating `PendingIntent`s 35 ([#9528](https://github.com/google/ExoPlayer/issues/9528)). 36* Audio: 37 * Add a `Builder` to `DefaultAudioSink` and deprecate the existing 38 constructors. 39 * Change `AudioCapabilities` APIs to require passing explicitly 40 `AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES` instead of `null`. 41* Extractors: 42 * Fix inconsistency with spec in H.265 SPS nal units parsing 43 ((#9719)[https://github.com/google/ExoPlayer/issues/9719]). 44* Text: 45 * Add a `MediaItem.SubtitleConfiguration#id` field which is propagated to 46 the `Format#id` field of the subtitle track created from the 47 configuration 48 ((#9673)[https://github.com/google/ExoPlayer/issues/9673]). 49 * Rename `DecoderCounters#inputBufferCount` to `queuedInputBufferCount`. 50* DRM: 51 * Remove `playbackLooper` from `DrmSessionManager.(pre)acquireSession`. 52 When a `DrmSessionManager` is used by an app in a custom `MediaSource`, 53 the `playbackLooper` needs to be passed to `DrmSessionManager.setPlayer` 54 instead. 55* IMA: 56 * Add a method to `AdPlaybackState` to allow resetting an ad group so that 57 it can be played again 58 ([#9615](https://github.com/google/ExoPlayer/issues/9615)). 59* DASH: 60 * Support the `forced-subtitle` track role 61 ([#9727](https://github.com/google/ExoPlayer/issues/9727)). 62 * Stop interpreting the `main` track role as `C.SELECTION_FLAG_DEFAULT`. 63* HLS: 64 * Use chunkless preparation by default to improve start up time. If your 65 renditions contain muxed closed-caption tracks that are *not* declared 66 in the master playlist, you should add them to the master playlist to be 67 available for playback, or turn off chunkless preparation with 68 `HlsMediaSource.Factory.setAllowChunklessPreparation(false)`. 69 * Support key-frame accurate seeking in HLS 70 ([#2882](https://github.com/google/ExoPlayer/issues/2882)). 71 * Correctly populate `Format.label` for audio only HLS streams 72 ([#9608](https://github.com/google/ExoPlayer/issues/9608)). 73 * Timestamp adjuster initialization occurs after opening the `DataSource` 74 ([#9777](https://github.com/google/ExoPlayer/pull/9777)). 75* UI: 76 * Fix the color of the numbers in `StyledPlayerView` rewind and 77 fastforward buttons when using certain themes 78 ([#9765](https://github.com/google/ExoPlayer/issues/9765)). 79* Transformer: 80 * Increase required min API version to 21. 81 * `TransformationException` is now used to describe errors that occur 82 during a transformation. 83 * Add `TransformationRequest` for specifying the transformation options. 84* MediaSession extension: 85 * Remove deprecated call to `onStop(/* reset= */ true)` and provide an 86 opt-out flag for apps that don't want to clear the playlist on stop. 87* RTSP: 88 * Provide a client API to override the `SocketFactory` used for any server 89 connection ([#9606](https://github.com/google/ExoPlayer/pull/9606)). 90 * Prefers DIGEST authentication method over BASIC if both are present. 91 ([#9800](https://github.com/google/ExoPlayer/issues/9800)). 92* Cast extension 93 * Fix bug that prevented `CastPlayer` from calling `onIsPlayingChanged` 94 correctly. 95* Remove deprecated symbols: 96 * Remove `MediaSourceFactory#setDrmSessionManager`, 97 `MediaSourceFactory#setDrmHttpDataSourceFactory`, and 98 `MediaSourceFactory#setDrmUserAgent`. Use 99 `MediaSourceFactory#setDrmSessionManagerProvider` instead. 100 * Remove `MediaSourceFactory#setStreamKeys`. Use 101 `MediaItem.Builder#setStreamKeys` instead. 102 * Remove `MediaSourceFactory#createMediaSource(Uri)`. Use 103 `MediaSourceFactory#createMediaSource(MediaItem)` instead. 104 * Remove `setTag` from `DashMediaSource`, `HlsMediaSource` and 105 `SsMediaSource`. Use `MediaItem.Builder#setTag` instead. 106 * Remove `DashMediaSource#setLivePresentationDelayMs(long, boolean)`. Use 107 `MediaItem.Builder#setLiveConfiguration` and 108 `MediaItem.LiveConfiguration.Builder#setTargetOffsetMs` to override the 109 manifest, or `DashMediaSource#setFallbackTargetLiveOffsetMs` to provide 110 a fallback value. 111 112### 2.16.1 (2021-11-18) 113 114* Core Library: 115 * Fix track selection issue where overriding one track group did not 116 disable other track groups of the same type 117 ([#9675](https://github.com/google/ExoPlayer/issues/9675)). 118 * Fix track selection issue where a mixture of non-empty and empty track 119 overrides is not applied correctly 120 ([#9649](https://github.com/google/ExoPlayer/issues/9649)). 121 * Add protected method `DefaultRenderersFactory.getCodecAdapterFactory()` 122 so that subclasses of `DefaultRenderersFactory` that override 123 `buildVideoRenderers()` or `buildAudioRenderers()` can access the codec 124 adapter factory and pass it to `MediaCodecRenderer` instances they 125 create. 126 * Propagate ICY header fields `name` and `genre` to 127 `MediaMetadata.station` and `MediaMetadata.genre` respectively so that 128 they reach the app via `Player.Listener.onMediaMetadataChanged()` 129 ([#9677](https://github.com/google/ExoPlayer/issues/9677)). 130 * Remove null keys from `DefaultHttpDataSource#getResponseHeaders`. 131* Extractors: 132 * WAV: Add support for RF64 streams 133 ([#9543](https://github.com/google/ExoPlayer/issues/9543)). 134* DASH: 135 * Add parsed essential and supplemental properties to the `Representation` 136 ([#9579](https://github.com/google/ExoPlayer/issues/9579)). 137* HLS: 138 * Correctly populate `Format.label` for audio only HLS streams 139 ([#9608](https://github.com/google/ExoPlayer/issues/9608)). 140 141### 2.16.0 (2021-11-04) 142 143* Core Library: 144 * Deprecate `SimpleExoPlayer`. All functionality has been moved to 145 `ExoPlayer` instead. `ExoPlayer.Builder` can be used instead of 146 `SimpleExoPlayer.Builder`. 147 * Add track selection methods to the `Player` interface, for example, 148 `Player.getCurrentTracksInfo` and `Player.setTrackSelectionParameters`. 149 These methods can be used instead of directly accessing the track 150 selector. 151 * Enable MediaCodec asynchronous queueing by default on devices with API 152 level >= 31. Add methods in `DefaultMediaCodecRendererFactory` and 153 `DefaultRenderersFactory` to force enable or force disable asynchronous 154 queueing ([6348](https://github.com/google/ExoPlayer/issues/6348)). 155 * Remove final dependency on `jcenter()`. 156 * Fix `mediaMetadata` being reset when media is repeated 157 ([#9458](https://github.com/google/ExoPlayer/issues/9458)). 158 * Adjust `ExoPlayer` `MediaMetadata` update priority, such that values 159 input through the `MediaItem.MediaMetadata` are used above media derived 160 values. 161 * Move `com.google.android.exoplayer2.device.DeviceInfo` to 162 `com.google.android.exoplayer2.DeviceInfo`. 163 * Move `com.google.android.exoplayer2.drm.DecryptionException` to 164 `com.google.android.exoplayer2.decoder.CryptoException`. 165 * Move `com.google.android.exoplayer2.upstream.cache.CachedRegionTracker` 166 to `com.google.android.exoplayer2.upstream.CachedRegionTracker`. 167 * Move `Player.addListener(EventListener)` and 168 `Player.removeListener(EventListener)` out of `Player` into subclasses. 169* Android 12 compatibility: 170 * Keep `DownloadService` started and in the foreground whilst waiting for 171 requirements to be met on Android 12. This is necessary due to new 172 [foreground service launch restrictions](https://developer.android.com/about/versions/12/foreground-services). 173 `DownloadService.getScheduler` will not be called on Android 12 devices. 174 * Disable platform transcoding when playing content URIs on Android 12. 175 * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of 176 calls from the player to `Surface.setFrameRate`. This is useful for 177 applications wanting to call `Surface.setFrameRate` directly from 178 application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. 179 * Upgrade the WorkManager extension to depend on 180 `androidx.work:work-runtime:2.7.0`. Earlier versions of `work-runtime` 181 are not compatible with apps targeting Android 12, and will crash with 182 an `IllegalArgumentException` when creating `PendingIntent`s 183 ([#9181](https://github.com/google/ExoPlayer/issues/9181)). 184* Video: 185 * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a 186 released `Surface` when playing without an app-provided `Surface` 187 ([#9476](https://github.com/google/ExoPlayer/issues/9476)). 188* DRM: 189 * Log an error (instead of throwing `IllegalStateException`) when calling 190 `DefaultDrmSession#release()` on a fully released session 191 ([#9392](https://github.com/google/ExoPlayer/issues/9392)). 192* UI: 193 * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` 194 implements `Player.Listener`, so can be registered to a player with 195 `Player.addListener`. 196 * Fix initial timestamp display in `PlayerControlView` 197 ([#9524](https://github.com/google/ExoPlayer/issues/9254)). 198 * Fix capitalization of languages in the track selector 199 ([#9452](https://github.com/google/ExoPlayer/issues/9452)). 200* Extractors: 201 * MP4: Correctly handle HEVC tracks with pixel aspect ratios other than 1. 202 * MP4: Add support for Dolby TrueHD (only for unfragmented streams) 203 ([#9496](https://github.com/google/ExoPlayer/issues/9496)). 204 * MP4: Avoid throwing `ArrayIndexOutOfBoundsException` when parsing 205 invalid `colr` boxes produced by some device cameras 206 ([#9332](https://github.com/google/ExoPlayer/issues/9332)). 207 * MP4: Parse HDR static metadata from the `clli` and `mdcv` boxes. 208 * TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1. 209 * TS: Map stream type 0x80 to H262 210 ([#9472](https://github.com/google/ExoPlayer/issues/9472)). 211* Downloads and caching: 212 * Modify `DownloadService` behavior when `DownloadService.getScheduler` 213 returns `null`, or returns a `Scheduler` that does not support the 214 requirements for downloads to continue. In both cases, `DownloadService` 215 will now remain started and in the foreground whilst waiting for 216 requirements to be met. 217 * Modify `DownloadService` behavior when running on Android 12 and above. 218 See the "Android 12 compatibility" section above. 219* RTSP: 220 * Support RFC4566 SDP attribute field grammar 221 ([#9430](https://github.com/google/ExoPlayer/issues/9430)). 222* DASH: 223 * Populate `Format.sampleMimeType`, `width` and `height` for image 224 `AdaptationSet` elements 225 ([#9500](https://github.com/google/ExoPlayer/issues/9500)). 226* HLS: 227 * Fix rounding error in HLS playlists 228 ([#9575](https://github.com/google/ExoPlayer/issues/9575)). 229 * Fix `NoSuchElementException` thrown when an HLS manifest declares 230 `#EXT-X-RENDITION-REPORT` at the beginning of the playlist 231 ([#9592](https://github.com/google/ExoPlayer/issues/9592)). 232* RTMP extension: 233 * Upgrade to `io.antmedia:rtmp_client`, which does not rely on `jcenter()` 234 ([#9591](https://github.com/google/ExoPlayer/issues/9591)). 235* MediaSession extension: 236 * Rename 237 `MediaSessionConnector.QueueNavigator#onCurrentWindowIndexChanged` to 238 `onCurrentMediaItemIndexChanged`. 239* Transformer: 240 * Avoid sending a duplicate timestamp to the encoder with the end of 241 stream buffer. 242* Remove deprecated symbols: 243 * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named 244 constants in `C` instead. 245 * Remove `C.MSG_*` constants. Use identically named constants in 246 `Renderer` instead, except for `C.MSG_SET_SURFACE`, which is replaced 247 with `Renderer.MSG_SET_VIDEO_OUTPUT`. 248 * Remove `DeviceListener`. Use `Player.Listener` instead. 249 * Remove `CacheDataSourceFactory`. Use `CacheDataSource.Factory` instead. 250 * Remove `CacheDataSinkFactory`. Use `CacheDataSink.Factory` instead. 251 * Remove `FileDataSourceFactory`. Use `FileDataSource.Factory` instead. 252 * Remove `SimpleExoPlayer.addMetadataOutput` and `removeMetadataOutput`. 253 Use `Player.addListener` and `Player.Listener` instead. 254 * Remove `SimpleExoPlayer.addAudioListener`, `removeAudioListener` and 255 `AudioListener`. Use `Player.addListener` and `Player.Listener` instead. 256 * Remove `SimpleExoPlayer.addVideoListener`, `removeVideoListener` and 257 `VideoListener`. Use `Player.addListener` and `Player.Listener` instead. 258 * Remove `DefaultHttpDataSourceFactory`. Use 259 `DefaultHttpDataSource.Factory` instead. 260 * Remove `SingleSampleMediaSource.createMediaSource(Uri, Format, long)`. 261 Use `SingleSampleMediaSource.createMediaSource(MediaItem.Subtitle, 262 long)` instead. 263 * Remove `HttpDataSource.Factory.getDefaultRequestProperties`. Use 264 `HttpDataSource.Factory.setDefaultRequestProperties` instead. 265 * Remove `GvrAudioProcessor` and the GVR extension, which has been 266 deprecated since 2.11.0. 267 * Remove `DownloadService.onDownloadChanged` and 268 `DownloadService.onDownloadRemoved`. Instead, use 269 `DownloadManager.addListener` to register a listener directly to the 270 `DownloadManager` returned through `DownloadService.getDownloadManager`. 271 * Remove `Player.getCurrentStaticMetadata`, 272 `Player.Listener.onStaticMetadataChanged` and 273 `Player.EVENT_STATIC_METADATA_CHANGED`. Use `Player.getMediaMetadata`, 274 `Player.Listener.onMediaMetadataChanged` and 275 `Player.EVENT_MEDIA_METADATA_CHANGED` for convenient access to 276 structured metadata, or access the raw static metadata directly from the 277 `TrackSelection#getFormat()`. 278 * Remove `ControlDispatcher` and `DefaultControlDispatcher`. Operations 279 can be customized by using a `ForwardingPlayer`, or when configuring the 280 player (for example by using 281 `ExoPlayer.Builder.setSeekBackIncrementMs`). 282 283### 2.15.1 (2021-09-20) 284 285* Core Library: 286 * Fix track selection in `StyledPlayerControlView` when using 287 `ForwardingPlayer`. 288 * Fix `FlagSet#equals` on API levels below 24. 289 * Fix `NullPointerException` being thrown from `CacheDataSource` when 290 reading a fully cached resource with `DataSpec.position` equal to the 291 resource length. 292 * Fix a bug when [depending on ExoPlayer locally](README.md#locally) with 293 a relative path 294 ([#9403](https://github.com/google/ExoPlayer/issues/9403)). 295 * Better handle invalid seek requests. Seeks to positions that are before 296 the start or after the end of the media are now handled as seeks to the 297 start and end respectively 298 ([8906](https://github.com/google/ExoPlayer/issues/8906)). 299 * Rename `MimeTypes.AUDIO_DTS_UHD` to `MimeTypes.AUDIO_DTS_X` and add 300 required profile to its value 301 ([#9429](https://github.com/google/ExoPlayer/issues/9429)). 302* Extractors: 303 * Support TS packets without PTS flag 304 ([#9294](https://github.com/google/ExoPlayer/issues/9294)). 305 * Fix issue decoding ID3 tags containing UTF-16 encoded strings 306 ([#9087](https://github.com/google/ExoPlayer/issues/9087)). 307* Video: 308 * Request smaller decoder input buffers for Dolby Vision. This fixes an 309 issue that could cause UHD Dolby Vision playbacks to fail on some 310 devices, including Amazon Fire TV 4K. 311* DRM: 312 * Fix `DefaultDrmSessionManager` to correctly eagerly release preacquired 313 DRM sessions when there's a shortage of DRM resources on the device. 314* Downloads and caching: 315 * Workaround platform issue that can cause a `SecurityException` to be 316 thrown from `Requirements.isInternetConnectivityValidated` on devices 317 running Android 11 318 ([#9002](https://github.com/google/ExoPlayer/issues/9002)). 319* DASH: 320 * Use identical cache keys for downloading and playing DASH segments 321 ([#9370](https://github.com/google/ExoPlayer/issues/9370)). 322 * Fix base URL selection and load error handling when base URLs are shared 323 across adaptation sets. 324* HLS: 325 * Fix bug where the player would get stuck if all download attempts fail 326 and would not raise an error to the application 327 ([#9390](https://github.com/google/ExoPlayer/issues/9390)). 328* RTSP: 329 * Handle when additional spaces are in SDP's RTPMAP atrribute 330 ([#9379](https://github.com/google/ExoPlayer/issues/9379)). 331 * Handle partial URIs in RTP-Info headers 332 ([#9346](https://github.com/google/ExoPlayer/issues/9346)). 333 * Fix RTSP Session header handling 334 ([#9416](https://github.com/google/ExoPlayer/issues/9416)). 335 * Fix RTSP WWW-Authenticate header parsing 336 ([#9428](https://github.com/google/ExoPlayer/issues/9428)). 337* UI: 338 * Use `defStyleAttr` when obtaining styled attributes in 339 `StyledPlayerView`, `PlayerView` and `PlayerControlView` 340 ([#9024](https://github.com/google/ExoPlayer/issues/9024)). 341 * Fix accessibility focus in `PlayerControlView` 342 ([#9111](https://github.com/google/ExoPlayer/issues/9111)). 343 * Fix issue that `StyledPlayerView` and `PlayerView` don't update UI when 344 available player commands change. 345* Cast extension: 346 * Implement `CastPlayer.setPlaybackParameters(PlaybackParameters)` to 347 support setting the playback speed 348 ([#6784](https://github.com/google/ExoPlayer/issues/6784)). 349 350### 2.15.0 (2021-08-10) 351 352* Core Library: 353 * Add `MediaCodecAdapter.needsReconfiguration` method. 354 * Add `getSeekBackIncrement`, `seekBack`, `getSeekForwardIncrement`, 355 `seekForward`, `getMaxSeekToPreviousPosition`, `seekToPrevious` and 356 `seekToNext` methods to `Player`. 357 * Rename `Player` methods: 358 * `hasPrevious` to `hasPreviousWindow`. 359 * `previous` to `seekToPreviousWindow`. 360 * `hasNext` to `hasNextWindow`. 361 * `next` to `seekToNextWindow`. 362 * Rename `Player` commands: 363 * `COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM` to 364 `COMMAND_SEEK_IN_CURRENT_WINDOW`. 365 * `COMMAND_SEEK_TO_NEXT_MEDIA_ITEM` to `COMMAND_SEEK_TO_NEXT_WINDOW`. 366 * `COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM` to 367 `COMMAND_SEEK_TO_PREVIOUS_WINDOW`. 368 * `COMMAND_SEEK_TO_MEDIA_ITEM` to `COMMAND_SEEK_TO_WINDOW`. 369 * `COMMAND_GET_MEDIA_ITEMS` to `COMMAND_GET_TIMELINE`. 370 * Rename `Player.EventFlags` IntDef to `Player.Event`. 371 * Make `Player` depend on the new `PlaybackException` class instead of 372 `ExoPlaybackException`: 373 * `Player.getPlayerError` now returns a `PlaybackException`. 374 * `Player.Listener.onPlayerError` now receives a `PlaybackException`. 375 * Add a new listener method `Player.Listener.onPlayerErrorChanged`, 376 which is equivalent to `onPlayerError` except that it is also called 377 when the player error becomes `null`. 378 * `Player` implementations like `ExoPlayer` may use 379 `PlaybackException` subclasses (like `ExoPlaybackException`), so 380 users can downcast the `PlaybackException` instance to obtain 381 implementation-specific fields (like 382 `ExoPlaybackException.rendererIndex`). 383 * `PlaybackException` introduces an `errorCode` which identifies the cause 384 of the failure in order to simplify error handling 385 ([#1611](https://github.com/google/ExoPlayer/issues/1611)). 386 * Add a `DefaultMediaDescriptionAdapter` for the 387 `PlayerNotificationManager`, that makes use of the `Player` 388 `MediaMetadata` to populate the notification fields. 389 * Add `@FallbackType` to `LoadErrorHandlingPolicy` to support 390 customization of the exclusion duration for locations and tracks. 391 * Change interface of `LoadErrorHandlingPolicy` to support configuring the 392 behavior of track and location fallback. Location fallback is currently 393 only supported for DASH manifests with multiple base URLs. 394 * Restrict use of `AudioTrack.isDirectPlaybackSupported` to TVs, to avoid 395 listing audio offload encodings as supported for passthrough mode on 396 mobile devices 397 ([#9239](https://github.com/google/ExoPlayer/issues/9239)). 398* Extractors: 399 * Add support for DTS-UHD in MP4 400 ([#9163](https://github.com/google/ExoPlayer/issues/9163)). 401* Text: 402 * TTML: Inherit the `rubyPosition` value from a containing `<span 403 ruby="container">` element. 404 * WebVTT: Add support for CSS `font-size` property 405 ([#8964](https://github.com/google/ExoPlayer/issues/8964)). 406* Ad playback: 407 * Support changing ad break positions in the player logic 408 ([#5067](https://github.com/google/ExoPlayer/issues/5067)). 409 * Support resuming content with an offset after an ad group. 410* UI: 411 * Add `setUseRewindAction` and `setUseFastForwardAction` to 412 `PlayerNotificationManager`, and `setUseFastForwardActionInCompactView` 413 and `setUseRewindActionInCompactView` to show the actions in compact 414 view mode. 415 * Remove `rewind_increment` and `fastforward_increment` attributes from 416 `PlayerControlView` and `StyledPlayerControlView`. These increments can 417 be customized by configuring the `Player` (see `setSeekBackIncrementMs` 418 and `setSeekForwardIncrementMs` in `SimpleExoPlayer.Builder`), or by 419 using a `ForwardingPlayer` that overrides `getSeekBackIncrement`, 420 `seekBack`, `getSeekForwardIncrement` and `seekForward`. The rewind and 421 fast forward buttons can be disabled by using a `ForwardingPlayer` that 422 removes `COMMAND_SEEK_BACK` and `COMMAND_SEEK_FORWARD` from the 423 available commands. 424 * Update `DefaultControlDispatcher` `getRewindIncrementMs` and 425 `getFastForwardIncrementMs` to take the player as parameter. 426* DASH: 427 * Add support for multiple base URLs and DVB attributes in the manifest. 428 Apps that are using `DefaultLoadErrorHandlingPolicy` with such manifests 429 have base URL fallback automatically enabled 430 ([#771](https://github.com/google/ExoPlayer/issues/771), 431 [#7654](https://github.com/google/ExoPlayer/issues/7654)). 432* HLS: 433 * Fix issue that could cause some playbacks to be stuck buffering 434 ([#8850](https://github.com/google/ExoPlayer/issues/8850), 435 [#9153](https://github.com/google/ExoPlayer/issues/9153)). 436 * Report audio track type in 437 `AnalyticsListener.onDownstreamFormatChanged()` for audio-only 438 playlists, so that the `PlaybackStatsListener` can derive audio 439 format-related information 440 ([#9175](https://github.com/google/ExoPlayer/issues/9175)). 441* RTSP: 442 * Use standard RTSP header names 443 ([#9182](https://github.com/google/ExoPlayer/issues/9182)). 444 * Handle an extra semicolon in SDP fmtp attribute 445 ([#9247](https://github.com/google/ExoPlayer/pull/9247)). 446 * Fix handling of special characters in the RTSP session ID 447 ([#9254](https://github.com/google/ExoPlayer/issues/9254)). 448* SmoothStreaming: 449 * Propagate `StreamIndex` element `Name` attribute value as `Format` label 450 ([#9252](https://github.com/google/ExoPlayer/issues/9252)). 451* Cronet extension: 452 * Add `CronetDataSource.Factory.setRequestPriority` to allow setting the 453 priority of requests made by `CronetDataSource` instances. 454* OkHttp extension: 455 * Switch to OkHttp 4.9.1. This increases the extension's minimum SDK 456 version requirement from 16 to 21. 457* Remove deprecated symbols: 458 * Remove `CastPlayer` specific playlist manipulation methods. Use 459 `setMediaItems`, `addMediaItems`, `removeMediaItem` and `moveMediaItem` 460 instead. 461 * Remove `Format.create` methods. Use `Format.Builder` instead. 462 * Remove `MediaSource.getTag`. Use `MediaSource.getMediaItem` and 463 `MediaItem.PlaybackProperties.tag` instead. 464 * Remove `PlaybackPreparer`. UI components that previously had 465 `setPlaybackPreparer` methods will now call `Player.prepare` by default. 466 If this behavior is sufficient, use of `PlaybackPreparer` can be removed 467 from application code without replacement. For custom preparation logic, 468 use a `ForwardingPlayer` that implements custom preparation logic in 469 `prepare`. 470 * Remove `Player.Listener.onTimelineChanged(Timeline, Object, int)`. Use 471 `Player.Listener.onTimelineChanged(Timeline, int)` instead. The manifest 472 can be accessed using `Player.getCurrentManifest`. 473 * Remove `Player.getCurrentTag`. Use `Player.getCurrentMediaItem` and 474 `MediaItem.PlaybackProperties.tag` instead. 475 * Remove `Player.getPlaybackError`. Use `Player.getPlayerError` instead. 476 * Remove `PlayerNotificationManager` constructors and `createWith` 477 methods. Use `PlayerNotificationManager.Builder` instead. 478 * Remove `PlayerNotificationManager.setNotificationListener`. Use 479 `PlayerNotificationManager.Builder.setNotificationListener` instead. 480 * Remove `PlayerNotificationManager` `setUseNavigationActions` and 481 `setUseNavigationActionsInCompactView`. Use `setUseNextAction`, 482 `setUsePreviousAction`, `setUseNextActionInCompactView` and 483 `setUsePreviousActionInCompactView` instead. 484 * Remove `setRewindIncrementMs` and `setFastForwardIncrementMs` from UI 485 components. These increments can be customized by configuring the 486 `Player` (see `setSeekBackIncrementMs` and `setSeekForwardIncrementMs` 487 in `SimpleExoPlayer.Builder`), or by using a `ForwardingPlayer` that 488 overrides `getSeekBackIncrement`, `seekBack`, `getSeekForwardIncrement` 489 and `seekForward`. The rewind and fast forward buttons can be disabled 490 by using a `ForwardingPlayer` that removes `COMMAND_SEEK_BACK` and 491 `COMMAND_SEEK_FORWARD` from the available commands. 492 * Remove `Timeline.getWindow(int, Window, boolean)`. Use 493 `Timeline.getWindow(int, Window)` instead, which will always set tags. 494 495### 2.14.2 (2021-07-20) 496 497* Core Library: 498 * Explicitly mark several methods on `SimpleExoPlayer` as `@Deprecated`. 499 These methods are all overrides and are already deprecated on `Player` 500 and the respective `ExoPlayer` component classes (since 2.14.0). 501* Video: 502 * Fix `IncorrectContextUseViolation` strict mode warning on Android 11 503 ([#8246](https://github.com/google/ExoPlayer/pull/8246)). 504* Audio: 505 * Fix track selection for E-AC-3 streams. 506 * Use `AudioTrack.isDirectPlaybackSupported` to check for encoded audio 507 passthrough capability from API 29 onwards, instead of using the HDMI 508 audio plug intent 509 ([#6500](https://github.com/google/ExoPlayer/pull/6500)). 510* Extractors: 511 * Fix issue where a `trun` atom could be associated with the wrong track 512 in an FMP4 stream 513 ([#9056](https://github.com/google/ExoPlayer/pull/9056)). The fix 514 removes a previous workaround to handle content in which the `track_ID` 515 is set incorrectly 516 ([#4083](https://github.com/google/ExoPlayer/issues/4083)). Such content 517 is malformed and should be re-encoded. 518 * Improve support for truncated Ogg streams 519 ([#7608](https://github.com/google/ExoPlayer/issues/7608)). 520 * Add support for MP4 H263 atom type 521 ([#9158](https://github.com/google/ExoPlayer/issues/9158)). 522 * Fix issue around TS synchronization when reading a file's duration 523 ([#9100](https://github.com/google/ExoPlayer/pull/9100)). 524* HLS: 525 * Fix issue where playback of a live event could become stuck rather than 526 transitioning to `STATE_ENDED` when the event ends 527 ([#9067](https://github.com/google/ExoPlayer/issues/9067)). 528 * Fix issue where a new initialization segment, as specified by an 529 `EXT-X-MAP` tag in a media playlist, would not be loaded when 530 encountered during playback 531 ([#9004](https://github.com/google/ExoPlayer/issues/9004)). 532 * Forward the `FRAME-RATE` value from the master playlist to renditions. 533 ([#8960](https://github.com/google/ExoPlayer/issues/8960)). 534 * Fix issue where HLS events would start at positions greater than 535 specified by an `EXT-X-START` tag when placed in a playlist 536 ([#9037](https://github.com/google/ExoPlayer/issues/9037)). 537* Ad playback: 538 * Use the content URI when auto-generating an ad ID (in addition to the 539 media ID and ad tag URI) 540 ([#9106](https://github.com/google/ExoPlayer/issues/9106). 541* DRM: 542 * Allow repeated provisioning in `DefaultDrmSession(Manager)`. 543 * Fix a crash due to `DefaultDrmSessionManager.release()` incorrectly 544 releasing too many keep-alive `DefaultDrmSession` references, resulting 545 in `DefaultDrmSession.release()` throwing an `IllegalStateException` 546 ([#9193](https://github.com/google/ExoPlayer/issues/9193)). 547* Metadata: 548 * Fix handling of emsg messages with an unset duration 549 ([#9123](https://github.com/google/ExoPlayer/issues/9123)). 550* UI: 551 * Add `PendingIntent.FLAG_IMMUTABLE` when creating broadcast intents in 552 `PlayerNotificationManager`. This is required by a 553 [behaviour change](https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability) 554 in Android 12. 555 * Fix focusability of `StyledPlayerView` and `StyledPlayerControlView` 556 popup menus on API levels prior to 26 557 ([#9061](https://github.com/google/ExoPlayer/issues/9061)). 558 * Fix progress bar flickering immediately after the user seeks 559 ([#9049](https://github.com/google/ExoPlayer/pull/9049)). 560 * Fix `StyledPlayerView` and `StyledPlayerControlView` popup menu items 561 not expanding to occupy the full width of the popup 562 ([#9086](https://github.com/google/ExoPlayer/issues/9086)). 563 * Don't propagate `AttributeSet` from `SubtitleView` constructor into 564 `CanvasSubtitleOutput`. Just passing the `Context` is enough, and 565 ensures programmatic changes to the `SubtitleView` will propagate down. 566* RTSP: 567 * Fix session description (SDP) parsing to use a HashMap-like behaviour 568 for duplicated attributes. 569 ([#9014](https://github.com/google/ExoPlayer/issues/9014)). 570 * Allow using absolute URI in the control attribute in a media description 571 ([#9183](https://github.com/google/ExoPlayer/issues/9183)). 572 * Allow the timeout to be customised via 573 `RtspMediaSource.Factory.setTimeoutMs`. 574 575### 2.14.1 (2021-06-11) 576 577* Core Library: 578 * Fix gradle config to allow specifying a relative path for 579 `exoplayerRoot` when [depending on ExoPlayer locally](README.md#locally) 580 ([#8927](https://github.com/google/ExoPlayer/issues/8927)). 581 * Update `MediaItem.Builder` javadoc to discourage calling setters that 582 will be (currently) ignored if another setter is not also called. 583* Extractors: 584 * Add support for MPEG-H 3D Audio in MP4 extractors 585 ([#8860](https://github.com/google/ExoPlayer/pull/8860)). 586* Video: 587 * Fix bug that could cause `CodecException: Error 0xffffffff` to be thrown 588 from `MediaCodec.native_setSurface` in use cases that involve both 589 swapping the output `Surface` and a mixture of secure and non-secure 590 content being played 591 ([#8776](https://github.com/google/ExoPlayer/issues/8776)). 592* HLS: 593 * Use the `PRECISE` attribute in `EXT-X-START` to select the default start 594 position. 595 * Fix a bug where skipping into spliced-in chunks triggered an assertion 596 error ([#8937](https://github.com/google/ExoPlayer/issues/8937)). 597* DRM: 598 * Keep secure `MediaCodec` instances initialized when disabling (but not 599 resetting) `MediaCodecRenderer`. This helps re-use secure decoders in 600 more contexts, which avoids the 'black flash' caused by detaching a 601 `Surface` from a secure decoder on some devices 602 ([#8842](https://github.com/google/ExoPlayer/issues/8842)). It will also 603 result in DRM license refresh network requests while the player is 604 stopped if `Player#setForegroundMode` is true. 605 * Fix issue where offline keys were unnecessarily (and incorrectly) 606 restored into a session before being released. This call sequence is 607 explicitly disallowed in OEMCrypto v16. 608* UI: 609 * Keep subtitle language features embedded (e.g. rubies & tate-chu-yoko) 610 in `Cue.text` even when `SubtitleView#setApplyEmbeddedStyles()` is 611 `false`. 612 * Fix `NullPointerException` in `StyledPlayerView` that could occur after 613 calling `StyledPlayerView.setPlayer(null)` 614 ([#8985](https://github.com/google/ExoPlayer/issues/8985)). 615* RTSP: 616 * Add support for RTSP basic and digest authentication 617 ([#8941](https://github.com/google/ExoPlayer/issues/8941)). 618 * Enable using repeat mode and playlist with RTSP 619 ([#8994](https://github.com/google/ExoPlayer/issues/8994)). 620 * Add `RtspMediaSource.Factory` option to set the RTSP user agent. 621 * Add `RtspMediaSource.Factory` option to force using TCP for streaming. 622* GL demo app: 623 * Fix texture transformation to avoid green bars shown on some videos 624 ([#8992](https://github.com/google/ExoPlayer/issues/8992)). 625 626### 2.14.0 (2021-05-13) 627 628* Core Library: 629 * Move `Player` components to `ExoPlayer`. For example 630 `Player.VideoComponent` is now `ExoPlayer.VideoComponent`. 631 * The most used methods of `Player`'s audio, video, text and metadata 632 components have been added directly to `Player`. 633 * Add `Player.getAvailableCommands`, `Player.isCommandAvailable` and 634 `Listener.onAvailableCommandsChanged` to query which commands that can 635 be executed on the player. 636 * Add a `Player.Listener` interface to receive all player events. 637 Component listeners and `EventListener` have been deprecated. 638 * Add `Player.getMediaMetadata`, which returns a combined and structured 639 `MediaMetadata` object. Changes to metadata are reported to 640 `Listener.onMediaMetadataChanged`. 641 * `Player.setPlaybackParameters` no longer accepts null, use 642 `PlaybackParameters.DEFAULT` instead. 643 * Report information about the old and the new playback positions to 644 `Listener.onPositionDiscontinuity`. Add `DISCONTINUITY_REASON_SKIP` and 645 `DISCONTINUITY_REASON_REMOVE` as discontinuity reasons, and rename 646 `DISCONTINUITY_REASON_PERIOD_TRANSITION` to 647 `DISCONTINUITY_REASON_AUTO_TRANSITION`. Remove 648 `DISCONTINUITY_REASON_AD_INSERTION`, for which 649 `DISCONTINUITY_REASON_AUTO_TRANSITION` is used instead 650 ([#6163](https://github.com/google/ExoPlayer/issues/6163), 651 [#4768](https://github.com/google/ExoPlayer/issues/4768)). 652 * Deprecate `ExoPlayer.Builder`. Use `SimpleExoPlayer.Builder` instead. 653 * Move `Player.getRendererCount` and `Player.getRendererType` to 654 `ExoPlayer`. 655 * Use an empty string instead of the URI if the media ID is not explicitly 656 set with `MediaItem.Builder.setMediaId(String)`. 657 * Remove `MediaCodecRenderer.configureCodec()` and add 658 `MediaCodecRenderer.getMediaCodecConfiguration()`. The new method is 659 called just before the `MediaCodec` is created and returns the 660 parameters needed to create and configure the `MediaCodec` instance. 661 Applications can override `MediaCodecRenderer.onCodecInitialized()` to 662 be notified after a `MediaCodec` is initialized, or they can inject a 663 custom `MediaCodecAdapter.Factory` if they want to control how the 664 `MediaCodec` is configured. 665 * Promote `AdaptiveTrackSelection.AdaptationCheckpoint` to `public` 666 visibility to allow Kotlin subclasses of 667 `AdaptiveTrackSelection.Factory` 668 ([#8830](https://github.com/google/ExoPlayer/issues/8830)). 669 * Fix bug when transitions from content to ad periods called 670 `onMediaItemTransition` by mistake. 671 * `AdsLoader.AdViewProvider` and `AdsLoader.OverlayInfo` have been renamed 672 `com.google.android.exoplayer2.ui.AdViewProvider` and 673 `com.google.android.exoplayer2.ui.AdOverlayInfo` respectively. 674 * `CaptionStyleCompat` has been moved to the 675 `com.google.android.exoplayer2.ui` package. 676 * `DebugTextViewHelper` has been moved from the `ui` package to the `util` 677 package. 678* RTSP: 679 * Initial support for RTSP playbacks 680 ([#55](https://github.com/google/ExoPlayer/issues/55)). 681* Downloads and caching: 682 * Fix `CacheWriter` to correctly handle cases where the request `DataSpec` 683 extends beyond the end of the underlying resource. Caching will now 684 succeed in this case, with data up to the end of the resource being 685 cached. This behaviour is enabled by default, and so the 686 `allowShortContent` parameter has been removed 687 ([#7326](https://github.com/google/ExoPlayer/issues/7326)). 688 * Fix `CacheWriter` to correctly handle `DataSource.close` failures, for 689 which it cannot be assumed that data was successfully written to the 690 cache. 691* DRM: 692 * Prepare DRM sessions (and fetch keys) ahead of the playback position 693 ([#4133](https://github.com/google/ExoPlayer/issues/4133)). 694 * Only dispatch DRM session acquire and release events once per period 695 when playing content that uses the same encryption keys for both audio & 696 video tracks. Previously, separate acquire and release events were 697 dispatched for each track in each period. 698 * Include the session state in DRM session-acquired listener methods. 699* UI: 700 * Add `PlayerNotificationManager.Builder`, with the ability to specify 701 which group the notification should belong to. 702 * Remove `setUseSensorRotation` from `PlayerView` and `StyledPlayerView`. 703 Instead, cast the view returned by `getVideoSurfaceView` to 704 `SphericalGLSurfaceView`, and then call `setUseSensorRotation` on the 705 `SphericalGLSurfaceView` directly. 706* Analytics: 707 * Add `onAudioCodecError` and `onVideoCodecError` to `AnalyticsListener`. 708* Video: 709 * Add `Player.getVideoSize()` to retrieve the current size of the video 710 stream. Add `Listener.onVideoSizeChanged(VideoSize)` and deprecate 711 `Listener.onVideoSizeChanged(int, int, int, float)`. 712* Audio: 713 * Report unexpected audio discontinuities to 714 `AnalyticsListener.onAudioSinkError` 715 ([#6384](https://github.com/google/ExoPlayer/issues/6384)). 716 * Allow forcing offload for gapless content even if gapless playback is 717 not supported. 718 * Allow fall back from DTS-HD to DTS when playing via passthrough. 719* Text: 720 * Fix overlapping lines when using `SubtitleView.VIEW_TYPE_WEB`. 721 * Parse SSA/ASS underline & strikethrough info in `Style:` lines 722 ([#8435](https://github.com/google/ExoPlayer/issues/8435)). 723 * Ensure TTML `tts:textAlign` is correctly propagated from `<p>` nodes to 724 child nodes. 725 * Support TTML `ebutts:multiRowAlign` attributes. 726* Allow the use of Android platform extractors through 727 [MediaParser](https://developer.android.com/reference/android/media/MediaParser). 728 Only supported on API 30+. 729 * You can use platform extractors for progressive media by passing 730 `MediaParserExtractorAdapter.FACTORY` when creating a 731 `ProgressiveMediaSource.Factory`. 732 * You can use platform extractors for HLS by passing 733 `MediaParserHlsMediaChunkExtractor.FACTORY` when creating a 734 `HlsMediaSource.Factory`. 735 * You can use platform extractors for DASH by passing a 736 `DefaultDashChunkSource` that uses `MediaParserChunkExtractor.FACTORY` 737 when creating a `DashMediaSource.Factory`. 738* Cast extension: 739 * Trigger `onMediaItemTransition` event for all reasons except 740 `MEDIA_ITEM_TRANSITION_REASON_REPEAT`. 741* MediaSession extension: 742 * Remove dependency on `exoplayer-core`, relying only `exoplayer-common` 743 instead. To achieve this, `TimelineQueueEditor` uses a new 744 `MediaDescriptionConverter` interface, and no longer relies on 745 `ConcatenatingMediaSource`. 746* Remove deprecated symbols: 747 * Remove `ExoPlayerFactory`. Use `SimpleExoPlayer.Builder` instead. 748 * Remove `Player.DefaultEventListener`. Use `Player.Listener` instead. 749 * Remove `ExtractorMediaSource`. Use `ProgressiveMediaSource` instead. 750 * Remove `DefaultMediaSourceEventListener`. Use `MediaSourceEventListener` 751 instead. 752 * Remove `DashManifest` constructor. Use the remaining constructor with 753 `programInformation` and `serviceDescription` set to `null` instead. 754 * Remove `CryptoInfo.getFrameworkCryptoInfoV16`. Use 755 `CryptoInfo.getFrameworkCryptoInfo` instead. 756 * Remove `NotificationUtil.createNotificationChannel(Context, String, int, 757 int)`. Use `createNotificationChannel(Context, String, int, int, int)` 758 instead. 759 * Remove `PlayerNotificationManager.setNotificationListener`. Use 760 `PlayerNotificationManager.Builder.setNotificationListener` instead. 761 * Remove `PlayerNotificationManager.NotificationListener` 762 `onNotificationStarted(int, Notification)` and 763 `onNotificationCancelled(int)`. Use `onNotificationPosted(int, 764 Notification, boolean)` and `onNotificationCancelled(int, boolean)` 765 instead. 766 * Remove `DownloadNotificationUtil`. Use `DownloadNotificationHelper` 767 instead. 768 * Remove `extension-jobdispatcher` module. Use the `extension-workmanager` 769 module instead. 770 771### 2.13.3 (2021-04-14) 772 773* Published via the Google Maven repository (i.e., google()) rather than 774 JCenter. 775* Core: 776 * Reset playback speed when live playback speed control becomes unused 777 ([#8664](https://github.com/google/ExoPlayer/issues/8664)). 778 * Fix playback position issue when re-preparing playback after a 779 `BehindLiveWindowException` 780 ([#8675](https://github.com/google/ExoPlayer/issues/8675)). 781 * Assume Dolby Vision content is encoded as H264 when calculating maximum 782 codec input size 783 ([#8705](https://github.com/google/ExoPlayer/issues/8705)). 784* UI: 785 * Fix `StyledPlayerView` scrubber not reappearing correctly in some cases 786 ([#8646](https://github.com/google/ExoPlayer/issues/8646)). 787 * Fix measurement of `StyledPlayerView` and `StyledPlayerControlView` when 788 `wrap_content` is used 789 ([#8726](https://github.com/google/ExoPlayer/issues/8726)). 790 * Fix `StyledPlayerControlView` to stay in full mode (rather than minimal 791 mode) when possible 792 ([#8763](https://github.com/google/ExoPlayer/issues/8763)). 793* DASH: 794 * Parse `forced_subtitle` role from DASH manifests 795 ([#8781](https://github.com/google/ExoPlayer/issues/8781)). 796* DASH: 797 * Fix rounding error that could cause `SegmentTemplate.getSegmentCount()` 798 to return incorrect values 799 ([#8804](https://github.com/google/ExoPlayer/issues/8804)). 800* HLS: 801 * Fix bug of ignoring `EXT-X-START` when setting the live target offset 802 ([#8764](https://github.com/google/ExoPlayer/pull/8764)). 803 * Fix incorrect application of byte ranges to `EXT-X-MAP` tags 804 ([#8783](https://github.com/google/ExoPlayer/issues/8783)). 805 * Fix issue that could cause playback to become stuck if corresponding 806 `EXT-X-DISCONTINUITY` tags in different media playlists occur at 807 different positions in time 808 ([#8372](https://github.com/google/ExoPlayer/issues/8372)). 809 * Fix issue that could cause playback of on-demand content to not start in 810 cases where the media playlists referenced by the master playlist have 811 different starting `EXT-X-PROGRAM-DATE-TIME` tags. 812 * Fix container type detection for segments with incorrect file extension 813 or HTTP Content-Type 814 ([#8733](https://github.com/google/ExoPlayer/issues/8733)). 815* Extractors: 816 * Add support for `GContainer` and `GContainerItem` XMP namespace prefixes 817 in JPEG motion photo parsing. 818 * Allow JFIF APP0 marker segment preceding Exif APP1 segment in 819 `JpegExtractor`. 820* Text: 821 * Parse SSA/ASS bold & italic info in `Style:` lines 822 ([#8435](https://github.com/google/ExoPlayer/issues/8435)). 823 * Don't display subtitles after the end position of the current media 824 period (if known). This ensures sideloaded subtitles respect the end 825 point of `ClippingMediaPeriod` and prevents content subtitles from 826 continuing to be displayed over mid-roll ads 827 ([#5317](https://github.com/google/ExoPlayer/issues/5317), 828 [#8456](https://github.com/google/ExoPlayer/issues/8456)). 829 * Fix CEA-708 priority handling to sort cues in the order defined by the 830 spec ([#8704](https://github.com/google/ExoPlayer/issues/8704)). 831 * Support TTML `textEmphasis` attributes, used for Japanese boutens. 832 * Support TTML `shear` attributes. 833* Metadata: 834 * Ensure that timed metadata near the end of a period is not dropped 835 ([#8710](https://github.com/google/ExoPlayer/issues/8710)). 836* Cast extension: 837 * Fix `onPositionDiscontinuity` event so that it is not triggered with 838 reason `DISCONTINUITY_REASON_PERIOD_TRANSITION` after a seek to another 839 media item and so that it is not triggered after a timeline change. 840* IMA extension: 841 * Fix error caused by `AdPlaybackState` ad group times being cleared, 842 which can occur if the `ImaAdsLoader` is released while an ad is pending 843 loading ([#8693](https://github.com/google/ExoPlayer/issues/8693)). 844 * Upgrade IMA SDK dependency to 3.23.0, fixing an issue with 845 `NullPointerExceptions` within `WebView` callbacks 846 ([#8447](https://github.com/google/ExoPlayer/issues/8447)). 847* FFmpeg extension: Fix playback failure when switching to TrueHD tracks 848 during playback ([#8616](https://github.com/google/ExoPlayer/issues/8616)). 849 850### 2.13.2 (2021-02-25) 851 852* Extractors: 853 * Add support for MP4 and QuickTime meta atoms that are not full atoms. 854* UI: 855 * Make conditions to enable UI actions consistent in 856 `DefaultControlDispatcher`, `PlayerControlView`, 857 `StyledPlayerControlView`, `PlayerNotificationManager` and 858 `TimelineQueueNavigator`. 859 * Fix conditions to enable seeking to next/previous media item to handle 860 the case where a live stream has ended. 861* Audio: 862 * Fix `SimpleExoPlayer` reporting audio session ID as 0 in some cases 863 ([#8585](https://github.com/google/ExoPlayer/issues/8585)). 864* IMA extension: 865 * Fix a bug where playback could get stuck when seeking into a playlist 866 item with ads, if the preroll ad had preloaded but the window position 867 of the seek should instead trigger playback of a midroll. 868 * Fix a bug with playback of ads in playlists, where the incorrect period 869 index was used when deciding whether to trigger playback of an ad after 870 a seek. 871* Text: 872 * Parse SSA/ASS font size in `Style:` lines 873 ([#8435](https://github.com/google/ExoPlayer/issues/8435)). 874* VP9 extension: Update to use NDK r21 875 ([#8581](https://github.com/google/ExoPlayer/issues/8581)). 876* FLAC extension: Update to use NDK r21 877 ([#8581](https://github.com/google/ExoPlayer/issues/8581)). 878* Opus extension: Update to use NDK r21 879 ([#8581](https://github.com/google/ExoPlayer/issues/8581)). 880* FFmpeg extension: Update to use NDK r21 881 ([#8581](https://github.com/google/ExoPlayer/issues/8581)). 882 883### 2.13.1 (2021-02-12) 884 885* Live streaming: 886 * Fix playback issue for HLS live streams without program date time 887 information ([#8560](https://github.com/google/ExoPlayer/issues/8560)). 888 * Fix playback issue for multi-period DASH live streams 889 ([#8537](https://github.com/google/ExoPlayer/issues/8537)). 890 * Fix playback failures when playing live streams with video tunneling 891 enabled ([#8570](https://github.com/google/ExoPlayer/issues/8570)). 892* IMA extension: 893 * Fix handling of repeated ad loads, to avoid ads being discarded if the 894 user seeks away and then back to a preloaded postroll (for example). 895 * Fix a bug where an assertion would fail if the player started to buffer 896 an ad media period before the ad URI was known then an ad state update 897 arrived that didn't set the ad URI. 898 * Add `ImaAdsLoader.focusSkipButton` to allow apps to request that the 899 skip button should receive UI focus, if shown 900 ([#8565](https://github.com/google/ExoPlayer/issues/8565)). 901* DRM: 902 * Re-use the previous `DrmSessionManager` instance when playing a playlist 903 (if possible) 904 ([#8523](https://github.com/google/ExoPlayer/issues/8523)). 905 * Propagate DRM configuration when creating media sources for ad content 906 ([#8568](https://github.com/google/ExoPlayer/issues/8568)). 907 * Only release 'keepalive' references to `DrmSession` in 908 `DefaultDrmSessionManager#release()` if keepalive is enabled 909 ([#8576](https://github.com/google/ExoPlayer/issues/8576)). 910 911### 2.13.0 (2021-02-04) 912 913* Core library: 914 * Verify correct thread usage in `SimpleExoPlayer` by default. Opt-out is 915 still possible until the next major release using 916 `setThrowsWhenUsingWrongThread(false)` 917 ([#4463](https://github.com/google/ExoPlayer/issues/4463)). 918 * Add `Player.getCurrentStaticMetadata` and 919 `EventListener.onStaticMetadataChanged` to expose static metadata 920 belonging to the currently playing stream 921 ([#7266](https://github.com/google/ExoPlayer/issues/7266)). 922 * Add `PlayerMessage.setLooper` and deprecate `PlayerMessage.setHandler`. 923 * Add option to `MergingMediaSource` to clip the durations of all sources 924 to have the same length 925 ([#8422](https://github.com/google/ExoPlayer/issues/8422)). 926 * Remove `Player.setVideoDecoderOutputBufferRenderer` from Player API. Use 927 `setVideoSurfaceView` and `clearVideoSurfaceView` instead. 928 * Default `SingleSampleMediaSource.treatLoadErrorsAsEndOfStream` to `true` 929 so that errors loading external subtitle files do not cause playback to 930 fail ([#8430](https://github.com/google/ExoPlayer/issues/8430)). A 931 warning will be logged by `SingleSampleMediaPeriod` whenever a load 932 error is treated as though the end of the stream has been reached. 933 * Time out on release to prevent ANRs if an underlying platform call is 934 stuck ([#4352](https://github.com/google/ExoPlayer/issues/4352)). 935 * Time out when detaching a surface to prevent ANRs if the underlying 936 platform call is stuck 937 ([#5887](https://github.com/google/ExoPlayer/issues/5887)). 938 * Fix bug where `AnalyticsListener` callbacks could arrive in the wrong 939 order ([#8048](https://github.com/google/ExoPlayer/issues/8048)). 940* Media transformation: 941 * Add a new `transformer` module for converting media streams. The 942 initially available transformations are changing the container format, 943 removing tracks, and slow motion flattening. 944* Low latency live streaming: 945 * Support low-latency DASH (also known as ULL-CMAF) and Apple's 946 low-latency HLS extension. 947 * Add `LiveConfiguration` to `MediaItem` to define live offset and 948 playback speed adjustment parameters. The same parameters can be set on 949 `DefaultMediaSourceFactory` to apply for all `MediaItems`. 950 * Add `LivePlaybackSpeedControl` to control playback speed adjustments 951 during live playbacks. Such adjustments allow the player to stay close 952 to the live offset. `DefaultLivePlaybackSpeedControl` is provided as a 953 default implementation. 954 * Add `targetLiveOffsetUs` parameter to `LoadControl.shouldStartPlayback`. 955* Extractors: 956 * Populate codecs string for H.264/AVC in MP4, Matroska and FLV streams to 957 allow decoder capability checks based on codec profile and level 958 ([#8393](https://github.com/google/ExoPlayer/issues/8393)). 959 * Populate codecs string for H.265/HEVC in MP4, Matroska and MPEG-TS 960 streams to allow decoder capability checks based on codec profile and 961 level ([#8393](https://github.com/google/ExoPlayer/issues/8393)). 962 * Add support for playing JPEG motion photos 963 ([#5405](https://github.com/google/ExoPlayer/issues/5405)). 964 * Handle sample size mismatches between raw audio `stsd` information and 965 `stsz` fixed sample size in MP4 extractors. 966 * Fix Vorbis private codec data parsing in the Matroska extractor 967 ([#8496](https://github.com/google/ExoPlayer/issues/8496)). 968* Track selection: 969 * Move `Player.getTrackSelector` to the `ExoPlayer` interface. 970 * Move the mutable parts of `TrackSelection` into an `ExoTrackSelection` 971 subclass. 972 * Allow parallel adaptation of video and audio 973 ([#5111](https://github.com/google/ExoPlayer/issues/5111)). 974 * Simplify enabling tunneling with `DefaultTrackSelector`. 975 `ParametersBuilder.setTunnelingAudioSessionId` has been replaced with 976 `ParametersBuilder.setTunnelingEnabled`. The player's audio session ID 977 will be used, and so a tunneling specific ID is no longer needed. 978 * Add additional configuration parameters to `DefaultTrackSelector`. 979 `DefaultTrackSelector.ParametersBuilder` now includes: 980 * `setPreferredVideoMimeType`, `setPreferredVideoMimeTypes`, 981 `setPreferredAudioMimeType` and `setPreferredAudioMimeTypes` for 982 specifying preferred video and audio MIME type(s) 983 ([#8320](https://github.com/google/ExoPlayer/issues/8320)). 984 * `setPreferredAudioLanguages` and `setPreferredTextLanguages` for 985 specifying multiple preferred audio and text languages. 986 * `setPreferredAudioRoleFlags` for specifying preferred audio role 987 flags. 988 * Forward `Timeline` and `MediaPeriodId` to `TrackSelection.Factory`. 989* DASH: 990 * Support low-latency DASH playback (`availabilityTimeOffset` and 991 `ServiceDescription` tags) 992 ([#4904](https://github.com/google/ExoPlayer/issues/4904)). 993 * Improve logic for determining whether to refresh the manifest when a 994 chunk load error occurs in a live streams that contains EMSG data 995 ([#8408](https://github.com/google/ExoPlayer/issues/8408)). 996* HLS: 997 * Support playlist delta updates, blocking playlist reloads and rendition 998 reports. 999 * Support low-latency HLS playback (`EXT-X-PART` and preload hints) 1000 ([#5011](https://github.com/google/ExoPlayer/issues/5011)). 1001* UI: 1002 * Improve `StyledPlayerControlView` button animations. 1003 * Miscellaneous fixes for `StyledPlayerControlView` in minimal mode. 1004* DRM: 1005 * Fix playback failure when switching from PlayReady protected content to 1006 Widevine or Clearkey protected content in a playlist. 1007 * Add `ExoMediaDrm.KeyRequest.getRequestType` 1008 ([#7847](https://github.com/google/ExoPlayer/issues/7847)). 1009 * Drop key and provision responses if `DefaultDrmSession` is released 1010 while waiting for the response. This prevents harmless log messages of 1011 the form: `IllegalStateException: sending message to a Handler on a dead 1012 thread` ([#8328](https://github.com/google/ExoPlayer/issues/8328)). 1013 * Allow apps to fully customize DRM behaviour for each `MediaItem` by 1014 passing a `DrmSessionManagerProvider` to `MediaSourceFactory` 1015 ([#8466](https://github.com/google/ExoPlayer/issues/8466)). 1016* Analytics: 1017 * Add an `onEvents` callback to `Player.EventListener` and 1018 `AnalyticsListener`. When one or more player states change 1019 simultaneously, `onEvents` is called once after all of the callbacks 1020 associated with the individual state changes. 1021 * Pass a `DecoderReuseEvaluation` to `AnalyticsListener`'s 1022 `onVideoInputFormatChanged` and `onAudioInputFormatChanged` methods. The 1023 `DecoderReuseEvaluation` indicates whether it was possible to re-use an 1024 existing decoder instance for the new format, and if not then the 1025 reasons why. 1026* Video: 1027 * Fall back to AVC/HEVC decoders for Dolby Vision streams with level 10 to 1028 13 ([#8530](https://github.com/google/ExoPlayer/issues/8530)). 1029 * Fix VP9 format capability checks on API level 23 and earlier. The 1030 platform does not correctly report the VP9 level supported by the 1031 decoder in this case, so we estimate it based on the decoder's maximum 1032 supported bitrate. 1033* Audio: 1034 * Fix handling of audio session IDs 1035 ([#8190](https://github.com/google/ExoPlayer/issues/8190)). 1036 `SimpleExoPlayer` now generates an audio session ID on construction, 1037 which can be immediately queried by calling 1038 `SimpleExoPlayer.getAudioSessionId`. The audio session ID will only 1039 change if application code calls `SimpleExoPlayer.setAudioSessionId`. 1040 * Replace `onAudioSessionId` with `onAudioSessionIdChanged` in 1041 `AudioListener` and `AnalyticsListener`. Note that 1042 `onAudioSessionIdChanged` is called in fewer cases than 1043 `onAudioSessionId` was called, due to the improved handling of audio 1044 session IDs as described above. 1045 * Retry playback after some types of `AudioTrack` error. 1046 * Create E-AC3 JOC passthrough `AudioTrack` instances using the maximum 1047 supported channel count (instead of assuming 6 channels) from API 29. 1048* Text: 1049 * Add support for the SSA `primaryColour` style attribute 1050 ([#8435](https://github.com/google/ExoPlayer/issues/8435)). 1051 * Fix CEA-708 sequence number discontinuity handling 1052 ([#1807](https://github.com/google/ExoPlayer/issues/1807)). 1053 * Fix CEA-708 handling of unexpectedly small packets 1054 ([#1807](https://github.com/google/ExoPlayer/issues/1807)). 1055* Data sources: 1056 * For `HttpDataSource` implementations, default to using the user agent of 1057 the underlying network stack. 1058 * Deprecate `HttpDataSource.Factory.getDefaultRequestProperties`. 1059 `HttpDataSource.Factory.setDefaultRequestProperties` instead. 1060 * Add `DefaultHttpDataSource.Factory` and deprecate 1061 `DefaultHttpDataSourceFactory`. 1062* Metadata retriever: 1063 * Parse Google Photos HEIC and JPEG motion photo metadata. 1064* IMA extension: 1065 * Add support for playback of ads in playlists 1066 ([#3750](https://github.com/google/ExoPlayer/issues/3750)). 1067 * Add `ImaAdsLoader.Builder.setEnableContinuousPlayback` for setting 1068 whether to request ads for continuous playback. 1069 * Upgrade IMA SDK dependency to 3.22.0. This fixes leaking of the ad view 1070 group ([#7344](https://github.com/google/ExoPlayer/issues/7344), 1071 [#8339](https://github.com/google/ExoPlayer/issues/8339)). 1072 * Fix a bug that could cause the next content position played after a seek 1073 to snap back to the cue point of the preceding ad, rather than the 1074 requested content position. 1075 * Fix a regression that caused an ad group to be skipped after an initial 1076 seek to a non-zero position. Unsupported VPAID ads will still be 1077 skipped, but only after the preload timeout rather than instantly 1078 ([#8428](https://github.com/google/ExoPlayer/issues/8428), 1079 [#7832](https://github.com/google/ExoPlayer/issues/7832)). 1080 * Fix a regression that caused a short ad followed by another ad to be 1081 skipped due to playback being stuck buffering waiting for the second ad 1082 to load ([#8492](https://github.com/google/ExoPlayer/issues/8492)). 1083* FFmpeg extension: 1084 * Link the FFmpeg library statically, saving 350KB in binary size on 1085 average. 1086* OkHttp extension: 1087 * Add `OkHttpDataSource.Factory` and deprecate `OkHttpDataSourceFactory`. 1088* Cronet extension: 1089 * Add `CronetDataSource.Factory` and deprecate `CronetDataSourceFactory`. 1090 * Support setting the user agent on `CronetDataSource.Factory` and 1091 `CronetEngineWrapper`. 1092* MediaSession extension: 1093 * Support `setPlaybackSpeed(float)` and disable it by default. Use 1094 `MediaSessionConnector.setEnabledPlaybackActions(long)` to enable 1095 ([#8229](https://github.com/google/ExoPlayer/issues/8229)). 1096* Remove deprecated symbols: 1097 * `AdaptiveMediaSourceEventListener`. Use `MediaSourceEventListener` 1098 instead. 1099 * `DashMediaSource.Factory.setMinLoadableRetryCount(int)`. Use 1100 `DashMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` 1101 instead. 1102 * `DefaultAnalyticsListener`. Use `AnalyticsListener` instead. 1103 * `DefaultLoadControl` constructors. Use `DefaultLoadControl.Builder` 1104 instead. 1105 * `DrmInitData.get(UUID)`. Use `DrmInitData.get(int)` and 1106 `DrmInitData.SchemeData.matches(UUID)` instead. 1107 * `ExtractorsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use 1108 `ExtractorsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` 1109 instead. 1110 * `FixedTrackSelection.Factory`. If you need to disable adaptive selection 1111 in `DefaultTrackSelector`, enable the 1112 `DefaultTrackSelector.Parameters.forceHighestSupportedBitrate` flag. 1113 * `HlsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use 1114 `HlsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` 1115 instead. 1116 * `MappedTrackInfo.getTrackFormatSupport(int, int, int)`. Use 1117 `MappedTrackInfo.getTrackSupport(int, int, int)` instead. 1118 * `MappedTrackInfo.getTrackTypeRendererSupport(int)`. Use 1119 `MappedTrackInfo.getTypeSupport(int)` instead. 1120 * `MappedTrackInfo.getUnassociatedTrackGroups()`. Use 1121 `MappedTrackInfo.getUnmappedTrackGroups()` instead. 1122 * `MappedTrackInfo.length`. Use `MappedTrackInfo.getRendererCount()` 1123 instead. 1124 * `Player.DefaultEventListener.onTimelineChanged(Timeline, Object)`. Use 1125 `Player.EventListener.onTimelineChanged(Timeline, int)` instead. 1126 * `Player.setAudioAttributes(AudioAttributes)`. Use 1127 `Player.AudioComponent.setAudioAttributes(AudioAttributes, boolean)` 1128 instead. 1129 * `PlayerView.setDefaultArtwork(Bitmap)`. Use 1130 `PlayerView.setDefaultArtwork(Drawable)` instead. 1131 * `PlayerView.setShowBuffering(boolean)`. Use 1132 `PlayerView.setShowBuffering(int)` instead. 1133 * `SimpleExoPlayer.clearMetadataOutput(MetadataOutput)`. Use 1134 `SimpleExoPlayer.removeMetadataOutput(MetadataOutput)` instead. 1135 * `SimpleExoPlayer.clearTextOutput(TextOutput)`. Use 1136 `SimpleExoPlayer.removeTextOutput(TextOutput)` instead. 1137 * `SimpleExoPlayer.clearVideoListener()`. Use 1138 `SimpleExoPlayer.removeVideoListener(VideoListener)` instead. 1139 * `SimpleExoPlayer.getAudioStreamType()`. Use 1140 `SimpleExoPlayer.getAudioAttributes()` instead. 1141 * `SimpleExoPlayer.setAudioDebugListener(AudioRendererEventListener)`. Use 1142 `SimpleExoPlayer.addAnalyticsListener(AnalyticsListener)` instead. 1143 * `SimpleExoPlayer.setAudioStreamType(int)`. Use 1144 `SimpleExoPlayer.setAudioAttributes(AudioAttributes)` instead. 1145 * `SimpleExoPlayer.setMetadataOutput(MetadataOutput)`. Use 1146 `SimpleExoPlayer.addMetadataOutput(MetadataOutput)` instead. If your 1147 application is calling `SimpleExoPlayer.setMetadataOutput(null)`, make 1148 sure to replace this call with a call to 1149 `SimpleExoPlayer.removeMetadataOutput(MetadataOutput)`. 1150 * `SimpleExoPlayer.setPlaybackParams(PlaybackParams)`. Use 1151 `SimpleExoPlayer.setPlaybackParameters(PlaybackParameters)` instead. 1152 * `SimpleExoPlayer.setTextOutput(TextOutput)`. Use 1153 `SimpleExoPlayer.addTextOutput(TextOutput)` instead. If your application 1154 is calling `SimpleExoPlayer.setTextOutput(null)`, make sure to replace 1155 this call with a call to `SimpleExoPlayer.removeTextOutput(TextOutput)`. 1156 * `SimpleExoPlayer.setVideoDebugListener(VideoRendererEventListener)`. Use 1157 `SimpleExoPlayer.addAnalyticsListener(AnalyticsListener)` instead. 1158 * `SimpleExoPlayer.setVideoListener(VideoListener)`. Use 1159 `SimpleExoPlayer.addVideoListener(VideoListener)` instead. If your 1160 application is calling `SimpleExoPlayer.setVideoListener(null)`, make 1161 sure to replace this call with a call to 1162 `SimpleExoPlayer.removeVideoListener(VideoListener)`. 1163 * `SimpleExoPlayer.VideoListener`. Use 1164 `com.google.android.exoplayer2.video.VideoListener` instead. 1165 * `SingleSampleMediaSource.EventListener` and constructors. Use 1166 `MediaSourceEventListener` and `SingleSampleMediaSource.Factory` 1167 instead. 1168 * `SimpleExoPlayer.addVideoDebugListener`, 1169 `SimpleExoPlayer.removeVideoDebugListener`, 1170 `SimpleExoPlayer.addAudioDebugListener` and 1171 `SimpleExoPlayer.removeAudioDebugListener`. Use 1172 `SimpleExoPlayer.addAnalyticsListener` and 1173 `SimpleExoPlayer.removeAnalyticsListener` instead. 1174 * `SingleSampleMediaSource.Factory.setMinLoadableRetryCount(int)`. Use 1175 `SingleSampleMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` 1176 instead. 1177 * `SsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use 1178 `SsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` 1179 instead. 1180 1181### 2.12.3 (2021-01-13) 1182 1183* Core library: 1184 * Fix `MediaCodecRenderer` issue where empty streams would fail to play in 1185 bypass mode ([#8374](https://github.com/google/ExoPlayer/issues/8374)). 1186 * Fix playback issues after seeking during an ad 1187 ([#8349](https://github.com/google/ExoPlayer/issues/8349)). 1188 * Fix propagation of `LoadErrorHandlingPolicy` from 1189 `DefaultMediaSourceFactory` into `SingleSampleMediaSource.Factory` when 1190 creating subtitle media sources from 1191 `MediaItem.playbackProperties.subtitles` 1192 ([#8430](https://github.com/google/ExoPlayer/issues/8430)). 1193* UI: 1194 * Fix issue where pop-up menus belonging to `StyledPlayerControlView` 1195 would not be dismissed when tapping outside of the menu area or pressing 1196 the back button, on API level 22 and earlier 1197 ([#8272](https://github.com/google/ExoPlayer/issues/8272)). 1198* Downloads: 1199 * Fix crash in `DownloadManager` that could occur when adding a stopped 1200 download with the same ID as a download currently being removed 1201 ([#8419](https://github.com/google/ExoPlayer/issues/8419)). 1202* Text: 1203 * Gracefully handle null-terminated subtitle content in Matroska 1204 containers. 1205 * Fix CEA-708 anchor positioning 1206 ([#1807](https://github.com/google/ExoPlayer/issues/1807)). 1207* IMA extension: 1208 * Fix a condition where playback could get stuck before an empty ad 1209 ([#8205](https://github.com/google/ExoPlayer/issues/8205)). 1210 * Log a warning rather than throwing when reaching the end of the stream 1211 with an ad playing but without ad media info 1212 ([#8290](https://github.com/google/ExoPlayer/issues/8290)). 1213* Media2 extension: 1214 * Make media2-extension depend on AndroidX media2:media2-session:1.1.0 to 1215 fix a deadlock while creating PlaybackStateCompat internally. 1216 ([#8011](https://github.com/google/ExoPlayer/issues/8011)). 1217 1218### 2.12.2 (2020-12-01) 1219 1220* Core library: 1221 * Suppress exceptions from registering and unregistering the stream volume 1222 receiver ([#8087](https://github.com/google/ExoPlayer/issues/8087), 1223 [#8106](https://github.com/google/ExoPlayer/issues/8106)). 1224 * Suppress ProGuard warnings caused by Guava's compile-only dependencies 1225 ([#8103](https://github.com/google/ExoPlayer/issues/8103)). 1226 * Fix issue that could cause playback to freeze when selecting tracks, if 1227 extension audio renderers are being used 1228 ([#8203](https://github.com/google/ExoPlayer/issues/8203)). 1229* UI: 1230 * Fix incorrect color and text alignment of the `StyledPlayerControlView` 1231 fast forward and rewind buttons, when used together with the 1232 `com.google.android.material` library 1233 ([#7898](https://github.com/google/ExoPlayer/issues/7898)). 1234 * Add `dispatchPrepare(Player)` to `ControlDispatcher` and implement it in 1235 `DefaultControlDispatcher`. Deprecate `PlaybackPreparer` and 1236 `setPlaybackPreparer` in `StyledPlayerView`, `StyledPlayerControlView`, 1237 `PlayerView`, `PlayerControlView`, `PlayerNotificationManager` and 1238 `LeanbackPlayerAdapter` and use `ControlDispatcher` for dispatching 1239 prepare instead 1240 ([#7882](https://github.com/google/ExoPlayer/issues/7882)). 1241 * Increase seekbar's touch target height in `StyledPlayerControlView`. 1242 * Update `StyledPlayerControlView` menu items to behave correctly for 1243 right-to-left languages. 1244 * Support enabling the previous and next actions individually in 1245 `PlayerNotificationManager`. 1246* Audio: 1247 * Work around `AudioManager` crashes when calling `getStreamVolume` 1248 ([#8191](https://github.com/google/ExoPlayer/issues/8191)). 1249* Extractors: 1250 * Matroska: Add support for 32-bit floating point PCM, and 8-bit and 1251 16-bit big endian integer PCM 1252 ([#8142](https://github.com/google/ExoPlayer/issues/8142)). 1253 * MP4: Add support for mpeg1 video box 1254 ([#8257](https://github.com/google/ExoPlayer/issues/8257)). 1255* IMA extension: 1256 * Upgrade IMA SDK dependency to 3.21.0, and release the `AdsLoader` 1257 ([#7344](https://github.com/google/ExoPlayer/issues/7344)). 1258 * Improve handling of ad tags with unsupported VPAID ads 1259 ([#7832](https://github.com/google/ExoPlayer/issues/7832)). 1260 * Fix a bug that caused multiple ads in an ad pod to be skipped when one 1261 ad in the ad pod was skipped. 1262 * Fix a bug that caused ad progress not to be updated if the player 1263 resumed after buffering during an ad 1264 ([#8239](https://github.com/google/ExoPlayer/issues/8239)). 1265 * Fix passing an ads response to the `ImaAdsLoader` builder. 1266 * Set the overlay language based on the device locale by default. 1267* Cronet extension: 1268 * Fix handling of HTTP status code 200 when making unbounded length range 1269 requests ([#8090](https://github.com/google/ExoPlayer/issues/8090)). 1270* Text 1271 * Allow tx3g subtitles with `styl` boxes with start and/or end offsets 1272 that lie outside the length of the cue text. 1273* Media2 extension: 1274 * Notify onBufferingEnded when the state of origin player becomes 1275 `STATE_IDLE` or `STATE_ENDED`. 1276 * Allow to remove all playlist items that makes the player reset 1277 ([#8047](https://github.com/google/ExoPlayer/issues/8047)). 1278 1279### 2.12.1 (2020-10-23) 1280 1281* Core library: 1282 * Fix issue where `Player.setMediaItems` would ignore its `resetPosition` 1283 argument ([#8024](https://github.com/google/ExoPlayer/issues/8024)). 1284 * Fix bug where streams with highly uneven track durations may get stuck 1285 in a buffering state 1286 ([#7943](https://github.com/google/ExoPlayer/issues/7943)). 1287 * Switch Guava dependency from `implementation` to `api` 1288 ([#7905](https://github.com/google/ExoPlayer/issues/7905), 1289 [#7993](https://github.com/google/ExoPlayer/issues/7993)). 1290 * Add 403, 500 and 503 to the list of HTTP status codes that can trigger 1291 failover to another quality variant during adaptive playbacks. 1292* Data sources: 1293 * Add support for `android.resource` URI scheme in `RawResourceDataSource` 1294 ([#7866](https://github.com/google/ExoPlayer/issues/7866)). 1295* Text: 1296 * Add support for `\h` SSA/ASS style override code (non-breaking space). 1297 * Fix playback of WebVTT subtitles in MP4 containers in DASH streams 1298 ([#7985](https://github.com/google/ExoPlayer/issues/7985)). 1299 * Fix `NullPointerException` in `TextRenderer` when playing content with a 1300 single subtitle buffer 1301 ([#8017](https://github.com/google/ExoPlayer/issues/8017)). 1302* UI: 1303 * Fix animation when `StyledPlayerView` first shows its playback controls. 1304 * Improve touch targets in `StyledPlayerView` to make tapping easier. 1305 * Allow `subtitleButton` to be omitted in custom `StyledPlayerView` 1306 layouts ([#7962](https://github.com/google/ExoPlayer/issues/7962)). 1307 * Add an option to sort tracks by `Format` in `TrackSelectionView` and 1308 `TrackSelectionDialogBuilder` 1309 ([#7709](https://github.com/google/ExoPlayer/issues/7709)). 1310* Audio: 1311 * Fix the default audio sink position not advancing correctly when using 1312 `AudioTrack` based speed adjustment 1313 ([#7982](https://github.com/google/ExoPlayer/issues/7982)). 1314 * Fix `NoClassDefFoundError` warning for `AudioTrack$StreamEventCallback` 1315 ([#8058](https://github.com/google/ExoPlayer/issues/8058)). 1316* Extractors: 1317 * MP4: 1318 * Add support for `_mp2` boxes 1319 ([#7967](https://github.com/google/ExoPlayer/issues/7967)). 1320 * Fix playback of files containing `pcm_alaw` or `pcm_mulaw` audio 1321 tracks, by enabling sample rechunking for such tracks. 1322 * MPEG-TS: 1323 * Add `TsExtractor` parameter to configure the number of bytes in 1324 which to search for timestamps when seeking and determining stream 1325 duration ([#7988](https://github.com/google/ExoPlayer/issues/7988)). 1326 * Ignore negative payload size in PES packets 1327 ([#8005](https://github.com/google/ExoPlayer/issues/8005)). 1328 * MP3: Use TLEN ID3 tag to compute the stream duration 1329 ([#7949](https://github.com/google/ExoPlayer/issues/7949)). 1330 * Ogg: Fix regression playing files with packets that span multiple pages 1331 ([#7992](https://github.com/google/ExoPlayer/issues/7992)). 1332 * FLV: Make files seekable by using the key frame index 1333 ([#7378](https://github.com/google/ExoPlayer/issues/7378)). 1334* Downloads: Fix issue retrying progressive downloads, which could also result 1335 in a crash in `DownloadManager.InternalHandler.onContentLengthChanged` 1336 ([#8078](https://github.com/google/ExoPlayer/issues/8078)). 1337* HLS: Fix crash affecting chunkful preparation of master playlists that start 1338 with an I-FRAME only variant 1339 ([#8025](https://github.com/google/ExoPlayer/issues/8025)). 1340* IMA extension: 1341 * Fix position reporting after fetch errors 1342 ([#7956](https://github.com/google/ExoPlayer/issues/7956)). 1343 * Allow apps to specify a `VideoAdPlayerCallback` 1344 ([#7944](https://github.com/google/ExoPlayer/issues/7944)). 1345 * Accept ad tags via the `AdsMediaSource` constructor and deprecate 1346 passing them via the `ImaAdsLoader` constructor/builders. Passing the ad 1347 tag via media item playback properties continues to be supported. This 1348 is in preparation for supporting ads in playlists 1349 ([#3750](https://github.com/google/ExoPlayer/issues/3750)). 1350 * Add a way to override ad media MIME types 1351 ([#7961](https://github.com/google/ExoPlayer/issues/7961)). 1352 * Fix incorrect truncation of large cue point positions 1353 ([#8067](https://github.com/google/ExoPlayer/issues/8067)). 1354 * Upgrade IMA SDK dependency to 3.20.1. This brings in a fix for companion 1355 ads rendering when targeting API 29 1356 ([#6432](https://github.com/google/ExoPlayer/issues/6432)). 1357 1358### 2.12.0 (2020-09-11) 1359 1360To learn more about what's new in 2.12, read the corresponding 1361[blog post](https://medium.com/google-exoplayer/exoplayer-2-12-whats-new-e43ef8ff72e7). 1362 1363* Core library: 1364 * `Player`: 1365 * Add a top level playlist API based on a new `MediaItem` class 1366 ([#6161](https://github.com/google/ExoPlayer/issues/6161)). The new 1367 methods for playlist manipulation are `setMediaItem(s)`, 1368 `addMediaItem(s)`, `moveMediaItem(s)`, `removeMediaItem(s)` and 1369 `clearMediaItems`. The playlist can be queried using 1370 `getMediaItemCount` and `getMediaItemAt`. This API should be used 1371 instead of `ConcatenatingMediaSource` in most cases. Learn more by 1372 reading 1373 [this blog post](https://medium.com/google-exoplayer/a-top-level-playlist-api-for-exoplayer-abe0a24edb55). 1374 * Add `getCurrentMediaItem` for getting the currently playing item in 1375 the playlist. 1376 * Add `EventListener.onMediaItemTransition` to report when playback 1377 transitions from one item to another in the playlist. 1378 * Add `play` and `pause` convenience methods. They are equivalent to 1379 `setPlayWhenReady(true)` and `setPlayWhenReady(false)` respectively. 1380 * Add `getCurrentLiveOffset` for getting the offset of the current 1381 playback position from the live edge of a live stream. 1382 * Add `getTrackSelector` for getting the `TrackSelector` used by the 1383 player. 1384 * Add `AudioComponent.setAudioSessionId` to set the audio session ID. 1385 This method is also available on `SimpleExoPlayer`. 1386 * Remove `PlaybackParameters.skipSilence`, and replace it with 1387 `AudioComponent.setSkipSilenceEnabled`. This method is also 1388 available on `SimpleExoPlayer`. An 1389 `AudioListener.onSkipSilenceEnabledChanged` callback is also added. 1390 * Add `TextComponent.getCurrentCues` to get the current cues. This 1391 method is also available on `SimpleExoPlayer`. The current cues are 1392 no longer automatically forwarded to a `TextOutput` when it's added 1393 to a `SimpleExoPlayer`. 1394 * Add `Player.DeviceComponent` to query and control the device volume. 1395 `SimpleExoPlayer` implements this interface. 1396 * Deprecate and rename `getPlaybackError` to `getPlayerError` for 1397 consistency. 1398 * Deprecate and rename `onLoadingChanged` to `onIsLoadingChanged` for 1399 consistency. 1400 * Deprecate `EventListener.onPlayerStateChanged`, replacing it with 1401 `EventListener.onPlayWhenReadyChanged` and 1402 `EventListener.onPlaybackStateChanged`. 1403 * Deprecate `EventListener.onSeekProcessed` because seek changes now 1404 happen instantly and listening to `onPositionDiscontinuity` is 1405 sufficient. 1406 * `ExoPlayer`: 1407 * Add `setMediaSource(s)` and `addMediaSource(s)` to `ExoPlayer`, for 1408 adding `MediaSource` instances directly to the playlist. 1409 * Add `ExoPlayer.setPauseAtEndOfMediaItems` to let the player pause at 1410 the end of each media item 1411 ([#5660](https://github.com/google/ExoPlayer/issues/5660)). 1412 * Allow passing `C.TIME_END_OF_SOURCE` to `PlayerMessage.setPosition` 1413 to send a `PlayerMessage` at the end of a stream. 1414 * `SimpleExoPlayer`: 1415 * `SimpleExoPlayer` implements the new `MediaItem` based playlist API, 1416 using a `MediaSourceFactory` to convert `MediaItem` instances to 1417 playable `MediaSource` instances. A `DefaultMediaSourceFactory` is 1418 used by default. `Builder.setMediaSourceFactory` allows setting a 1419 custom factory. 1420 * Update [APK shrinking guide](https://exoplayer.dev/shrinking.html) 1421 to explain how shrinking works with the new `MediaItem` and 1422 `DefaultMediaSourceFactory` implementations 1423 ([#7937](https://github.com/google/ExoPlayer/issues/7937)). 1424 * Add additional options to `Builder` that were previously only 1425 accessible via setters. 1426 * Add opt-in to verify correct thread usage with 1427 `setThrowsWhenUsingWrongThread(true)` 1428 ([#4463](https://github.com/google/ExoPlayer/issues/4463)). 1429 * `Format`: 1430 * Add a `Builder` and deprecate all `create` methods and most 1431 `Format.copyWith` methods. 1432 * Split `bitrate` into `averageBitrate` and `peakBitrate` 1433 ([#2863](https://github.com/google/ExoPlayer/issues/2863)). 1434 * `LoadControl`: 1435 * Add a `playbackPositionUs` parameter to `shouldContinueLoading`. 1436 * Set the default minimum buffer duration in `DefaultLoadControl` to 1437 50 seconds (equal to the default maximum buffer), and treat audio 1438 and video the same. 1439 * Add a `MetadataRetriever` API for retrieving track information and 1440 static metadata for a media item 1441 ([#3609](https://github.com/google/ExoPlayer/issues/3609)). 1442 * Attach an identifier and extra information to load error events passed 1443 to `LoadErrorHandlingPolicy` 1444 ([#7309](https://github.com/google/ExoPlayer/issues/7309)). 1445 `LoadErrorHandlingPolicy` implementations should migrate to implementing 1446 the non-deprecated methods of the interface. 1447 * Add an option to `MergingMediaSource` to adjust the time offsets between 1448 the merged sources 1449 ([#6103](https://github.com/google/ExoPlayer/issues/6103)). 1450 * Move `MediaSourceEventListener.LoadEventInfo` and 1451 `MediaSourceEventListener.MediaLoadData` to be top-level classes in 1452 `com.google.android.exoplayer2.source`. 1453 * Move `SimpleDecoderVideoRenderer` and `SimpleDecoderAudioRenderer` to 1454 `DecoderVideoRenderer` and `DecoderAudioRenderer` respectively, and 1455 generalize them to work with `Decoder` rather than `SimpleDecoder`. 1456 * Deprecate `C.MSG_*` constants, replacing them with constants in 1457 `Renderer`. 1458 * Split the `library-core` module into `library-core`, `library-common` 1459 and `library-extractor`. The `library-core` module has an API dependency 1460 on both of the new modules, so this change should be transparent to 1461 developers including ExoPlayer using Gradle dependencies. 1462 * Add a dependency on Guava. 1463* Video: 1464 * Pass frame rate hint to `Surface.setFrameRate` on Android 11. 1465 * Fix incorrect aspect ratio when transitioning from one video to another 1466 with the same resolution, but a different pixel aspect ratio 1467 ([#6646](https://github.com/google/ExoPlayer/issues/6646)). 1468* Audio: 1469 * Add experimental support for power efficient playback using audio 1470 offload. 1471 * Add support for using framework audio speed adjustment instead of 1472 ExoPlayer's implementation 1473 ([#7502](https://github.com/google/ExoPlayer/issues/7502)). This option 1474 can be set using 1475 `DefaultRenderersFactory.setEnableAudioTrackPlaybackParams`. 1476 * Add an event for the audio position starting to advance, to make it 1477 easier for apps to determine when audio playout started 1478 ([#7577](https://github.com/google/ExoPlayer/issues/7577)). 1479 * Generalize support for floating point audio. 1480 * Add an option to `DefaultAudioSink` for enabling floating point 1481 output. This option can also be set using 1482 `DefaultRenderersFactory.setEnableAudioFloatOutput`. 1483 * Add floating point output capability to `MediaCodecAudioRenderer` 1484 and `LibopusAudioRenderer`, which is enabled automatically if the 1485 audio sink supports floating point output and if it makes sense for 1486 the content being played. 1487 * Enable the floating point output capability of `FfmpegAudioRenderer` 1488 automatically if the audio sink supports floating point output and 1489 if it makes sense for the content being played. The option to 1490 manually enable floating point output has been removed, since this 1491 now done with the generalized option on `DefaultAudioSink`. 1492 * In `MediaCodecAudioRenderer`, stop passing audio samples through 1493 `MediaCodec` when playing PCM audio or encoded audio using passthrough 1494 mode. 1495 * Reuse audio decoders when transitioning through playlists of gapless 1496 audio, rather than reinstantiating them. 1497 * Check `DefaultAudioSink` supports passthrough, in addition to checking 1498 the `AudioCapabilities` 1499 ([#7404](https://github.com/google/ExoPlayer/issues/7404)). 1500* Text: 1501 * Many of the changes described below improve support for Japanese 1502 subtitles. Read 1503 [this blog post](https://medium.com/google-exoplayer/improved-japanese-subtitle-support-7598fee12cf4) 1504 to learn more. 1505 * Add a WebView-based output option to `SubtitleView`. This can display 1506 some features not supported by the existing Canvas-based output such as 1507 vertical text and rubies. It can be enabled by calling 1508 `SubtitleView#setViewType(VIEW_TYPE_WEB)`. 1509 * Recreate the decoder when handling and swallowing decode errors in 1510 `TextRenderer`. This fixes a case where playback would never end when 1511 playing content with malformed subtitles 1512 ([#7590](https://github.com/google/ExoPlayer/issues/7590)). 1513 * Only apply `CaptionManager` font scaling in 1514 `SubtitleView.setUserDefaultTextSize` if the `CaptionManager` is 1515 enabled. 1516 * Improve positioning of vertical cues when rendered horizontally. 1517 * Redefine `Cue.lineType=LINE_TYPE_NUMBER` in terms of aligning the cue 1518 text lines to grid of viewport lines. Only consider `Cue.lineAnchor` 1519 when `Cue.lineType=LINE_TYPE_FRACTION`. 1520 * WebVTT: 1521 * Add support for default 1522 [text](https://www.w3.org/TR/webvtt1/#default-text-color) and 1523 [background](https://www.w3.org/TR/webvtt1/#default-text-background) 1524 colors ([#6581](https://github.com/google/ExoPlayer/issues/6581)). 1525 * Update position alignment parsing to recognise `line-left`, `center` 1526 and `line-right`. 1527 * Implement steps 4-10 of the 1528 [WebVTT line computation algorithm](https://www.w3.org/TR/webvtt1/#cue-computed-line). 1529 * Stop parsing unsupported CSS properties. The spec provides an 1530 [exhaustive list](https://www.w3.org/TR/webvtt1/#the-cue-pseudo-element) 1531 of which properties are supported. 1532 * Parse the `ruby-position` CSS property. 1533 * Parse the `text-combine-upright` CSS property (i.e., tate-chu-yoko). 1534 * Parse the `<ruby>` and `<rt>` tags. 1535 * TTML: 1536 * Parse the `tts:combineText` property (i.e., tate-chu-yoko). 1537 * Parse t`tts:ruby` and `tts:rubyPosition` properties. 1538 * CEA-608: 1539 * Implement timing-out of stuck captions, as permitted by 1540 ANSI/CTA-608-E R-2014 Annex C.9. The default timeout is set to 16 1541 seconds ([#7181](https://github.com/google/ExoPlayer/issues/7181)). 1542 * Trim lines that exceed the maximum length of 32 characters 1543 ([#7341](https://github.com/google/ExoPlayer/issues/7341)). 1544 * Fix positioning of roll-up captions in the top half of the screen 1545 ([#7475](https://github.com/google/ExoPlayer/issues/7475)). 1546 * Stop automatically generating a CEA-608 track when playing 1547 standalone MPEG-TS files. The previous behavior can still be 1548 obtained by manually injecting a customized 1549 `DefaultTsPayloadReaderFactory` into `TsExtractor`. 1550* Metadata: Add minimal DVB Application Information Table (AIT) support. 1551* DASH: 1552 * Add support for canceling in-progress segment fetches 1553 ([#2848](https://github.com/google/ExoPlayer/issues/2848)). 1554 * Add support for CEA-708 embedded in FMP4. 1555* SmoothStreaming: 1556 * Add support for canceling in-progress segment fetches 1557 ([#2848](https://github.com/google/ExoPlayer/issues/2848)). 1558* HLS: 1559 * Add support for discarding buffered media (e.g., to allow faster 1560 adaptation to a higher quality variant) 1561 ([#6322](https://github.com/google/ExoPlayer/issues/6322)). 1562 * Add support for canceling in-progress segment fetches 1563 ([#2848](https://github.com/google/ExoPlayer/issues/2848)). 1564 * Respect 33-bit PTS wrapping when applying `X-TIMESTAMP-MAP` to WebVTT 1565 timestamps ([#7464](https://github.com/google/ExoPlayer/issues/7464)). 1566* Extractors: 1567 * Optimize the `Extractor` sniffing order to reduce start-up latency in 1568 `DefaultExtractorsFactory` and `DefaultHlsExtractorsFactory` 1569 ([#6410](https://github.com/google/ExoPlayer/issues/6410)). 1570 * Use filename extensions and response header MIME types to further 1571 optimize `Extractor` sniffing order on a per-media basis. 1572 * MP3: Add `IndexSeeker` for accurate seeks in VBR MP3 streams 1573 ([#6787](https://github.com/google/ExoPlayer/issues/6787)). This seeker 1574 can be enabled by passing `FLAG_ENABLE_INDEX_SEEKING` to the 1575 `Mp3Extractor`. A significant portion of the file may need to be scanned 1576 when a seek is performed, which may be costly for large files. 1577 * MP4: Fix playback of MP4 streams that contain Opus audio. 1578 * FMP4: Add support for partially fragmented MP4s 1579 ([#7308](https://github.com/google/ExoPlayer/issues/7308)). 1580 * Matroska: 1581 * Support Dolby Vision 1582 ([#7267](https://github.com/google/ExoPlayer/issues/7267)). 1583 * Populate `Format.label` with track titles. 1584 * Remove support for the `Invisible` block header flag. 1585 * MPEG-TS: Add support for MPEG-4 Part 2 and H.263 1586 ([#1603](https://github.com/google/ExoPlayer/issues/1603), 1587 [#5107](https://github.com/google/ExoPlayer/issues/5107)). 1588 * Ogg: Fix handling of non-contiguous pages 1589 ([#7230](https://github.com/google/ExoPlayer/issues/7230)). 1590* UI: 1591 * Add `StyledPlayerView` and `StyledPlayerControlView`, which provide a 1592 more polished user experience than `PlayerView` and `PlayerControlView` 1593 at the cost of decreased customizability. 1594 * Remove the previously deprecated `SimpleExoPlayerView` and 1595 `PlaybackControlView` classes, along with the corresponding 1596 `exo_simple_player_view.xml` and `exo_playback_control_view.xml` layout 1597 resources. Use the equivalent `PlayerView`, `PlayerControlView`, 1598 `exo_player_view.xml` and `exo_player_control_view.xml` instead. 1599 * Add setter methods to `PlayerView` and `PlayerControlView` to set 1600 whether the rewind, fast forward, previous and next buttons are shown 1601 ([#7410](https://github.com/google/ExoPlayer/issues/7410)). 1602 * Update `TrackSelectionDialogBuilder` to use the AndroidX app compat 1603 `AlertDialog` rather than the platform version, if available 1604 ([#7357](https://github.com/google/ExoPlayer/issues/7357)). 1605 * Make UI components dispatch previous, next, fast forward and rewind 1606 actions via their `ControlDispatcher` 1607 ([#6926](https://github.com/google/ExoPlayer/issues/6926)). 1608* Downloads and caching: 1609 * Add `DownloadRequest.Builder`. 1610 * Add `DownloadRequest.keySetId` to make it easier to store an offline 1611 license keyset identifier alongside the other information that's 1612 persisted in `DownloadIndex`. 1613 * Support passing an `Executor` to `DefaultDownloaderFactory` on which 1614 data downloads are performed. 1615 * Parallelize and merge downloads in `SegmentDownloader` to improve 1616 download speeds 1617 ([#5978](https://github.com/google/ExoPlayer/issues/5978)). 1618 * Replace `CacheDataSinkFactory` and `CacheDataSourceFactory` with 1619 `CacheDataSink.Factory` and `CacheDataSource.Factory` respectively. 1620 * Remove `DownloadConstructorHelper` and instead use 1621 `CacheDataSource.Factory` directly. 1622 * Add `Requirements.DEVICE_STORAGE_NOT_LOW`, which can be specified as a 1623 requirement to a `DownloadManager` for it to proceed with downloading. 1624 * For failed downloads, propagate the `Exception` that caused the failure 1625 to `DownloadManager.Listener.onDownloadChanged`. 1626 * Support multiple non-overlapping write locks for the same key in 1627 `SimpleCache`. 1628 * Remove `CacheUtil`. Equivalent functionality is provided by a new 1629 `CacheWriter` class, `Cache.getCachedBytes`, `Cache.removeResource` and 1630 `CacheKeyFactory.DEFAULT`. 1631* DRM: 1632 * Remove previously deprecated APIs to inject `DrmSessionManager` into 1633 `Renderer` instances. `DrmSessionManager` must now be injected into 1634 `MediaSource` instances via the `MediaSource` factories. 1635 * Add the ability to inject a custom `DefaultDrmSessionManager` into 1636 `OfflineLicenseHelper` 1637 ([#7078](https://github.com/google/ExoPlayer/issues/7078)). 1638 * Keep DRM sessions alive for a short time before fully releasing them 1639 ([#7011](https://github.com/google/ExoPlayer/issues/7011), 1640 [#6725](https://github.com/google/ExoPlayer/issues/6725), 1641 [#7066](https://github.com/google/ExoPlayer/issues/7066)). 1642 * Remove support for `cbc1` and `cens` encrytion schemes. Support for 1643 these schemes was removed from the Android platform from API level 30, 1644 and the range of API levels for which they are supported is too small to 1645 be useful. 1646 * Remove generic types from DRM components. 1647 * Rename `DefaultDrmSessionEventListener` to `DrmSessionEventListener`. 1648* Track selection: 1649 * Add `TrackSelection.shouldCancelMediaChunkLoad` to check whether an 1650 ongoing load should be canceled 1651 ([#2848](https://github.com/google/ExoPlayer/issues/2848)). 1652 * Add `DefaultTrackSelector` constraints for minimum video resolution, 1653 bitrate and frame rate 1654 ([#4511](https://github.com/google/ExoPlayer/issues/4511)). 1655 * Remove previously deprecated `DefaultTrackSelector` members. 1656* Data sources: 1657 * Add `HttpDataSource.InvalidResponseCodeException#responseBody` field 1658 ([#6853](https://github.com/google/ExoPlayer/issues/6853)). 1659 * Add `DataSpec.Builder` and deprecate most `DataSpec` constructors. 1660 * Add `DataSpec.customData` to allow applications to pass custom data 1661 through `DataSource` chains. 1662 * Deprecate `CacheDataSinkFactory` and `CacheDataSourceFactory`, which are 1663 replaced by `CacheDataSink.Factory` and `CacheDataSource.Factory` 1664 respectively. 1665* Analytics: 1666 * Extend `EventTime` with more details about the current player state 1667 ([#7332](https://github.com/google/ExoPlayer/issues/7332)). 1668 * Add `AnalyticsListener.onVideoFrameProcessingOffset` to report how early 1669 or late video frames are processed relative to them needing to be 1670 presented. Video frame processing offset fields are also added to 1671 `DecoderCounters`. 1672 * Fix incorrect `MediaPeriodId` for some renderer errors reported by 1673 `AnalyticsListener.onPlayerError`. 1674 * Remove `onMediaPeriodCreated`, `onMediaPeriodReleased` and 1675 `onReadingStarted` from `AnalyticsListener`. 1676* Test utils: Add `TestExoPlayer`, a utility class with APIs to create 1677 `SimpleExoPlayer` instances with fake components for testing. 1678* Media2 extension: This is a new extension that makes it easy to use 1679 ExoPlayer together with AndroidX Media2. Read 1680 [this blog post](https://medium.com/google-exoplayer/the-media2-extension-for-exoplayer-d6b7d89b9063) 1681 to learn more. 1682* Cast extension: Implement playlist API and deprecate the old queue 1683 manipulation API. 1684* IMA extension: 1685 * Migrate to new 'friendly obstruction' IMA SDK APIs, and allow apps to 1686 register a purpose and detail reason for overlay views via 1687 `AdsLoader.AdViewProvider`. 1688 * Add support for audio-only ads display containers by returning `null` 1689 from `AdsLoader.AdViewProvider.getAdViewGroup`, and allow skipping 1690 audio-only ads via `ImaAdsLoader.skipAd` 1691 ([#7689](https://github.com/google/ExoPlayer/issues/7689)). 1692 * Add `ImaAdsLoader.Builder.setCompanionAdSlots` so it's possible to set 1693 companion ad slots without accessing the `AdDisplayContainer`. 1694 * Add missing notification of `VideoAdPlayerCallback.onLoaded`. 1695 * Fix handling of incompatible VPAID ads 1696 ([#7832](https://github.com/google/ExoPlayer/issues/7832)). 1697 * Fix handling of empty ads at non-integer cue points 1698 ([#7889](https://github.com/google/ExoPlayer/issues/7889)). 1699* Demo app: 1700 * Replace the `extensions` variant with `decoderExtensions` and update the 1701 demo app use the Cronet and IMA extensions by default. 1702 * Expand the `exolist.json` schema, as well the structure of intents that 1703 can be used to launch `PlayerActivity`. See the 1704 [Demo application page](https://exoplayer.dev/demo-application.html#playing-your-own-content) 1705 for the latest versions. Changes include: 1706 * Add `drm_session_for_clear_content` to allow attaching DRM sessions 1707 to clear audio and video tracks. 1708 * Add `clip_start_position_ms` and `clip_end_position_ms` to allow 1709 clipped samples. 1710 * Use `StyledPlayerControlView` rather than `PlayerView`. 1711 * Remove support for media tunneling, random ABR and playback of spherical 1712 video. Developers wishing to experiment with these features can enable 1713 them by modifying the demo app source code. 1714 * Add support for downloading DRM-protected content using offline Widevine 1715 licenses. 1716 1717### 2.11.8 (2020-08-25) 1718 1719* Fix distorted playback of floating point audio when samples exceed the `[-1, 1720 1]` nominal range. 1721* MP4: 1722 * Add support for `piff` and `isml` brands 1723 ([#7584](https://github.com/google/ExoPlayer/issues/7584)). 1724 * Fix playback of very short MP4 files. 1725* FMP4: 1726 * Fix `saiz` and `senc` sample count checks, resolving a "length mismatch" 1727 `ParserException` when playing certain protected FMP4 streams 1728 ([#7592](https://github.com/google/ExoPlayer/issues/7592)). 1729 * Fix handling of `traf` boxes containing multiple `sbgp` or `sgpd` boxes. 1730* FLV: Ignore `SCRIPTDATA` segments with invalid name types, rather than 1731 failing playback ([#7675](https://github.com/google/ExoPlayer/issues/7675)). 1732* Better infer the content type of `.ism` and `.isml` streaming URLs. 1733* Workaround an issue on Broadcom based devices where playbacks would not 1734 transition to `STATE_ENDED` when using video tunneling mode 1735 ([#7647](https://github.com/google/ExoPlayer/issues/7647)). 1736* IMA extension: Upgrade to IMA SDK 3.19.4, bringing in a fix for setting the 1737 media load timeout 1738 ([#7170](https://github.com/google/ExoPlayer/issues/7170)). 1739* Demo app: Fix playback of ClearKey protected content on API level 26 and 1740 earlier ([#7735](https://github.com/google/ExoPlayer/issues/7735)). 1741 1742### 2.11.7 (2020-06-29) 1743 1744* IMA extension: Fix the way postroll "content complete" notifications are 1745 handled to avoid repeatedly refreshing the timeline after playback ends. 1746 1747### 2.11.6 (2020-06-19) 1748 1749* UI: Prevent `PlayerView` from temporarily hiding the video surface when 1750 seeking to an unprepared period within the current window. For example when 1751 seeking over an ad group, or to the next period in a multi-period DASH 1752 stream ([#5507](https://github.com/google/ExoPlayer/issues/5507)). 1753* IMA extension: 1754 * Add option to skip ads before the start position. 1755 * Catch unexpected errors in `stopAd` to avoid a crash 1756 ([#7492](https://github.com/google/ExoPlayer/issues/7492)). 1757 * Fix a bug that caused playback to be stuck buffering on resuming from 1758 the background after all ads had played to the end 1759 ([#7508](https://github.com/google/ExoPlayer/issues/7508)). 1760 * Fix a bug where the number of ads in an ad group couldn't change 1761 ([#7477](https://github.com/google/ExoPlayer/issues/7477)). 1762 * Work around unexpected `pauseAd`/`stopAd` for ads that have preloaded on 1763 seeking to another position 1764 ([#7492](https://github.com/google/ExoPlayer/issues/7492)). 1765 * Fix incorrect rounding of ad cue points. 1766 * Fix handling of postrolls preloading 1767 ([#7518](https://github.com/google/ExoPlayer/issues/7518)). 1768 1769### 2.11.5 (2020-06-05) 1770 1771* Improve the smoothness of video playback immediately after starting, seeking 1772 or resuming a playback 1773 ([#6901](https://github.com/google/ExoPlayer/issues/6901)). 1774* Add `SilenceMediaSource.Factory` to support tags. 1775* Enable the configuration of `SilenceSkippingAudioProcessor` 1776 ([#6705](https://github.com/google/ExoPlayer/issues/6705)). 1777* Fix bug where `PlayerMessages` throw an exception after `MediaSources` are 1778 removed from the playlist 1779 ([#7278](https://github.com/google/ExoPlayer/issues/7278)). 1780* Fix "Not allowed to start service" `IllegalStateException` in 1781 `DownloadService` 1782 ([#7306](https://github.com/google/ExoPlayer/issues/7306)). 1783* Fix issue in `AudioTrackPositionTracker` that could cause negative positions 1784 to be reported at the start of playback and immediately after seeking 1785 ([#7456](https://github.com/google/ExoPlayer/issues/7456)). 1786* Fix further cases where downloads would sometimes not resume after their 1787 network requirements are met 1788 ([#7453](https://github.com/google/ExoPlayer/issues/7453)). 1789* DASH: 1790 * Merge trick play adaptation sets (i.e., adaptation sets marked with 1791 `http://dashif.org/guidelines/trickmode`) into the same `TrackGroup` as 1792 the main adaptation sets to which they refer. Trick play tracks are 1793 marked with the `C.ROLE_FLAG_TRICK_PLAY` flag. 1794 * Fix assertion failure in `SampleQueue` when playing DASH streams with 1795 EMSG tracks ([#7273](https://github.com/google/ExoPlayer/issues/7273)). 1796* MP4: Store the Android capture frame rate only in `Format.metadata`. 1797 `Format.frameRate` now stores the calculated frame rate. 1798* FMP4: Avoid throwing an exception while parsing default sample values whose 1799 most significant bits are set 1800 ([#7207](https://github.com/google/ExoPlayer/issues/7207)). 1801* MP3: Fix issue parsing the XING headers belonging to files larger than 2GB 1802 ([#7337](https://github.com/google/ExoPlayer/issues/7337)). 1803* MPEG-TS: Fix issue where SEI NAL units were incorrectly dropped from H.265 1804 samples ([#7113](https://github.com/google/ExoPlayer/issues/7113)). 1805* UI: 1806 * Fix `DefaultTimeBar` to respect touch transformations 1807 ([#7303](https://github.com/google/ExoPlayer/issues/7303)). 1808 * Add `showScrubber` and `hideScrubber` methods to `DefaultTimeBar`. 1809* Text: 1810 * Use anti-aliasing and bitmap filtering when displaying bitmap subtitles. 1811 * Fix `SubtitlePainter` to render `EDGE_TYPE_OUTLINE` using the correct 1812 color. 1813* IMA extension: 1814 * Upgrade to IMA SDK version 3.19.0, and migrate to new preloading APIs 1815 ([#6429](https://github.com/google/ExoPlayer/issues/6429)). This fixes 1816 several issues involving preloading and handling of ad loading error 1817 cases: ([#4140](https://github.com/google/ExoPlayer/issues/4140), 1818 [#5006](https://github.com/google/ExoPlayer/issues/5006), 1819 [#6030](https://github.com/google/ExoPlayer/issues/6030), 1820 [#6097](https://github.com/google/ExoPlayer/issues/6097), 1821 [#6425](https://github.com/google/ExoPlayer/issues/6425), 1822 [#6967](https://github.com/google/ExoPlayer/issues/6967), 1823 [#7041](https://github.com/google/ExoPlayer/issues/7041), 1824 [#7161](https://github.com/google/ExoPlayer/issues/7161), 1825 [#7212](https://github.com/google/ExoPlayer/issues/7212), 1826 [#7340](https://github.com/google/ExoPlayer/issues/7340)). 1827 * Add support for timing out ad preloading, to avoid playback getting 1828 stuck if an ad group unexpectedly fails to load 1829 ([#5444](https://github.com/google/ExoPlayer/issues/5444), 1830 [#5966](https://github.com/google/ExoPlayer/issues/5966), 1831 [#7002](https://github.com/google/ExoPlayer/issues/7002)). 1832 * Fix `AdsMediaSource` child `MediaSource`s not being released. 1833* Cronet extension: Default to using the Cronet implementation in Google Play 1834 Services rather than Cronet Embedded. This allows Cronet to be used with a 1835 negligible increase in application size, compared to approximately 8MB when 1836 embedding the library. 1837* OkHttp extension: Upgrade OkHttp dependency to 3.12.11. 1838* MediaSession extension: 1839 * Only set the playback state to `BUFFERING` if `playWhenReady` is true 1840 ([#7206](https://github.com/google/ExoPlayer/issues/7206)). 1841 * Add missing `@Nullable` annotations to `MediaSessionConnector` 1842 ([#7234](https://github.com/google/ExoPlayer/issues/7234)). 1843* AV1 extension: Add a heuristic to determine the default number of threads 1844 used for AV1 playback using the extension. 1845 1846### 2.11.4 (2020-04-08) 1847 1848* Add `SimpleExoPlayer.setWakeMode` to allow automatic `WifiLock` and 1849 `WakeLock` handling 1850 ([#6914](https://github.com/google/ExoPlayer/issues/6914)). To use this 1851 feature, you must add the 1852 [WAKE_LOCK](https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK) 1853 permission to your application's manifest file. 1854* Text: 1855 * Catch and log exceptions in `TextRenderer` rather than re-throwing. This 1856 allows playback to continue even if subtitle decoding fails 1857 ([#6885](https://github.com/google/ExoPlayer/issues/6885)). 1858 * Allow missing hours and milliseconds in SubRip (.srt) timecodes 1859 ([#7122](https://github.com/google/ExoPlayer/issues/7122)). 1860* Audio: 1861 * Enable playback speed adjustment and silence skipping for floating point 1862 PCM audio, via resampling to 16-bit integer PCM. To output the original 1863 floating point audio without adjustment, pass `enableFloatOutput=true` 1864 to the `DefaultAudioSink` constructor 1865 ([#7134](https://github.com/google/ExoPlayer/issues/7134)). 1866 * Workaround issue that could cause slower than realtime playback of AAC 1867 on Android 10 1868 ([#6671](https://github.com/google/ExoPlayer/issues/6671)). 1869 * Fix case where another app spuriously holding transient audio focus 1870 could prevent ExoPlayer from acquiring audio focus for an indefinite 1871 period of time 1872 ([#7182](https://github.com/google/ExoPlayer/issues/7182)). 1873 * Fix case where the player volume could be permanently ducked if audio 1874 focus was released whilst ducking. 1875 * Fix playback of WAV files with trailing non-media bytes 1876 ([#7129](https://github.com/google/ExoPlayer/issues/7129)). 1877 * Fix playback of ADTS files with mid-stream ID3 metadata. 1878* DRM: 1879 * Fix stuck ad playbacks with DRM protected content 1880 ([#7188](https://github.com/google/ExoPlayer/issues/7188)). 1881 * Fix playback of Widevine protected content that only provides V1 PSSH 1882 atoms on API levels 21 and 22. 1883 * Fix playback of PlayReady content on Fire TV Stick (Gen 2). 1884* DASH: 1885 * Update the manifest URI to avoid repeated HTTP redirects 1886 ([#6907](https://github.com/google/ExoPlayer/issues/6907)). 1887 * Parse period `AssetIdentifier` elements. 1888* HLS: Recognize IMSC subtitles 1889 ([#7185](https://github.com/google/ExoPlayer/issues/7185)). 1890* UI: Add an option to set whether to use the orientation sensor for rotation 1891 in spherical playbacks 1892 ([#6761](https://github.com/google/ExoPlayer/issues/6761)). 1893* Analytics: Fix `PlaybackStatsListener` behavior when not keeping history 1894 ([#7160](https://github.com/google/ExoPlayer/issues/7160)). 1895* FFmpeg extension: Add support for `x86_64` architecture. 1896* Opus extension: Fix parsing of negative gain values 1897 ([#7046](https://github.com/google/ExoPlayer/issues/7046)). 1898* Cast extension: Upgrade `play-services-cast-framework` dependency to 18.1.0. 1899 This fixes an issue where `RemoteServiceException` was thrown due to 1900 `Context.startForegroundService()` not calling `Service.startForeground()` 1901 ([#7191](https://github.com/google/ExoPlayer/issues/7191)). 1902 1903### 2.11.3 (2020-02-19) 1904 1905* SmoothStreaming: Fix regression that broke playback in 2.11.2 1906 ([#6981](https://github.com/google/ExoPlayer/issues/6981)). 1907* DRM: Fix issue switching from protected content that uses a 16-byte 1908 initialization vector to one that uses an 8-byte initialization vector 1909 ([#6982](https://github.com/google/ExoPlayer/issues/6982)). 1910 1911### 2.11.2 (2020-02-13) 1912 1913* Add Java FLAC extractor 1914 ([#6406](https://github.com/google/ExoPlayer/issues/6406)). 1915* Startup latency optimization: 1916 * Reduce startup latency for DASH and SmoothStreaming playbacks by 1917 allowing codec initialization to occur before the network connection for 1918 the first media segment has been established. 1919 * Reduce startup latency for on-demand DASH playbacks by allowing codec 1920 initialization to occur before the sidx box has been loaded. 1921* Downloads: 1922 * Fix download resumption when the requirements for them to continue are 1923 met ([#6733](https://github.com/google/ExoPlayer/issues/6733), 1924 [#6798](https://github.com/google/ExoPlayer/issues/6798)). 1925 * Fix `DownloadHelper.createMediaSource` to use `customCacheKey` when 1926 creating `ProgressiveMediaSource` instances. 1927* DRM: Fix `NullPointerException` when playing DRM protected content 1928 ([#6951](https://github.com/google/ExoPlayer/issues/6951)). 1929* Metadata: 1930 * Update `IcyDecoder` to try ISO-8859-1 decoding if UTF-8 decoding fails. 1931 Also change `IcyInfo.rawMetadata` from `String` to `byte[]` to allow 1932 developers to handle data that's neither UTF-8 nor ISO-8859-1 1933 ([#6753](https://github.com/google/ExoPlayer/issues/6753)). 1934 * Select multiple metadata tracks if multiple metadata renderers are 1935 available ([#6676](https://github.com/google/ExoPlayer/issues/6676)). 1936 * Add support for ID3 genres added in Wimamp 5.6 (2010). 1937* UI: 1938 * Show ad group markers in `DefaultTimeBar` even if they are after the end 1939 of the current window 1940 ([#6552](https://github.com/google/ExoPlayer/issues/6552)). 1941 * Don't use notification chronometer if playback speed is != 1.0 1942 ([#6816](https://github.com/google/ExoPlayer/issues/6816)). 1943* HLS: Fix playback of DRM protected content that uses key rotation 1944 ([#6903](https://github.com/google/ExoPlayer/issues/6903)). 1945* WAV: 1946 * Support IMA ADPCM encoded data. 1947 * Improve support for G.711 A-law and mu-law encoded data. 1948* MP4: Support "twos" codec (big endian PCM) 1949 ([#5789](https://github.com/google/ExoPlayer/issues/5789)). 1950* FMP4: Add support for encrypted AC-4 tracks. 1951* HLS: Fix slow seeking into long MP3 segments 1952 ([#6155](https://github.com/google/ExoPlayer/issues/6155)). 1953* Fix handling of E-AC-3 streams that contain AC-3 syncframes 1954 ([#6602](https://github.com/google/ExoPlayer/issues/6602)). 1955* Fix playback of TrueHD streams in Matroska 1956 ([#6845](https://github.com/google/ExoPlayer/issues/6845)). 1957* Fix MKV subtitles to disappear when intended instead of lasting until the 1958 next cue ([#6833](https://github.com/google/ExoPlayer/issues/6833)). 1959* OkHttp extension: Upgrade OkHttp dependency to 3.12.8, which fixes a class 1960 of `SocketTimeoutException` issues when using HTTP/2 1961 ([#4078](https://github.com/google/ExoPlayer/issues/4078)). 1962* FLAC extension: Fix handling of bit depths other than 16 in `FLACDecoder`. 1963 This issue caused FLAC streams with other bit depths to sound like white 1964 noise on earlier releases, but only when embedded in a non-FLAC container 1965 such as Matroska or MP4. 1966* Demo apps: Add 1967 [GL demo app](https://github.com/google/ExoPlayer/tree/dev-v2/demos/gl) to 1968 show how to render video to a `GLSurfaceView` while applying a GL shader. 1969 ([#6920](https://github.com/google/ExoPlayer/issues/6920)). 1970 1971### 2.11.1 (2019-12-20) 1972 1973* UI: Exclude `DefaultTimeBar` region from system gesture detection 1974 ([#6685](https://github.com/google/ExoPlayer/issues/6685)). 1975* ProGuard fixes: 1976 * Ensure `Libgav1VideoRenderer` constructor is kept for use by 1977 `DefaultRenderersFactory` 1978 ([#6773](https://github.com/google/ExoPlayer/issues/6773)). 1979 * Ensure `VideoDecoderOutputBuffer` and its members are kept for use by 1980 video decoder extensions. 1981 * Ensure raw resources used with `RawResourceDataSource` are kept. 1982 * Suppress spurious warnings about the `javax.annotation` package, and 1983 restructure use of `IntDef` annotations to remove spurious warnings 1984 about `SsaStyle$SsaAlignment` 1985 ([#6771](https://github.com/google/ExoPlayer/issues/6771)). 1986* Fix `CacheDataSource` to correctly propagate `DataSpec.httpRequestHeaders`. 1987* Fix issue with `DefaultDownloadIndex` that could result in an 1988 `IllegalStateException` being thrown from 1989 `DefaultDownloadIndex.getDownloadForCurrentRow` 1990 ([#6785](https://github.com/google/ExoPlayer/issues/6785)). 1991* Fix `IndexOutOfBoundsException` in `SinglePeriodTimeline.getWindow` 1992 ([#6776](https://github.com/google/ExoPlayer/issues/6776)). 1993* Add missing `@Nullable` to `MediaCodecAudioRenderer.getMediaClock` and 1994 `SimpleDecoderAudioRenderer.getMediaClock` 1995 ([#6792](https://github.com/google/ExoPlayer/issues/6792)). 1996 1997### 2.11.0 (2019-12-11) 1998 1999* Core library: 2000 * Replace `ExoPlayerFactory` by `SimpleExoPlayer.Builder` and 2001 `ExoPlayer.Builder`. 2002 * Add automatic `WakeLock` handling to `SimpleExoPlayer`, which can be 2003 enabled by calling `SimpleExoPlayer.setHandleWakeLock` 2004 ([#5846](https://github.com/google/ExoPlayer/issues/5846)). To use this 2005 feature, you must add the 2006 [WAKE_LOCK](https://developer.android.com/reference/android/Manifest.permission.html#WAKE_LOCK) 2007 permission to your application's manifest file. 2008 * Add automatic "audio becoming noisy" handling to `SimpleExoPlayer`, 2009 which can be enabled by calling 2010 `SimpleExoPlayer.setHandleAudioBecomingNoisy`. 2011 * Wrap decoder exceptions in a new `DecoderException` class and report 2012 them as renderer errors. 2013 * Add `Timeline.Window.isLive` to indicate that a window is a live stream 2014 ([#2668](https://github.com/google/ExoPlayer/issues/2668) and 2015 [#5973](https://github.com/google/ExoPlayer/issues/5973)). 2016 * Add `Timeline.Window.uid` to uniquely identify window instances. 2017 * Deprecate `setTag` parameter of `Timeline.getWindow`. Tags will always 2018 be set. 2019 * Deprecate passing the manifest directly to 2020 `Player.EventListener.onTimelineChanged`. It can be accessed through 2021 `Timeline.Window.manifest` or `Player.getCurrentManifest()` 2022 * Add `MediaSource.enable` and `MediaSource.disable` to improve resource 2023 management in playlists. 2024 * Add `MediaPeriod.isLoading` to improve `Player.isLoading` state. 2025 * Fix issue where player errors are thrown too early at playlist 2026 transitions ([#5407](https://github.com/google/ExoPlayer/issues/5407)). 2027 * Add `Format` and renderer support flags to renderer 2028 `ExoPlaybackException`s. 2029 * Where there are multiple platform decoders for a given MIME type, prefer 2030 to use one that advertises support for the profile and level of the 2031 media being played over one that does not, even if it does not come 2032 first in the `MediaCodecList`. 2033* DRM: 2034 * Inject `DrmSessionManager` into the `MediaSources` instead of 2035 `Renderers`. This allows each `MediaSource` in a 2036 `ConcatenatingMediaSource` to use a different `DrmSessionManager` 2037 ([#5619](https://github.com/google/ExoPlayer/issues/5619)). 2038 * Add `DefaultDrmSessionManager.Builder`, and remove 2039 `DefaultDrmSessionManager` static factory methods that leaked 2040 `ExoMediaDrm` instances 2041 ([#4721](https://github.com/google/ExoPlayer/issues/4721)). 2042 * Add support for the use of secure decoders when playing clear content 2043 ([#4867](https://github.com/google/ExoPlayer/issues/4867)). This can be 2044 enabled using `DefaultDrmSessionManager.Builder`'s 2045 `setUseDrmSessionsForClearContent` method. 2046 * Add support for custom `LoadErrorHandlingPolicies` in key and 2047 provisioning requests 2048 ([#6334](https://github.com/google/ExoPlayer/issues/6334)). Custom 2049 policies can be passed via `DefaultDrmSessionManager.Builder`'s 2050 `setLoadErrorHandlingPolicy` method. 2051 * Use `ExoMediaDrm.Provider` in `OfflineLicenseHelper` to avoid leaking 2052 `ExoMediaDrm` instances 2053 ([#4721](https://github.com/google/ExoPlayer/issues/4721)). 2054* Track selection: 2055 * Update `DefaultTrackSelector` to set a viewport constraint for the 2056 default display by default. 2057 * Update `DefaultTrackSelector` to set text language and role flag 2058 constraints for the device's accessibility settings by default 2059 ([#5749](https://github.com/google/ExoPlayer/issues/5749)). 2060 * Add option to set preferred text role flags using 2061 `DefaultTrackSelector.ParametersBuilder.setPreferredTextRoleFlags`. 2062* LoadControl: 2063 * Default `prioritizeTimeOverSizeThresholds` to false to prevent OOM 2064 errors ([#6647](https://github.com/google/ExoPlayer/issues/6647)). 2065* Android 10: 2066 * Set `compileSdkVersion` to 29 to enable use of Android 10 APIs. 2067 * Expose new `isHardwareAccelerated`, `isSoftwareOnly` and `isVendor` 2068 flags in `MediaCodecInfo` 2069 ([#5839](https://github.com/google/ExoPlayer/issues/5839)). 2070 * Add `allowedCapturePolicy` field to `AudioAttributes` to allow to 2071 configuration of the audio capture policy. 2072* Video: 2073 * Pass the codec output `MediaFormat` to `VideoFrameMetadataListener`. 2074 * Fix byte order of HDR10+ static metadata to match CTA-861.3. 2075 * Support out-of-band HDR10+ dynamic metadata for VP9 in WebM/Matroska. 2076 * Assume that protected content requires a secure decoder when evaluating 2077 whether `MediaCodecVideoRenderer` supports a given video format 2078 ([#5568](https://github.com/google/ExoPlayer/issues/5568)). 2079 * Fix Dolby Vision fallback to AVC and HEVC. 2080 * Fix early end-of-stream detection when using video tunneling, on API 2081 level 23 and above. 2082 * Fix an issue where a keyframe was rendered rather than skipped when 2083 performing an exact seek to a non-zero position close to the start of 2084 the stream. 2085* Audio: 2086 * Fix the start of audio getting truncated when transitioning to a new 2087 item in a playlist of Opus streams. 2088 * Workaround broken raw audio decoding on Oppo R9 2089 ([#5782](https://github.com/google/ExoPlayer/issues/5782)). 2090 * Reconfigure audio sink when PCM encoding changes 2091 ([#6601](https://github.com/google/ExoPlayer/issues/6601)). 2092 * Allow `AdtsExtractor` to encounter EOF when calculating average frame 2093 size ([#6700](https://github.com/google/ExoPlayer/issues/6700)). 2094* Text: 2095 * Add support for position and overlapping start/end times in SSA/ASS 2096 subtitles ([#6320](https://github.com/google/ExoPlayer/issues/6320)). 2097 * Require an end time or duration for SubRip (SRT) and SubStation Alpha 2098 (SSA/ASS) subtitles. This applies to both sidecar files & subtitles 2099 [embedded in Matroska streams](https://matroska.org/technical/specs/subtitles/index.html). 2100* UI: 2101 * Make showing and hiding player controls accessible to TalkBack in 2102 `PlayerView`. 2103 * Rename `spherical_view` surface type to `spherical_gl_surface_view`. 2104 * Make it easier to override the shuffle, repeat, fullscreen, VR and small 2105 notification icon assets 2106 ([#6709](https://github.com/google/ExoPlayer/issues/6709)). 2107* Analytics: 2108 * Remove `AnalyticsCollector.Factory`. Instances should be created 2109 directly, and the `Player` should be set by calling 2110 `AnalyticsCollector.setPlayer`. 2111 * Add `PlaybackStatsListener` to collect `PlaybackStats` for analysis and 2112 analytics reporting. 2113* DataSource 2114 * Add `DataSpec.httpRequestHeaders` to support setting per-request headers 2115 for HTTP and HTTPS. 2116 * Remove the `DataSpec.FLAG_ALLOW_ICY_METADATA` flag. Use is replaced by 2117 setting the `IcyHeaders.REQUEST_HEADER_ENABLE_METADATA_NAME` header in 2118 `DataSpec.httpRequestHeaders`. 2119 * Fail more explicitly when local file URIs contain invalid parts (e.g. a 2120 fragment) ([#6470](https://github.com/google/ExoPlayer/issues/6470)). 2121* DASH: Support negative @r values in segment timelines 2122 ([#1787](https://github.com/google/ExoPlayer/issues/1787)). 2123* HLS: 2124 * Use peak bitrate rather than average bitrate for adaptive track 2125 selection. 2126 * Fix issue where streams could get stuck in an infinite buffering state 2127 after a postroll ad 2128 ([#6314](https://github.com/google/ExoPlayer/issues/6314)). 2129* Matroska: Support lacing in Blocks 2130 ([#3026](https://github.com/google/ExoPlayer/issues/3026)). 2131* AV1 extension: 2132 * New in this release. The AV1 extension allows use of the 2133 [libgav1 software decoder](https://chromium.googlesource.com/codecs/libgav1/) 2134 in ExoPlayer. You can read more about playing AV1 videos with ExoPlayer 2135 [here](https://medium.com/google-exoplayer/playing-av1-videos-with-exoplayer-a7cb19bedef9). 2136* VP9 extension: 2137 * Update to use NDK r20. 2138 * Rename `VpxVideoSurfaceView` to `VideoDecoderSurfaceView` and move it to 2139 the core library. 2140 * Move `LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER` to 2141 `C.MSG_SET_OUTPUT_BUFFER_RENDERER`. 2142 * Use `VideoDecoderRenderer` as an implementation of 2143 `VideoDecoderOutputBufferRenderer`, instead of 2144 `VideoDecoderSurfaceView`. 2145* FLAC extension: Update to use NDK r20. 2146* Opus extension: Update to use NDK r20. 2147* FFmpeg extension: 2148 * Update to use NDK r20. 2149 * Update to use FFmpeg version 4.2. It is necessary to rebuild the native 2150 part of the extension after this change, following the instructions in 2151 the extension's readme. 2152* MediaSession extension: Add `MediaSessionConnector.setCaptionCallback` to 2153 support `ACTION_SET_CAPTIONING_ENABLED` events. 2154* GVR extension: This extension is now deprecated. 2155* Demo apps: 2156 * Add 2157 [SurfaceControl demo app](https://github.com/google/ExoPlayer/tree/r2.11.0/demos/surface) 2158 to show how to use the Android 10 `SurfaceControl` API with ExoPlayer 2159 ([#677](https://github.com/google/ExoPlayer/issues/677)). 2160 * Add support for subtitle files to the 2161 [Main demo app](https://github.com/google/ExoPlayer/tree/r2.11.0/demos/main) 2162 ([#5523](https://github.com/google/ExoPlayer/issues/5523)). 2163 * Remove the IMA demo app. IMA functionality is demonstrated by the 2164 [main demo app](https://github.com/google/ExoPlayer/tree/r2.11.0/demos/main). 2165 * Add basic DRM support to the 2166 [Cast demo app](https://github.com/google/ExoPlayer/tree/r2.11.0/demos/cast). 2167* TestUtils: Publish the `testutils` module to simplify unit testing with 2168 ExoPlayer ([#6267](https://github.com/google/ExoPlayer/issues/6267)). 2169* IMA extension: Remove `AdsManager` listeners on release to avoid leaking an 2170 `AdEventListener` provided by the app 2171 ([#6687](https://github.com/google/ExoPlayer/issues/6687)). 2172 2173### 2.10.8 (2019-11-19) 2174 2175* E-AC3 JOC 2176 * Handle new signaling in DASH manifests 2177 ([#6636](https://github.com/google/ExoPlayer/issues/6636)). 2178 * Fix E-AC3 JOC passthrough playback failing to initialize due to 2179 incorrect channel count check. 2180* FLAC 2181 * Fix sniffing for some FLAC streams. 2182 * Fix FLAC `Format.bitrate` values. 2183* Parse ALAC channel count and sample rate information from a more robust 2184 source when contained in MP4 2185 ([#6648](https://github.com/google/ExoPlayer/issues/6648)). 2186* Fix seeking into multi-period content in the edge case that the period 2187 containing the seek position has just been removed 2188 ([#6641](https://github.com/google/ExoPlayer/issues/6641)). 2189 2190### 2.10.7 (2019-11-06) 2191 2192* HLS: Fix detection of Dolby Atmos to match the HLS authoring specification. 2193* MediaSession extension: Update shuffle and repeat modes when playback state 2194 is invalidated ([#6582](https://github.com/google/ExoPlayer/issues/6582)). 2195* Fix the start of audio getting truncated when transitioning to a new item in 2196 a playlist of Opus streams. 2197 2198### 2.10.6 (2019-10-17) 2199 2200* Add `Player.onPlaybackSuppressionReasonChanged` to allow listeners to detect 2201 playbacks suppressions (e.g. transient audio focus loss) directly 2202 ([#6203](https://github.com/google/ExoPlayer/issues/6203)). 2203* DASH: 2204 * Support `Label` elements 2205 ([#6297](https://github.com/google/ExoPlayer/issues/6297)). 2206 * Support legacy audio channel configuration 2207 ([#6523](https://github.com/google/ExoPlayer/issues/6523)). 2208* HLS: Add support for ID3 in EMSG when using FMP4 streams 2209 ([spec](https://aomediacodec.github.io/av1-id3/)). 2210* MP3: Add workaround to avoid prematurely ending playback of some SHOUTcast 2211 live streams ([#6537](https://github.com/google/ExoPlayer/issues/6537), 2212 [#6315](https://github.com/google/ExoPlayer/issues/6315) and 2213 [#5658](https://github.com/google/ExoPlayer/issues/5658)). 2214* Metadata: Expose the raw ICY metadata through `IcyInfo` 2215 ([#6476](https://github.com/google/ExoPlayer/issues/6476)). 2216* UI: 2217 * Setting `app:played_color` on `PlayerView` and `PlayerControlView` no 2218 longer adjusts the colors of the scrubber handle , buffered and unplayed 2219 parts of the time bar. These can be set separately using 2220 `app:scrubber_color`, `app:buffered_color` and `app_unplayed_color` 2221 respectively. 2222 * Setting `app:ad_marker_color` on `PlayerView` and `PlayerControlView` no 2223 longer adjusts the color of played ad markers. The color of played ad 2224 markers can be set separately using `app:played_ad_marker_color`. 2225 2226### 2.10.5 (2019-09-20) 2227 2228* Add `Player.isPlaying` and `EventListener.onIsPlayingChanged` to check 2229 whether the playback position is advancing. This helps to determine if 2230 playback is suppressed due to audio focus loss. Also add 2231 `Player.getPlaybackSuppressedReason` to determine the reason of the 2232 suppression ([#6203](https://github.com/google/ExoPlayer/issues/6203)). 2233* Track selection 2234 * Add `allowAudioMixedChannelCountAdaptiveness` parameter to 2235 `DefaultTrackSelector` to allow adaptive selections of audio tracks with 2236 different channel counts. 2237 * Improve text selection logic to always prefer the better language 2238 matches over other selection parameters. 2239 * Fix audio selection issue where languages are compared by bitrate 2240 ([#6335](https://github.com/google/ExoPlayer/issues/6335)). 2241* Performance 2242 * Increase maximum video buffer size from 13MB to 32MB. The previous 2243 default was too small for high quality streams. 2244 * Reset `DefaultBandwidthMeter` to initial values on network change. 2245 * Bypass sniffing in `ProgressiveMediaPeriod` in case a single extractor 2246 is provided ([#6325](https://github.com/google/ExoPlayer/issues/6325)). 2247* Metadata 2248 * Support EMSG V1 boxes in FMP4. 2249 * Support unwrapping of nested metadata (e.g. ID3 and SCTE-35 in EMSG). 2250* Add `HttpDataSource.getResponseCode` to provide the status code associated 2251 with the most recent HTTP response. 2252* Fix transitions between packed audio and non-packed audio segments in HLS 2253 ([#6444](https://github.com/google/ExoPlayer/issues/6444)). 2254* Fix issue where a request would be retried after encountering an error, even 2255 though the `LoadErrorHandlingPolicy` classified the error as fatal. 2256* Fix initialization data handling for FLAC in MP4 2257 ([#6396](https://github.com/google/ExoPlayer/issues/6396), 2258 [#6397](https://github.com/google/ExoPlayer/issues/6397)). 2259* Fix decoder selection for E-AC3 JOC streams 2260 ([#6398](https://github.com/google/ExoPlayer/issues/6398)). 2261* Fix `PlayerNotificationManager` to show play icon rather than pause icon 2262 when playback is ended 2263 ([#6324](https://github.com/google/ExoPlayer/issues/6324)). 2264* RTMP extension: Upgrade LibRtmp-Client-for-Android to fix RTMP playback 2265 issues ([#4200](https://github.com/google/ExoPlayer/issues/4200), 2266 [#4249](https://github.com/google/ExoPlayer/issues/4249), 2267 [#4319](https://github.com/google/ExoPlayer/issues/4319), 2268 [#4337](https://github.com/google/ExoPlayer/issues/4337)). 2269* IMA extension: Fix crash in `ImaAdsLoader.onTimelineChanged` 2270 ([#5831](https://github.com/google/ExoPlayer/issues/5831)). 2271 2272### 2.10.4 (2019-07-26) 2273 2274* Offline: Add `Scheduler` implementation that uses `WorkManager`. 2275* Add ability to specify a description when creating notification channels via 2276 ExoPlayer library classes. 2277* Switch normalized BCP-47 language codes to use 2-letter ISO 639-1 language 2278 tags instead of 3-letter ISO 639-2 language tags. 2279* Ensure the `SilenceMediaSource` position is in range 2280 ([#6229](https://github.com/google/ExoPlayer/issues/6229)). 2281* WAV: Calculate correct duration for clipped streams 2282 ([#6241](https://github.com/google/ExoPlayer/issues/6241)). 2283* MP3: Use CBR header bitrate, not calculated bitrate. This reverts a change 2284 from 2.9.3 ([#6238](https://github.com/google/ExoPlayer/issues/6238)). 2285* FLAC extension: Parse `VORBIS_COMMENT` and `PICTURE` metadata 2286 ([#5527](https://github.com/google/ExoPlayer/issues/5527)). 2287* Fix issue where initial seek positions get ignored when playing a preroll ad 2288 ([#6201](https://github.com/google/ExoPlayer/issues/6201)). 2289* Fix issue where invalid language tags were normalized to "und" instead of 2290 keeping the original 2291 ([#6153](https://github.com/google/ExoPlayer/issues/6153)). 2292* Fix `DataSchemeDataSource` re-opening and range requests 2293 ([#6192](https://github.com/google/ExoPlayer/issues/6192)). 2294* Fix FLAC and ALAC playback on some LG devices 2295 ([#5938](https://github.com/google/ExoPlayer/issues/5938)). 2296* Fix issue when calling `performClick` on `PlayerView` without 2297 `PlayerControlView` 2298 ([#6260](https://github.com/google/ExoPlayer/issues/6260)). 2299* Fix issue where playback speeds are not used in adaptive track selections 2300 after manual selection changes for other renderers 2301 ([#6256](https://github.com/google/ExoPlayer/issues/6256)). 2302 2303### 2.10.3 (2019-07-09) 2304 2305* Display last frame when seeking to end of stream 2306 ([#2568](https://github.com/google/ExoPlayer/issues/2568)). 2307* Audio: 2308 * Fix an issue where not all audio was played out when the configuration 2309 for the underlying track was changing (e.g., at some period 2310 transitions). 2311 * Fix an issue where playback speed was applied inaccurately in playlists 2312 ([#6117](https://github.com/google/ExoPlayer/issues/6117)). 2313* UI: Fix `PlayerView` incorrectly consuming touch events if no controller is 2314 attached ([#6109](https://github.com/google/ExoPlayer/issues/6109)). 2315* CEA608: Fix repetition of special North American characters 2316 ([#6133](https://github.com/google/ExoPlayer/issues/6133)). 2317* FLV: Fix bug that caused playback of some live streams to not start 2318 ([#6111](https://github.com/google/ExoPlayer/issues/6111)). 2319* SmoothStreaming: Parse text stream `Subtype` into `Format.roleFlags`. 2320* MediaSession extension: Fix `MediaSessionConnector.play()` not resuming 2321 playback ([#6093](https://github.com/google/ExoPlayer/issues/6093)). 2322 2323### 2.10.2 (2019-06-03) 2324 2325* Add `ResolvingDataSource` for just-in-time resolution of `DataSpec`s 2326 ([#5779](https://github.com/google/ExoPlayer/issues/5779)). 2327* Add `SilenceMediaSource` that can be used to play silence of a given 2328 duration ([#5735](https://github.com/google/ExoPlayer/issues/5735)). 2329* Offline: 2330 * Prevent unexpected `DownloadHelper.Callback.onPrepared` callbacks after 2331 preparation of a `DownloadHelper` fails 2332 ([#5915](https://github.com/google/ExoPlayer/issues/5915)). 2333 * Fix `CacheUtil.cache()` downloading too much data 2334 ([#5927](https://github.com/google/ExoPlayer/issues/5927)). 2335 * Fix misreporting cached bytes when caching is paused 2336 ([#5573](https://github.com/google/ExoPlayer/issues/5573)). 2337* UI: 2338 * Allow setting `DefaultTimeBar` attributes on `PlayerView` and 2339 `PlayerControlView`. 2340 * Change playback controls toggle from touch down to touch up events 2341 ([#5784](https://github.com/google/ExoPlayer/issues/5784)). 2342 * Fix issue where playback controls were not kept visible on key presses 2343 ([#5963](https://github.com/google/ExoPlayer/issues/5963)). 2344* Subtitles: 2345 * CEA-608: Handle XDS and TEXT modes 2346 ([#5807](https://github.com/google/ExoPlayer/pull/5807)). 2347 * TTML: Fix bitmap rendering 2348 ([#5633](https://github.com/google/ExoPlayer/pull/5633)). 2349* IMA: Fix ad pod index offset calculation without preroll 2350 ([#5928](https://github.com/google/ExoPlayer/issues/5928)). 2351* Add a `playWhenReady` flag to MediaSessionConnector.PlaybackPreparer methods 2352 to indicate whether a controller sent a play or only a prepare command. This 2353 allows to take advantage of decoder reuse with the MediaSessionConnector 2354 ([#5891](https://github.com/google/ExoPlayer/issues/5891)). 2355* Add `ProgressUpdateListener` to `PlayerControlView` 2356 ([#5834](https://github.com/google/ExoPlayer/issues/5834)). 2357* Add support for auto-detecting UDP streams in `DefaultDataSource` 2358 ([#6036](https://github.com/google/ExoPlayer/pull/6036)). 2359* Allow enabling decoder fallback with `DefaultRenderersFactory` 2360 ([#5942](https://github.com/google/ExoPlayer/issues/5942)). 2361* Gracefully handle revoked `ACCESS_NETWORK_STATE` permission 2362 ([#6019](https://github.com/google/ExoPlayer/issues/6019)). 2363* Fix decoding problems when seeking back after seeking beyond a mid-roll ad 2364 ([#6009](https://github.com/google/ExoPlayer/issues/6009)). 2365* Fix application of `maxAudioBitrate` for adaptive audio track groups 2366 ([#6006](https://github.com/google/ExoPlayer/issues/6006)). 2367* Fix bug caused by parallel adaptive track selection using `Format`s without 2368 bitrate information 2369 ([#5971](https://github.com/google/ExoPlayer/issues/5971)). 2370* Fix bug in `CastPlayer.getCurrentWindowIndex()` 2371 ([#5955](https://github.com/google/ExoPlayer/issues/5955)). 2372 2373### 2.10.1 (2019-05-16) 2374 2375* Offline: Add option to remove all downloads. 2376* HLS: Fix `NullPointerException` when using HLS chunkless preparation 2377 ([#5868](https://github.com/google/ExoPlayer/issues/5868)). 2378* Fix handling of empty values and line terminators in SHOUTcast ICY metadata 2379 ([#5876](https://github.com/google/ExoPlayer/issues/5876)). 2380* Fix DVB subtitles for SDK 28 2381 ([#5862](https://github.com/google/ExoPlayer/issues/5862)). 2382* Add a workaround for a decoder failure on ZTE Axon7 mini devices when 2383 playing 48kHz audio 2384 ([#5821](https://github.com/google/ExoPlayer/issues/5821)). 2385 2386### 2.10.0 (2019-04-15) 2387 2388* Core library: 2389 * Improve decoder re-use between playbacks 2390 ([#2826](https://github.com/google/ExoPlayer/issues/2826)). Read 2391 [this blog post](https://medium.com/google-exoplayer/improved-decoder-reuse-in-exoplayer-ef4c6d99591d) 2392 for more details. 2393 * Rename `ExtractorMediaSource` to `ProgressiveMediaSource`. 2394 * Fix issue where using `ProgressiveMediaSource.Factory` would mean that 2395 `DefaultExtractorsFactory` would be kept by proguard. Custom 2396 `ExtractorsFactory` instances must now be passed via the 2397 `ProgressiveMediaSource.Factory` constructor, and `setExtractorsFactory` 2398 is deprecated. 2399 * Make the default minimum buffer size equal the maximum buffer size for 2400 video playbacks 2401 ([#2083](https://github.com/google/ExoPlayer/issues/2083)). 2402 * Move `PriorityTaskManager` from `DefaultLoadControl` to 2403 `SimpleExoPlayer`. 2404 * Add new `ExoPlaybackException` types for remote exceptions and 2405 out-of-memory errors. 2406 * Use full BCP 47 language tags in `Format`. 2407 * Do not retry failed loads whose error is `FileNotFoundException`. 2408 * Fix issue where not resetting the position for a new `MediaSource` in 2409 calls to `ExoPlayer.prepare` causes an `IndexOutOfBoundsException` 2410 ([#5520](https://github.com/google/ExoPlayer/issues/5520)). 2411* Offline: 2412 * Improve offline support. `DownloadManager` now tracks all offline 2413 content, not just tasks in progress. Read 2414 [this page](https://exoplayer.dev/downloading-media.html) for more 2415 details. 2416* Caching: 2417 * Improve performance of `SimpleCache` 2418 ([#4253](https://github.com/google/ExoPlayer/issues/4253)). 2419 * Cache data with unknown length by default. The previous flag to opt in 2420 to this behavior (`DataSpec.FLAG_ALLOW_CACHING_UNKNOWN_LENGTH`) has been 2421 replaced with an opt out flag 2422 (`DataSpec.FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN`). 2423* Extractors: 2424 * MP4/FMP4: Add support for Dolby Vision. 2425 * MP4: Fix issue handling meta atoms in some streams 2426 ([#5698](https://github.com/google/ExoPlayer/issues/5698), 2427 [#5694](https://github.com/google/ExoPlayer/issues/5694)). 2428 * MP3: Add support for SHOUTcast ICY metadata 2429 ([#3735](https://github.com/google/ExoPlayer/issues/3735)). 2430 * MP3: Fix ID3 frame unsychronization 2431 ([#5673](https://github.com/google/ExoPlayer/issues/5673)). 2432 * MP3: Fix playback of badly clipped files 2433 ([#5772](https://github.com/google/ExoPlayer/issues/5772)). 2434 * MPEG-TS: Enable HDMV DTS stream detection only if a flag is set. By 2435 default (i.e. if the flag is not set), the 0x82 elementary stream type 2436 is now treated as an SCTE subtitle track 2437 ([#5330](https://github.com/google/ExoPlayer/issues/5330)). 2438* Track selection: 2439 * Add options for controlling audio track selections to 2440 `DefaultTrackSelector` 2441 ([#3314](https://github.com/google/ExoPlayer/issues/3314)). 2442 * Update `TrackSelection.Factory` interface to support creating all track 2443 selections together. 2444 * Allow to specify a selection reason for a `SelectionOverride`. 2445 * Select audio track based on system language if no preference is 2446 provided. 2447 * When no text language preference matches, only select forced text tracks 2448 whose language matches the selected audio language. 2449* UI: 2450 * Update `DefaultTimeBar` based on duration of media and add parameter to 2451 set the minimum update interval to control the smoothness of the updates 2452 ([#5040](https://github.com/google/ExoPlayer/issues/5040)). 2453 * Move creation of dialogs for `TrackSelectionView`s to 2454 `TrackSelectionDialogBuilder` and add option to select multiple 2455 overrides. 2456 * Change signature of `PlayerNotificationManager.NotificationListener` to 2457 better fit service requirements. 2458 * Add option to include navigation actions in the compact mode of 2459 notifications created using `PlayerNotificationManager`. 2460 * Fix issues with flickering notifications on KitKat when using 2461 `PlayerNotificationManager` and `DownloadNotificationUtil`. For the 2462 latter, applications should switch to using 2463 `DownloadNotificationHelper`. 2464 * Fix accuracy of D-pad seeking in `DefaultTimeBar` 2465 ([#5767](https://github.com/google/ExoPlayer/issues/5767)). 2466* Audio: 2467 * Allow `AudioProcessor`s to be drained of pending output after they are 2468 reconfigured. 2469 * Fix an issue that caused audio to be truncated at the end of a period 2470 when switching to a new period where gapless playback information was 2471 newly present or newly absent. 2472 * Add support for reading AC-4 streams 2473 ([#5303](https://github.com/google/ExoPlayer/pull/5303)). 2474* Video: 2475 * Remove `MediaCodecSelector.DEFAULT_WITH_FALLBACK`. Apps should instead 2476 signal that fallback should be used by passing `true` as the 2477 `enableDecoderFallback` parameter when instantiating the video renderer. 2478 * Support video tunneling when the decoder is not listed first for the 2479 MIME type ([#3100](https://github.com/google/ExoPlayer/issues/3100)). 2480 * Query `MediaCodecList.ALL_CODECS` when selecting a tunneling decoder 2481 ([#5547](https://github.com/google/ExoPlayer/issues/5547)). 2482* DRM: 2483 * Fix black flicker when keys rotate in DRM protected content 2484 ([#3561](https://github.com/google/ExoPlayer/issues/3561)). 2485 * Work around lack of LA_URL attribute in PlayReady key request init data. 2486* CEA-608: Improved conformance to the specification 2487 ([#3860](https://github.com/google/ExoPlayer/issues/3860)). 2488* DASH: 2489 * Parse role and accessibility descriptors into `Format.roleFlags`. 2490 * Support multiple CEA-608 channels muxed into FMP4 representations 2491 ([#5656](https://github.com/google/ExoPlayer/issues/5656)). 2492* HLS: 2493 * Prevent unnecessary reloads of initialization segments. 2494 * Form an adaptive track group out of audio renditions with matching name. 2495 * Support encrypted initialization segments 2496 ([#5441](https://github.com/google/ExoPlayer/issues/5441)). 2497 * Parse `EXT-X-MEDIA` `CHARACTERISTICS` attribute into `Format.roleFlags`. 2498 * Add metadata entry for HLS tracks to expose master playlist information. 2499 * Prevent `IndexOutOfBoundsException` in some live HLS scenarios 2500 ([#5816](https://github.com/google/ExoPlayer/issues/5816)). 2501* Support for playing spherical videos on Daydream. 2502* Cast extension: Work around Cast framework returning a limited-size queue 2503 items list ([#4964](https://github.com/google/ExoPlayer/issues/4964)). 2504* VP9 extension: Remove RGB output mode and libyuv dependency, and switch to 2505 surface YUV output as the default. Remove constructor parameters 2506 `scaleToFit` and `useSurfaceYuvOutput`. 2507* MediaSession extension: 2508 * Let apps intercept media button events 2509 ([#5179](https://github.com/google/ExoPlayer/issues/5179)). 2510 * Fix issue with `TimelineQueueNavigator` not publishing the queue in 2511 shuffled order when in shuffle mode. 2512 * Allow handling of custom commands via `registerCustomCommandReceiver`. 2513 * Add ability to include an extras `Bundle` when reporting a custom error. 2514* Log warnings when extension native libraries can't be used, to help with 2515 diagnosing playback failures 2516 ([#5788](https://github.com/google/ExoPlayer/issues/5788)). 2517 2518### 2.9.6 (2019-02-19) 2519 2520* Remove `player` and `isTopLevelSource` parameters from 2521 `MediaSource.prepare`. 2522* IMA extension: 2523 * Require setting the `Player` on `AdsLoader` instances before playback. 2524 * Remove deprecated `ImaAdsMediaSource`. Create `AdsMediaSource` with an 2525 `ImaAdsLoader` instead. 2526 * Remove deprecated `AdsMediaSource` constructors. Listen for media source 2527 events using `AdsMediaSource.addEventListener`, and ad interaction 2528 events by adding a listener when building `ImaAdsLoader`. 2529 * Allow apps to register playback-related obstructing views that are on 2530 top of their ad display containers via `AdsLoader.AdViewProvider`. 2531 `PlayerView` implements this interface and will register its control 2532 view. This makes it possible for ad loading SDKs to calculate ad 2533 viewability accurately. 2534* DASH: Fix issue handling large `EventStream` presentation timestamps 2535 ([#5490](https://github.com/google/ExoPlayer/issues/5490)). 2536* HLS: Fix transition to STATE_ENDED when playing fragmented mp4 in chunkless 2537 preparation ([#5524](https://github.com/google/ExoPlayer/issues/5524)). 2538* Revert workaround for video quality problems with Amlogic decoders, as this 2539 may cause problems for some devices and/or non-interlaced content 2540 ([#5003](https://github.com/google/ExoPlayer/issues/5003)). 2541 2542### 2.9.5 (2019-01-31) 2543 2544* HLS: Parse `CHANNELS` attribute from `EXT-X-MEDIA` tag. 2545* ConcatenatingMediaSource: 2546 * Add `Handler` parameter to methods that take a callback `Runnable`. 2547 * Fix issue with dropped messages when releasing the source 2548 ([#5464](https://github.com/google/ExoPlayer/issues/5464)). 2549* ExtractorMediaSource: Fix issue that could cause the player to get stuck 2550 buffering at the end of the media. 2551* PlayerView: Fix issue preventing `OnClickListener` from receiving events 2552 ([#5433](https://github.com/google/ExoPlayer/issues/5433)). 2553* IMA extension: Upgrade IMA dependency to 3.10.6. 2554* Cronet extension: Upgrade Cronet dependency to 71.3578.98. 2555* OkHttp extension: Upgrade OkHttp dependency to 3.12.1. 2556* MP3: Wider fix for issue where streams would play twice on some Samsung 2557 devices ([#4519](https://github.com/google/ExoPlayer/issues/4519)). 2558 2559### 2.9.4 (2019-01-15) 2560 2561* IMA extension: Clear ads loader listeners on release 2562 ([#4114](https://github.com/google/ExoPlayer/issues/4114)). 2563* SmoothStreaming: Fix support for subtitles in DRM protected streams 2564 ([#5378](https://github.com/google/ExoPlayer/issues/5378)). 2565* FFmpeg extension: Treat invalid data errors as non-fatal to match the 2566 behavior of MediaCodec 2567 ([#5293](https://github.com/google/ExoPlayer/issues/5293)). 2568* GVR extension: upgrade GVR SDK dependency to 1.190.0. 2569* Associate fatal player errors of type SOURCE with the loading source in 2570 `AnalyticsListener.EventTime` 2571 ([#5407](https://github.com/google/ExoPlayer/issues/5407)). 2572* Add `startPositionUs` to `MediaSource.createPeriod`. This fixes an issue 2573 where using lazy preparation in `ConcatenatingMediaSource` with an 2574 `ExtractorMediaSource` overrides initial seek positions 2575 ([#5350](https://github.com/google/ExoPlayer/issues/5350)). 2576* Add subtext to the `MediaDescriptionAdapter` of the 2577 `PlayerNotificationManager`. 2578* Add workaround for video quality problems with Amlogic decoders 2579 ([#5003](https://github.com/google/ExoPlayer/issues/5003)). 2580* Fix issue where sending callbacks for playlist changes may cause problems 2581 because of parallel player access 2582 ([#5240](https://github.com/google/ExoPlayer/issues/5240)). 2583* Fix issue with reusing a `ClippingMediaSource` with an inner 2584 `ExtractorMediaSource` and a non-zero start position 2585 ([#5351](https://github.com/google/ExoPlayer/issues/5351)). 2586* Fix issue where uneven track durations in MP4 streams can cause OOM problems 2587 ([#3670](https://github.com/google/ExoPlayer/issues/3670)). 2588 2589### 2.9.3 (2018-12-20) 2590 2591* Captions: Support PNG subtitles in SMPTE-TT 2592 ([#1583](https://github.com/google/ExoPlayer/issues/1583)). 2593* MPEG-TS: Use random access indicators to minimize the need for 2594 `FLAG_ALLOW_NON_IDR_KEYFRAMES`. 2595* Downloading: Reduce time taken to remove downloads 2596 ([#5136](https://github.com/google/ExoPlayer/issues/5136)). 2597* MP3: 2598 * Use the true bitrate for constant-bitrate MP3 seeking. 2599 * Fix issue where streams would play twice on some Samsung devices 2600 ([#4519](https://github.com/google/ExoPlayer/issues/4519)). 2601* Fix regression where some audio formats were incorrectly marked as being 2602 unplayable due to under-reporting of platform decoder capabilities 2603 ([#5145](https://github.com/google/ExoPlayer/issues/5145)). 2604* Fix decode-only frame skipping on Nvidia Shield TV devices. 2605* Workaround for MiTV (dangal) issue when swapping output surface 2606 ([#5169](https://github.com/google/ExoPlayer/issues/5169)). 2607 2608### 2.9.2 (2018-11-28) 2609 2610* HLS: 2611 * Fix issue causing unnecessary media playlist requests when playing live 2612 streams ([#5059](https://github.com/google/ExoPlayer/issues/5059)). 2613 * Fix decoder re-instantiation issue for packed audio streams 2614 ([#5063](https://github.com/google/ExoPlayer/issues/5063)). 2615* MP4: Support Opus and FLAC in the MP4 container, and in DASH 2616 ([#4883](https://github.com/google/ExoPlayer/issues/4883)). 2617* DASH: Fix detecting the end of live events 2618 ([#4780](https://github.com/google/ExoPlayer/issues/4780)). 2619* Spherical video: Fall back to `TYPE_ROTATION_VECTOR` if 2620 `TYPE_GAME_ROTATION_VECTOR` is unavailable 2621 ([#5119](https://github.com/google/ExoPlayer/issues/5119)). 2622* Support seeking for a wider range of MPEG-TS streams 2623 ([#5097](https://github.com/google/ExoPlayer/issues/5097)). 2624* Include channel count in audio capabilities check 2625 ([#4690](https://github.com/google/ExoPlayer/issues/4690)). 2626* Fix issue with applying the `show_buffering` attribute in `PlayerView` 2627 ([#5139](https://github.com/google/ExoPlayer/issues/5139)). 2628* Fix issue where null `Metadata` was output when it failed to decode 2629 ([#5149](https://github.com/google/ExoPlayer/issues/5149)). 2630* Fix playback of some invalid but playable MP4 streams by replacing 2631 assertions with logged warnings in sample table parsing code 2632 ([#5162](https://github.com/google/ExoPlayer/issues/5162)). 2633* Fix UUID passed to `MediaCrypto` when using `C.CLEARKEY_UUID` before API 27. 2634 2635### 2.9.1 (2018-11-01) 2636 2637* Add convenience methods `Player.next`, `Player.previous`, `Player.hasNext` 2638 and `Player.hasPrevious` 2639 ([#4863](https://github.com/google/ExoPlayer/issues/4863)). 2640* Improve initial bandwidth meter estimates using the current country and 2641 network type. 2642* IMA extension: 2643 * For preroll to live stream transitions, project forward the loading 2644 position to avoid being behind the live window. 2645 * Let apps specify whether to focus the skip button on ATV 2646 ([#5019](https://github.com/google/ExoPlayer/issues/5019)). 2647* MP3: 2648 * Support seeking based on MLLT metadata 2649 ([#3241](https://github.com/google/ExoPlayer/issues/3241)). 2650 * Fix handling of streams with appended data 2651 ([#4954](https://github.com/google/ExoPlayer/issues/4954)). 2652* DASH: Parse ProgramInformation element if present in the manifest. 2653* HLS: 2654 * Add constructor to `DefaultHlsExtractorFactory` for adding TS payload 2655 reader factory flags 2656 ([#4861](https://github.com/google/ExoPlayer/issues/4861)). 2657 * Fix bug in segment sniffing 2658 ([#5039](https://github.com/google/ExoPlayer/issues/5039)). 2659* SubRip: Add support for alignment tags, and remove tags from the displayed 2660 captions ([#4306](https://github.com/google/ExoPlayer/issues/4306)). 2661* Fix issue with blind seeking to windows with non-zero offset in a 2662 `ConcatenatingMediaSource` 2663 ([#4873](https://github.com/google/ExoPlayer/issues/4873)). 2664* Fix logic for enabling next and previous actions in `TimelineQueueNavigator` 2665 ([#5065](https://github.com/google/ExoPlayer/issues/5065)). 2666* Fix issue where audio focus handling could not be disabled after enabling it 2667 ([#5055](https://github.com/google/ExoPlayer/issues/5055)). 2668* Fix issue where subtitles were positioned incorrectly if `SubtitleView` had 2669 a non-zero position offset to its parent 2670 ([#4788](https://github.com/google/ExoPlayer/issues/4788)). 2671* Fix issue where the buffered position was not updated correctly when 2672 transitioning between periods 2673 ([#4899](https://github.com/google/ExoPlayer/issues/4899)). 2674* Fix issue where a `NullPointerException` is thrown when removing an 2675 unprepared media source from a `ConcatenatingMediaSource` with the 2676 `useLazyPreparation` option enabled 2677 ([#4986](https://github.com/google/ExoPlayer/issues/4986)). 2678* Work around an issue where a non-empty end-of-stream audio buffer would be 2679 output with timestamp zero, causing the player position to jump backwards 2680 ([#5045](https://github.com/google/ExoPlayer/issues/5045)). 2681* Suppress a spurious assertion failure on some Samsung devices 2682 ([#4532](https://github.com/google/ExoPlayer/issues/4532)). 2683* Suppress spurious "references unknown class member" shrinking warning 2684 ([#4890](https://github.com/google/ExoPlayer/issues/4890)). 2685* Swap recommended order for google() and jcenter() in gradle config 2686 ([#4997](https://github.com/google/ExoPlayer/issues/4997)). 2687 2688### 2.9.0 (2018-09-06) 2689 2690* Turn on Java 8 compiler support for the ExoPlayer library. Apps may need to 2691 add `compileOptions { targetCompatibility JavaVersion.VERSION_1_8 }` to 2692 their gradle settings to ensure bytecode compatibility. 2693* Set `compileSdkVersion` and `targetSdkVersion` to 28. 2694* Support for automatic audio focus handling via 2695 `SimpleExoPlayer.setAudioAttributes`. 2696* Add `ExoPlayer.retry` convenience method. 2697* Add `AudioListener` for listening to changes in audio configuration during 2698 playback ([#3994](https://github.com/google/ExoPlayer/issues/3994)). 2699* Add `LoadErrorHandlingPolicy` to allow configuration of load error handling 2700 across `MediaSource` implementations 2701 ([#3370](https://github.com/google/ExoPlayer/issues/3370)). 2702* Allow passing a `Looper`, which specifies the thread that must be used to 2703 access the player, when instantiating player instances using 2704 `ExoPlayerFactory` 2705 ([#4278](https://github.com/google/ExoPlayer/issues/4278)). 2706* Allow setting log level for ExoPlayer logcat output 2707 ([#4665](https://github.com/google/ExoPlayer/issues/4665)). 2708* Simplify `BandwidthMeter` injection: The `BandwidthMeter` should now be 2709 passed directly to `ExoPlayerFactory`, instead of to 2710 `TrackSelection.Factory` and `DataSource.Factory`. The `BandwidthMeter` is 2711 passed to the components that need it internally. The `BandwidthMeter` may 2712 also be omitted, in which case a default instance will be used. 2713* Spherical video: 2714 * Support for spherical video by setting `surface_type="spherical_view"` 2715 on `PlayerView`. 2716 * Support for 2717 [VR180](https://github.com/google/spatial-media/blob/master/docs/vr180.md). 2718* HLS: 2719 * Support PlayReady. 2720 * Add container format sniffing 2721 ([#2025](https://github.com/google/ExoPlayer/issues/2025)). 2722 * Support alternative `EXT-X-KEY` tags. 2723 * Support `EXT-X-INDEPENDENT-SEGMENTS` in the master playlist. 2724 * Support variable substitution 2725 ([#4422](https://github.com/google/ExoPlayer/issues/4422)). 2726 * Fix the bitrate being unset on primary track sample formats 2727 ([#3297](https://github.com/google/ExoPlayer/issues/3297)). 2728 * Make `HlsMediaSource.Factory` take a factory of trackers instead of a 2729 tracker instance 2730 ([#4814](https://github.com/google/ExoPlayer/issues/4814)). 2731* DASH: 2732 * Support `messageData` attribute for in-manifest event streams. 2733 * Clip periods to their specified durations 2734 ([#4185](https://github.com/google/ExoPlayer/issues/4185)). 2735* Improve seeking support for progressive streams: 2736 * Support seeking in MPEG-TS 2737 ([#966](https://github.com/google/ExoPlayer/issues/966)). 2738 * Support seeking in MPEG-PS 2739 ([#4476](https://github.com/google/ExoPlayer/issues/4476)). 2740 * Support approximate seeking in ADTS using a constant bitrate assumption 2741 ([#4548](https://github.com/google/ExoPlayer/issues/4548)). The 2742 `FLAG_ENABLE_CONSTANT_BITRATE_SEEKING` flag must be set on the extractor 2743 to enable this functionality. 2744 * Support approximate seeking in AMR using a constant bitrate assumption. 2745 The `FLAG_ENABLE_CONSTANT_BITRATE_SEEKING` flag must be set on the 2746 extractor to enable this functionality. 2747 * Add `DefaultExtractorsFactory.setConstantBitrateSeekingEnabled` to 2748 enable approximate seeking using a constant bitrate assumption on all 2749 extractors that support it. 2750* Video: 2751 * Add callback to `VideoListener` to notify of surface size changes. 2752 * Improve performance when playing high frame-rate content, and when 2753 playing at greater than 1x speed 2754 ([#2777](https://github.com/google/ExoPlayer/issues/2777)). 2755 * Scale up the initial video decoder maximum input size so playlist 2756 transitions with small increases in maximum sample size do not require 2757 reinitialization 2758 ([#4510](https://github.com/google/ExoPlayer/issues/4510)). 2759 * Fix a bug where the player would not transition to the ended state when 2760 playing video in tunneled mode. 2761* Audio: 2762 * Support attaching auxiliary audio effects to the `AudioTrack` via 2763 `Player.setAuxEffectInfo` and `Player.clearAuxEffectInfo`. 2764 * Support seamless adaptation while playing xHE-AAC streams. 2765 ([#4360](https://github.com/google/ExoPlayer/issues/4360)). 2766 * Increase `AudioTrack` buffer sizes to the theoretical maximum required 2767 for each encoding for passthrough playbacks 2768 ([#3803](https://github.com/google/ExoPlayer/issues/3803)). 2769 * WAV: Fix issue where white noise would be output at the end of playback 2770 ([#4724](https://github.com/google/ExoPlayer/issues/4724)). 2771 * MP3: Fix issue where streams would play twice on the SM-T530 2772 ([#4519](https://github.com/google/ExoPlayer/issues/4519)). 2773* Analytics: 2774 * Add callbacks to `DefaultDrmSessionEventListener` and 2775 `AnalyticsListener` to be notified of acquired and released DRM 2776 sessions. 2777 * Add uri field to `LoadEventInfo` in `MediaSourceEventListener` and 2778 `AnalyticsListener` callbacks. This uri is the redirected uri if 2779 redirection occurred 2780 ([#2054](https://github.com/google/ExoPlayer/issues/2054)). 2781 * Add response headers field to `LoadEventInfo` in 2782 `MediaSourceEventListener` and `AnalyticsListener` callbacks 2783 ([#4361](https://github.com/google/ExoPlayer/issues/4361) and 2784 [#4615](https://github.com/google/ExoPlayer/issues/4615)). 2785* UI: 2786 * Add option to `PlayerView` to show buffering view when playWhenReady is 2787 false ([#4304](https://github.com/google/ExoPlayer/issues/4304)). 2788 * Allow any `Drawable` to be used as `PlayerView` default artwork. 2789* ConcatenatingMediaSource: 2790 * Support lazy preparation of playlist media sources 2791 ([#3972](https://github.com/google/ExoPlayer/issues/3972)). 2792 * Support range removal with `removeMediaSourceRange` methods 2793 ([#4542](https://github.com/google/ExoPlayer/issues/4542)). 2794 * Support setting a new shuffle order with `setShuffleOrder` 2795 ([#4791](https://github.com/google/ExoPlayer/issues/4791)). 2796* MPEG-TS: Support CEA-608/708 in H262 2797 ([#2565](https://github.com/google/ExoPlayer/issues/2565)). 2798* Allow configuration of the back buffer in `DefaultLoadControl.Builder` 2799 ([#4857](https://github.com/google/ExoPlayer/issues/4857)). 2800* Allow apps to pass a `CacheKeyFactory` for setting custom cache keys when 2801 creating a `CacheDataSource`. 2802* Provide additional information for adaptive track selection. 2803 `TrackSelection.updateSelectedTrack` has two new parameters for the current 2804 queue of media chunks and iterators for information about upcoming chunks. 2805* Allow `MediaCodecSelector`s to return multiple compatible decoders for 2806 `MediaCodecRenderer`, and provide an (optional) `MediaCodecSelector` that 2807 falls back to less preferred decoders like `MediaCodec.createDecoderByType` 2808 ([#273](https://github.com/google/ExoPlayer/issues/273)). 2809* Enable gzip for requests made by `SingleSampleMediaSource` 2810 ([#4771](https://github.com/google/ExoPlayer/issues/4771)). 2811* Fix bug reporting buffered position for multi-period windows, and add 2812 convenience methods `Player.getTotalBufferedDuration` and 2813 `Player.getContentBufferedDuration` 2814 ([#4023](https://github.com/google/ExoPlayer/issues/4023)). 2815* Fix bug where transitions to clipped media sources would happen too early 2816 ([#4583](https://github.com/google/ExoPlayer/issues/4583)). 2817* Fix bugs reporting events for multi-period media sources 2818 ([#4492](https://github.com/google/ExoPlayer/issues/4492) and 2819 [#4634](https://github.com/google/ExoPlayer/issues/4634)). 2820* Fix issue where removing looping media from a playlist throws an exception 2821 ([#4871](https://github.com/google/ExoPlayer/issues/4871)). 2822* Fix issue where the preferred audio or text track would not be selected if 2823 mapped onto a secondary renderer of the corresponding type 2824 ([#4711](http://github.com/google/ExoPlayer/issues/4711)). 2825* Fix issue where errors of upcoming playlist items are thrown too early 2826 ([#4661](https://github.com/google/ExoPlayer/issues/4661)). 2827* Allow edit lists which do not start with a sync sample. 2828 ([#4774](https://github.com/google/ExoPlayer/issues/4774)). 2829* Fix issue with audio discontinuities at period transitions, e.g. when 2830 looping ([#3829](https://github.com/google/ExoPlayer/issues/3829)). 2831* Fix issue where `player.getCurrentTag()` throws an 2832 `IndexOutOfBoundsException` 2833 ([#4822](https://github.com/google/ExoPlayer/issues/4822)). 2834* Fix bug preventing use of multiple key session support (`multiSession=true`) 2835 for non-Widevine `DefaultDrmSessionManager` instances 2836 ([#4834](https://github.com/google/ExoPlayer/issues/4834)). 2837* Fix issue where audio and video would desynchronize when playing 2838 concatenations of gapless content 2839 ([#4559](https://github.com/google/ExoPlayer/issues/4559)). 2840* IMA extension: 2841 * Refine the previous fix for empty ad groups to avoid discarding ad 2842 breaks unnecessarily 2843 ([#4030](https://github.com/google/ExoPlayer/issues/4030) and 2844 [#4280](https://github.com/google/ExoPlayer/issues/4280)). 2845 * Fix handling of empty postrolls 2846 ([#4681](https://github.com/google/ExoPlayer/issues/4681)). 2847 * Fix handling of postrolls with multiple ads 2848 ([#4710](https://github.com/google/ExoPlayer/issues/4710)). 2849* MediaSession extension: 2850 * Add `MediaSessionConnector.setCustomErrorMessage` to support setting 2851 custom error messages. 2852 * Add `MediaMetadataProvider` to support setting custom metadata 2853 ([#3497](https://github.com/google/ExoPlayer/issues/3497)). 2854* Cronet extension: Now distributed via jCenter. 2855* FFmpeg extension: Support mu-law and A-law PCM. 2856 2857### 2.8.4 (2018-08-17) 2858 2859* IMA extension: Improve handling of consecutive empty ad groups 2860 ([#4030](https://github.com/google/ExoPlayer/issues/4030)), 2861 ([#4280](https://github.com/google/ExoPlayer/issues/4280)). 2862 2863### 2.8.3 (2018-07-23) 2864 2865* IMA extension: 2866 * Fix behavior when creating/releasing the player then releasing 2867 `ImaAdsLoader` 2868 ([#3879](https://github.com/google/ExoPlayer/issues/3879)). 2869 * Add support for setting slots for companion ads. 2870* Captions: 2871 * TTML: Fix an issue with TTML using font size as % of cell resolution 2872 that makes `SubtitleView.setApplyEmbeddedFontSizes()` not work 2873 correctly. ([#4491](https://github.com/google/ExoPlayer/issues/4491)). 2874 * CEA-608: Improve handling of embedded styles 2875 ([#4321](https://github.com/google/ExoPlayer/issues/4321)). 2876* DASH: 2877 * Exclude text streams from duration calculations 2878 ([#4029](https://github.com/google/ExoPlayer/issues/4029)). 2879 * Fix freezing when playing multi-period manifests with `EventStream`s 2880 ([#4492](https://github.com/google/ExoPlayer/issues/4492)). 2881* DRM: Allow DrmInitData to carry a license server URL 2882 ([#3393](https://github.com/google/ExoPlayer/issues/3393)). 2883* MPEG-TS: Fix bug preventing SCTE-35 cues from being output 2884 ([#4573](https://github.com/google/ExoPlayer/issues/4573)). 2885* Expose all internal ID3 data stored in MP4 udta boxes, and switch from using 2886 CommentFrame to InternalFrame for frames with gapless metadata in MP4. 2887* Add `PlayerView.isControllerVisible` 2888 ([#4385](https://github.com/google/ExoPlayer/issues/4385)). 2889* Fix issue playing DRM protected streams on Asus Zenfone 2 2890 ([#4403](https://github.com/google/ExoPlayer/issues/4413)). 2891* Add support for multiple audio and video tracks in MPEG-PS streams 2892 ([#4406](https://github.com/google/ExoPlayer/issues/4406)). 2893* Add workaround for track index mismatches between trex and tkhd boxes in 2894 fragmented MP4 files 2895 ([#4477](https://github.com/google/ExoPlayer/issues/4477)). 2896* Add workaround for track index mismatches between tfhd and tkhd boxes in 2897 fragmented MP4 files 2898 ([#4083](https://github.com/google/ExoPlayer/issues/4083)). 2899* Ignore all MP4 edit lists if one edit list couldn't be handled 2900 ([#4348](https://github.com/google/ExoPlayer/issues/4348)). 2901* Fix issue when switching track selection from an embedded track to a primary 2902 track in DASH ([#4477](https://github.com/google/ExoPlayer/issues/4477)). 2903* Fix accessibility class name for `DefaultTimeBar` 2904 ([#4611](https://github.com/google/ExoPlayer/issues/4611)). 2905* Improved compatibility with FireOS devices. 2906 2907### 2.8.2 (2018-06-06) 2908 2909* IMA extension: Don't advertise support for video/mpeg ad media, as we don't 2910 have an extractor for this 2911 ([#4297](https://github.com/google/ExoPlayer/issues/4297)). 2912* DASH: Fix playback getting stuck when playing representations that have both 2913 sidx atoms and non-zero presentationTimeOffset values. 2914* HLS: 2915 * Allow injection of custom playlist trackers. 2916 * Fix adaptation in live playlists with EXT-X-PROGRAM-DATE-TIME tags. 2917* Mitigate memory leaks when `MediaSource` loads are slow to cancel 2918 ([#4249](https://github.com/google/ExoPlayer/issues/4249)). 2919* Fix inconsistent `Player.EventListener` invocations for recursive player 2920 state changes ([#4276](https://github.com/google/ExoPlayer/issues/4276)). 2921* Fix `MediaCodec.native_setSurface` crash on Moto C 2922 ([#4315](https://github.com/google/ExoPlayer/issues/4315)). 2923* Fix missing whitespace in CEA-608 2924 ([#3906](https://github.com/google/ExoPlayer/issues/3906)). 2925* Fix crash downloading HLS media playlists 2926 ([#4396](https://github.com/google/ExoPlayer/issues/4396)). 2927* Fix a bug where download cancellation was ignored 2928 ([#4403](https://github.com/google/ExoPlayer/issues/4403)). 2929* Set `METADATA_KEY_TITLE` on media descriptions 2930 ([#4292](https://github.com/google/ExoPlayer/issues/4292)). 2931* Allow apps to register custom MIME types 2932 ([#4264](https://github.com/google/ExoPlayer/issues/4264)). 2933 2934### 2.8.1 (2018-05-22) 2935 2936* HLS: 2937 * Fix playback of livestreams with EXT-X-PROGRAM-DATE-TIME tags 2938 ([#4239](https://github.com/google/ExoPlayer/issues/4239)). 2939 * Fix playback of clipped streams starting from non-keyframe positions 2940 ([#4241](https://github.com/google/ExoPlayer/issues/4241)). 2941* OkHttp extension: Fix to correctly include response headers in thrown 2942 `InvalidResponseCodeException`s. 2943* Add possibility to cancel `PlayerMessage`s. 2944* UI: 2945 * Add `PlayerView.setKeepContentOnPlayerReset` to keep the currently 2946 displayed video frame or media artwork visible when the player is reset 2947 ([#2843](https://github.com/google/ExoPlayer/issues/2843)). 2948* Fix crash when switching surface on Moto E(4) 2949 ([#4134](https://github.com/google/ExoPlayer/issues/4134)). 2950* Fix a bug that could cause event listeners to be called with inconsistent 2951 information if an event listener interacted with the player 2952 ([#4262](https://github.com/google/ExoPlayer/issues/4262)). 2953* Audio: 2954 * Fix extraction of PCM in MP4/MOV 2955 ([#4228](https://github.com/google/ExoPlayer/issues/4228)). 2956 * FLAC: Supports seeking for FLAC files without SEEKTABLE 2957 ([#1808](https://github.com/google/ExoPlayer/issues/1808)). 2958* Captions: 2959 * TTML: 2960 * Fix a styling issue when there are multiple regions displayed at the 2961 same time that can make text size of each region much smaller than 2962 defined. 2963 * Fix an issue when the caption line has no text (empty line or only line 2964 break), and the line's background is still displayed. 2965 * Support TTML font size using % correctly (as percentage of document cell 2966 resolution). 2967 2968### 2.8.0 (2018-05-03) 2969 2970* Downloading: 2971 * Add `DownloadService`, `DownloadManager` and related classes 2972 ([#2643](https://github.com/google/ExoPlayer/issues/2643)). Information 2973 on using these components to download progressive formats can be found 2974 [here](https://medium.com/google-exoplayer/downloading-streams-6d259eec7f95). 2975 To see how to download DASH, HLS and SmoothStreaming media, take a look 2976 at the app. 2977 * Updated main demo app to support downloading DASH, HLS, SmoothStreaming 2978 and progressive media. 2979* MediaSources: 2980 * Allow reusing media sources after they have been released and also in 2981 parallel to allow adding them multiple times to a concatenation. 2982 ([#3498](https://github.com/google/ExoPlayer/issues/3498)). 2983 * Merged `DynamicConcatenatingMediaSource` into `ConcatenatingMediaSource` 2984 and deprecated `DynamicConcatenatingMediaSource`. 2985 * Allow clipping of child media sources where the period and window have a 2986 non-zero offset with `ClippingMediaSource`. 2987 * Allow adding and removing `MediaSourceEventListener`s to MediaSources 2988 after they have been created. Listening to events is now supported for 2989 all media sources including composite sources. 2990 * Added callbacks to `MediaSourceEventListener` to get notified when media 2991 periods are created, released and being read from. 2992 * Support live stream clipping with `ClippingMediaSource`. 2993 * Allow setting tags for all media sources in their factories. The tag of 2994 the current window can be retrieved with `Player.getCurrentTag`. 2995* UI: 2996 * Add support for displaying error messages and a buffering spinner in 2997 `PlayerView`. 2998 * Add support for listening to `AspectRatioFrameLayout`'s aspect ratio 2999 update ([#3736](https://github.com/google/ExoPlayer/issues/3736)). 3000 * Add `PlayerNotificationManager` for displaying notifications reflecting 3001 the player state. 3002 * Add `TrackSelectionView` for selecting tracks with 3003 `DefaultTrackSelector`. 3004 * Add `TrackNameProvider` for converting track `Format`s to textual 3005 descriptions, and `DefaultTrackNameProvider` as a default 3006 implementation. 3007* Track selection: 3008 * Reworked `MappingTrackSelector` and `DefaultTrackSelector`. 3009 * `DefaultTrackSelector.Parameters` now implements `Parcelable`. 3010 * Added UI components for track selection (see above). 3011* Audio: 3012 * Support extracting data from AMR container formats, including both 3013 narrow and wide band 3014 ([#2527](https://github.com/google/ExoPlayer/issues/2527)). 3015 * FLAC: 3016 * Sniff FLAC files correctly if they have ID3 headers 3017 ([#4055](https://github.com/google/ExoPlayer/issues/4055)). 3018 * Supports FLAC files with high sample rate (176400 and 192000) 3019 ([#3769](https://github.com/google/ExoPlayer/issues/3769)). 3020 * Factor out `AudioTrack` position tracking from `DefaultAudioSink`. 3021 * Fix an issue where the playback position would pause just after playback 3022 begins, and poll the audio timestamp less frequently once it starts 3023 advancing ([#3841](https://github.com/google/ExoPlayer/issues/3841)). 3024 * Add an option to skip silent audio in `PlaybackParameters` 3025 ([#2635](https://github.com/google/ExoPlayer/issues/2635)). 3026 * Fix an issue where playback of TrueHD streams would get stuck after 3027 seeking due to not finding a syncframe 3028 ([#3845](https://github.com/google/ExoPlayer/issues/3845)). 3029 * Fix an issue with eac3-joc playback where a codec would fail to 3030 configure ([#4165](https://github.com/google/ExoPlayer/issues/4165)). 3031 * Handle non-empty end-of-stream buffers, to fix gapless playback of 3032 streams with encoder padding when the decoder returns a non-empty final 3033 buffer. 3034 * Allow trimming more than one sample when applying an elst audio edit via 3035 gapless playback info. 3036 * Allow overriding skipping/scaling with custom `AudioProcessor`s 3037 ([#3142](https://github.com/google/ExoPlayer/issues/3142)). 3038* Caching: 3039 * Add release method to the `Cache` interface, and prevent multiple 3040 instances of `SimpleCache` using the same folder at the same time. 3041 * Cache redirect URLs 3042 ([#2360](https://github.com/google/ExoPlayer/issues/2360)). 3043* DRM: 3044 * Allow multiple listeners for `DefaultDrmSessionManager`. 3045 * Pass `DrmSessionManager` to `ExoPlayerFactory` instead of 3046 `RendererFactory`. 3047 * Change minimum API requirement for CBC and pattern encryption from 24 to 3048 25 ([#4022](https://github.com/google/ExoPlayer/issues/4022)). 3049 * Fix handling of 307/308 redirects when making license requests 3050 ([#4108](https://github.com/google/ExoPlayer/issues/4108)). 3051* HLS: 3052 * Fix playlist loading error propagation when the current selection does 3053 not include all of the playlist's variants. 3054 * Fix SAMPLE-AES-CENC and SAMPLE-AES-CTR EXT-X-KEY methods 3055 ([#4145](https://github.com/google/ExoPlayer/issues/4145)). 3056 * Preeptively declare an ID3 track in chunkless preparation 3057 ([#4016](https://github.com/google/ExoPlayer/issues/4016)). 3058 * Add support for multiple #EXT-X-MAP tags in a media playlist 3059 ([#4164](https://github.com/google/ExoPlayer/issues/4182)). 3060 * Fix seeking in live streams 3061 ([#4187](https://github.com/google/ExoPlayer/issues/4187)). 3062* IMA extension: 3063 * Allow setting the ad media load timeout 3064 ([#3691](https://github.com/google/ExoPlayer/issues/3691)). 3065 * Expose ad load errors via `MediaSourceEventListener` on 3066 `AdsMediaSource`, and allow setting an ad event listener on 3067 `ImaAdsLoader`. Deprecate the `AdsMediaSource.EventListener`. 3068* Add `AnalyticsListener` interface which can be registered in 3069 `SimpleExoPlayer` to receive detailed metadata for each ExoPlayer event. 3070* Optimize seeking in FMP4 by enabling seeking to the nearest sync sample 3071 within a fragment. This benefits standalone FMP4 playbacks, DASH and 3072 SmoothStreaming. 3073* Updated default max buffer length in `DefaultLoadControl`. 3074* Fix ClearKey decryption error if the key contains a forward slash 3075 ([#4075](https://github.com/google/ExoPlayer/issues/4075)). 3076* Fix crash when switching surface on Huawei P9 Lite 3077 ([#4084](https://github.com/google/ExoPlayer/issues/4084)), and Philips 3078 QM163E ([#4104](https://github.com/google/ExoPlayer/issues/4104)). 3079* Support ZLIB compressed PGS subtitles. 3080* Added `getPlaybackError` to `Player` interface. 3081* Moved initial bitrate estimate from `AdaptiveTrackSelection` to 3082 `DefaultBandwidthMeter`. 3083* Removed default renderer time offset of 60000000 from internal player. The 3084 actual renderer timestamp offset can be obtained by listening to 3085 `BaseRenderer.onStreamChanged`. 3086* Added dependencies on checkerframework annotations for static code analysis. 3087 3088### 2.7.3 (2018-04-04) 3089 3090* Fix ProGuard configuration for Cast, IMA and OkHttp extensions. 3091* Update OkHttp extension to depend on OkHttp 3.10.0. 3092 3093### 2.7.2 (2018-03-29) 3094 3095* Gradle: Upgrade Gradle version from 4.1 to 4.4 so it can work with Android 3096 Studio 3.1 ([#3708](https://github.com/google/ExoPlayer/issues/3708)). 3097* Match codecs starting with "mp4a" to different Audio MimeTypes 3098 ([#3779](https://github.com/google/ExoPlayer/issues/3779)). 3099* Fix ANR issue on Redmi 4X and Redmi Note 4 3100 ([#4006](https://github.com/google/ExoPlayer/issues/4006)). 3101* Fix handling of zero padded strings when parsing Matroska streams 3102 ([#4010](https://github.com/google/ExoPlayer/issues/4010)). 3103* Fix "Decoder input buffer too small" error when playing some FLAC streams. 3104* MediaSession extension: Omit fast forward and rewind actions when media is 3105 not seekable ([#4001](https://github.com/google/ExoPlayer/issues/4001)). 3106 3107### 2.7.1 (2018-03-09) 3108 3109* Gradle: Replaced 'compile' (deprecated) with 'implementation' and 'api'. 3110 This may lead to build breakage for applications upgrading from previous 3111 version that rely on indirect dependencies of certain modules. In such 3112 cases, application developers need to add the missing dependency to their 3113 gradle file. You can read more about the new dependency configurations 3114 [here](https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations). 3115* HlsMediaSource: Make HLS periods start at zero instead of the epoch. 3116 Applications that rely on HLS timelines having a period starting at the 3117 epoch will need to update their handling of HLS timelines. The program date 3118 time is still available via the informational 3119 `Timeline.Window.windowStartTimeMs` field 3120 ([#3865](https://github.com/google/ExoPlayer/issues/3865), 3121 [#3888](https://github.com/google/ExoPlayer/issues/3888)). 3122* Enable seeking in MP4 streams where duration is set incorrectly in the track 3123 header ([#3926](https://github.com/google/ExoPlayer/issues/3926)). 3124* Video: Force rendering a frame periodically in `MediaCodecVideoRenderer` and 3125 `LibvpxVideoRenderer`, even if it is late. 3126 3127### 2.7.0 (2018-02-19) 3128 3129* Player interface: 3130 * Add optional parameter to `stop` to reset the player when stopping. 3131 * Add a reason to `EventListener.onTimelineChanged` to distinguish between 3132 initial preparation, reset and dynamic updates. 3133 * Add `Player.DISCONTINUITY_REASON_AD_INSERTION` to the possible reasons 3134 reported in `Eventlistener.onPositionDiscontinuity` to distinguish 3135 transitions to and from ads within one period from transitions between 3136 periods. 3137 * Replaced `ExoPlayer.sendMessages` with `ExoPlayer.createMessage` to 3138 allow more customization of the message. Now supports setting a message 3139 delivery playback position and/or a delivery handler 3140 ([#2189](https://github.com/google/ExoPlayer/issues/2189)). 3141 * Add `Player.VideoComponent`, `Player.TextComponent` and 3142 `Player.MetadataComponent` interfaces that define optional video, text 3143 and metadata output functionality. New `getVideoComponent`, 3144 `getTextComponent` and `getMetadataComponent` methods provide access to 3145 this functionality. 3146* Add `ExoPlayer.setSeekParameters` for controlling how seek operations are 3147 performed. The `SeekParameters` class contains defaults for exact seeking 3148 and seeking to the closest sync points before, either side or after 3149 specified seek positions. `SeekParameters` are not currently supported when 3150 playing HLS streams. 3151* DefaultTrackSelector: 3152 * Replace `DefaultTrackSelector.Parameters` copy methods with a builder. 3153 * Support disabling of individual text track selection flags. 3154* Buffering: 3155 * Allow a back-buffer of media to be retained behind the current playback 3156 position, for fast backward seeking. The back-buffer can be configured 3157 by custom `LoadControl` implementations. 3158 * Add ability for `SequenceableLoader` to re-evaluate its buffer and 3159 discard buffered media so that it can be re-buffered in a different 3160 quality. 3161 * Allow more flexible loading strategy when playing media containing 3162 multiple sub-streams, by allowing injection of custom 3163 `CompositeSequenceableLoader` factories through 3164 `DashMediaSource.Factory`, `HlsMediaSource.Factory`, 3165 `SsMediaSource.Factory`, and `MergingMediaSource`. 3166 * Play out existing buffer before retrying for progressive live streams 3167 ([#1606](https://github.com/google/ExoPlayer/issues/1606)). 3168* UI: 3169 * Generalized player and control views to allow them to bind with any 3170 `Player`, and renamed them to `PlayerView` and `PlayerControlView` 3171 respectively. 3172 * Made `PlayerView` automatically apply video rotation when configured to 3173 use `TextureView` 3174 ([#91](https://github.com/google/ExoPlayer/issues/91)). 3175 * Made `PlayerView` play button behave correctly when the player is ended 3176 ([#3689](https://github.com/google/ExoPlayer/issues/3689)), and call a 3177 `PlaybackPreparer` when the player is idle. 3178* DRM: Optimistically attempt playback of DRM protected content that does not 3179 declare scheme specific init data in the manifest. If playback of clear 3180 samples without keys is allowed, delay DRM session error propagation until 3181 keys are actually needed 3182 ([#3630](https://github.com/google/ExoPlayer/issues/3630)). 3183* DASH: 3184 * Support in-band Emsg events targeting the player with scheme id 3185 `urn:mpeg:dash:event:2012` and scheme values "1", "2" and "3". 3186 * Support EventStream elements in DASH manifests. 3187* HLS: 3188 * Add opt-in support for chunkless preparation in HLS. This allows an HLS 3189 source to finish preparation without downloading any chunks, which can 3190 significantly reduce initial buffering time 3191 ([#3149](https://github.com/google/ExoPlayer/issues/3149)). More details 3192 can be found 3193 [here](https://medium.com/google-exoplayer/faster-hls-preparation-f6611aa15ea6). 3194 * Fail if unable to sync with the Transport Stream, rather than entering 3195 stuck in an indefinite buffering state. 3196 * Fix mime type propagation 3197 ([#3653](https://github.com/google/ExoPlayer/issues/3653)). 3198 * Fix ID3 context reuse across segment format changes 3199 ([#3622](https://github.com/google/ExoPlayer/issues/3622)). 3200 * Use long for media sequence numbers 3201 ([#3747](https://github.com/google/ExoPlayer/issues/3747)) 3202 * Add initial support for the EXT-X-GAP tag. 3203* Audio: 3204 * Support TrueHD passthrough for rechunked samples in Matroska files 3205 ([#2147](https://github.com/google/ExoPlayer/issues/2147)). 3206 * Support resampling 24-bit and 32-bit integer to 32-bit float for high 3207 resolution output in `DefaultAudioSink` 3208 ([#3635](https://github.com/google/ExoPlayer/pull/3635)). 3209* Captions: 3210 * Basic support for PGS subtitles 3211 ([#3008](https://github.com/google/ExoPlayer/issues/3008)). 3212 * Fix handling of CEA-608 captions where multiple buffers have the same 3213 presentation timestamp 3214 ([#3782](https://github.com/google/ExoPlayer/issues/3782)). 3215* Caching: 3216 * Fix cache corruption issue 3217 ([#3762](https://github.com/google/ExoPlayer/issues/3762)). 3218 * Implement periodic check in `CacheDataSource` to see whether it's 3219 possible to switch to reading/writing the cache having initially 3220 bypassed it. 3221* IMA extension: 3222 * Fix the player getting stuck when an ad group fails to load 3223 ([#3584](https://github.com/google/ExoPlayer/issues/3584)). 3224 * Work around loadAd not being called beore the LOADED AdEvent arrives 3225 ([#3552](https://github.com/google/ExoPlayer/issues/3552)). 3226 * Handle asset mismatch errors 3227 ([#3801](https://github.com/google/ExoPlayer/issues/3801)). 3228 * Add support for playing non-Extractor content MediaSources in the IMA 3229 demo app ([#3676](https://github.com/google/ExoPlayer/issues/3676)). 3230 * Fix handling of ad tags where ad groups are out of order 3231 ([#3716](https://github.com/google/ExoPlayer/issues/3716)). 3232 * Fix handling of ad tags with only preroll/postroll ad groups 3233 ([#3715](https://github.com/google/ExoPlayer/issues/3715)). 3234 * Propagate ad media preparation errors to IMA so that the ads can be 3235 skipped. 3236 * Handle exceptions in IMA callbacks so that can be logged less verbosely. 3237* New Cast extension. Simplifies toggling between local and Cast playbacks. 3238* `EventLogger` moved from the demo app into the core library. 3239* Fix ANR issue on the Huawei P8 Lite, Huawei Y6II, Moto C+, Meizu M5C, Lenovo 3240 K4 Note and Sony Xperia E5. 3241 ([#3724](https://github.com/google/ExoPlayer/issues/3724), 3242 [#3835](https://github.com/google/ExoPlayer/issues/3835)). 3243* Fix potential NPE when removing media sources from a 3244 DynamicConcatenatingMediaSource 3245 ([#3796](https://github.com/google/ExoPlayer/issues/3796)). 3246* Check `sys.display-size` on Philips ATVs 3247 ([#3807](https://github.com/google/ExoPlayer/issues/3807)). 3248* Release `Extractor`s on the loading thread to avoid potentially leaking 3249 resources when the playback thread has quit by the time the loading task has 3250 completed. 3251* ID3: Better handle malformed ID3 data 3252 ([#3792](https://github.com/google/ExoPlayer/issues/3792)). 3253* Support 14-bit mode and little endianness in DTS PES packets 3254 ([#3340](https://github.com/google/ExoPlayer/issues/3340)). 3255* Demo app: Add ability to download not DRM protected content. 3256 3257### 2.6.1 (2017-12-15) 3258 3259* Add factories to `ExtractorMediaSource`, `HlsMediaSource`, `SsMediaSource`, 3260 `DashMediaSource` and `SingleSampleMediaSource`. 3261* Use the same listener `MediaSourceEventListener` for all MediaSource 3262 implementations. 3263* IMA extension: 3264 * Support non-ExtractorMediaSource ads 3265 ([#3302](https://github.com/google/ExoPlayer/issues/3302)). 3266 * Skip ads before the ad preceding the player's initial seek position 3267 ([#3527](https://github.com/google/ExoPlayer/issues/3527)). 3268 * Fix ad loading when there is no preroll. 3269 * Add an option to turn off hiding controls during ad playback 3270 ([#3532](https://github.com/google/ExoPlayer/issues/3532)). 3271 * Support specifying an ads response instead of an ad tag 3272 ([#3548](https://github.com/google/ExoPlayer/issues/3548)). 3273 * Support overriding the ad load timeout 3274 ([#3556](https://github.com/google/ExoPlayer/issues/3556)). 3275* DASH: Support time zone designators in ISO8601 UTCTiming elements 3276 ([#3524](https://github.com/google/ExoPlayer/issues/3524)). 3277* Audio: 3278 * Support 32-bit PCM float output from `DefaultAudioSink`, and add an 3279 option to use this with `FfmpegAudioRenderer`. 3280 * Add support for extracting 32-bit WAVE files 3281 ([#3379](https://github.com/google/ExoPlayer/issues/3379)). 3282 * Support extraction and decoding of Dolby Atmos 3283 ([#2465](https://github.com/google/ExoPlayer/issues/2465)). 3284 * Fix handling of playback parameter changes while paused when followed by 3285 a seek. 3286* SimpleExoPlayer: Allow multiple audio and video debug listeners. 3287* DefaultTrackSelector: Support undefined language text track selection when 3288 the preferred language is not available 3289 ([#2980](https://github.com/google/ExoPlayer/issues/2980)). 3290* Add options to `DefaultLoadControl` to set maximum buffer size in bytes and 3291 to choose whether size or time constraints are prioritized. 3292* Use surfaceless context for secure `DummySurface`, if available 3293 ([#3558](https://github.com/google/ExoPlayer/issues/3558)). 3294* FLV: Fix playback of live streams that do not contain an audio track 3295 ([#3188](https://github.com/google/ExoPlayer/issues/3188)). 3296* CEA-608: Fix handling of row count changes in roll-up mode 3297 ([#3513](https://github.com/google/ExoPlayer/issues/3513)). 3298* Prevent period transitions when seeking to the end of a period when paused 3299 ([#2439](https://github.com/google/ExoPlayer/issues/2439)). 3300 3301### 2.6.0 (2017-11-03) 3302 3303* Removed "r" prefix from versions. This release is "2.6.0", not "r2.6.0". 3304* New `Player.DefaultEventListener` abstract class can be extended to avoid 3305 having to implement all methods defined by `Player.EventListener`. 3306* Added a reason to `EventListener.onPositionDiscontinuity` 3307 ([#3252](https://github.com/google/ExoPlayer/issues/3252)). 3308* New `setShuffleModeEnabled` method for enabling shuffled playback. 3309* SimpleExoPlayer: Support for multiple video, text and metadata outputs. 3310* Support for `Renderer`s that don't consume any media 3311 ([#3212](https://github.com/google/ExoPlayer/issues/3212)). 3312* Fix reporting of internal position discontinuities via 3313 `Player.onPositionDiscontinuity`. `DISCONTINUITY_REASON_SEEK_ADJUSTMENT` is 3314 added to disambiguate position adjustments during seeks from other types of 3315 internal position discontinuity. 3316* Fix potential `IndexOutOfBoundsException` when calling 3317 `ExoPlayer.getDuration` 3318 ([#3362](https://github.com/google/ExoPlayer/issues/3362)). 3319* Fix playbacks involving looping, concatenation and ads getting stuck when 3320 media contains tracks with uneven durations 3321 ([#1874](https://github.com/google/ExoPlayer/issues/1874)). 3322* Fix issue with `ContentDataSource` when reading from certain 3323 `ContentProvider` implementations 3324 ([#3426](https://github.com/google/ExoPlayer/issues/3426)). 3325* Better playback experience when the video decoder cannot keep up, by 3326 skipping to key-frames. This is particularly relevant for variable speed 3327 playbacks. 3328* Allow `SingleSampleMediaSource` to suppress load errors 3329 ([#3140](https://github.com/google/ExoPlayer/issues/3140)). 3330* `DynamicConcatenatingMediaSource`: Allow specifying a callback to be invoked 3331 after a dynamic playlist modification has been applied 3332 ([#3407](https://github.com/google/ExoPlayer/issues/3407)). 3333* Audio: New `AudioSink` interface allows customization of audio output path. 3334* Offline: Added `Downloader` implementations for DASH, HLS, SmoothStreaming 3335 and progressive streams. 3336* Track selection: 3337 * Fixed adaptive track selection logic for live playbacks 3338 ([#3017](https://github.com/google/ExoPlayer/issues/3017)). 3339 * Added ability to select the lowest bitrate tracks. 3340* DASH: 3341 * Don't crash when a malformed or unexpected manifest update occurs 3342 ([#2795](https://github.com/google/ExoPlayer/issues/2795)). 3343* HLS: 3344 * Support for Widevine protected FMP4 variants. 3345 * Support CEA-608 in FMP4 variants. 3346 * Support extractor injection 3347 ([#2748](https://github.com/google/ExoPlayer/issues/2748)). 3348* DRM: 3349 * Improved compatibility with ClearKey content 3350 ([#3138](https://github.com/google/ExoPlayer/issues/3138)). 3351 * Support multiple PSSH boxes of the same type. 3352 * Retry initial provisioning and key requests if they fail 3353 * Fix incorrect parsing of non-CENC sinf boxes. 3354* IMA extension: 3355 * Expose `AdsLoader` via getter 3356 ([#3322](https://github.com/google/ExoPlayer/issues/3322)). 3357 * Handle `setPlayWhenReady` calls during ad playbacks 3358 ([#3303](https://github.com/google/ExoPlayer/issues/3303)). 3359 * Ignore seeks if an ad is playing 3360 ([#3309](https://github.com/google/ExoPlayer/issues/3309)). 3361 * Improve robustness of `ImaAdsLoader` in case content is not paused 3362 between content to ad transitions 3363 ([#3430](https://github.com/google/ExoPlayer/issues/3430)). 3364* UI: 3365 * Allow specifying a `Drawable` for the `TimeBar` scrubber 3366 ([#3337](https://github.com/google/ExoPlayer/issues/3337)). 3367 * Allow multiple listeners on `TimeBar` 3368 ([#3406](https://github.com/google/ExoPlayer/issues/3406)). 3369* New Leanback extension: Simplifies binding Exoplayer to Leanback UI 3370 components. 3371* Unit tests moved to Robolectric. 3372* Misc bugfixes. 3373 3374### r2.5.4 (2017-10-19) 3375 3376* Remove unnecessary media playlist fetches during playback of live HLS 3377 streams. 3378* Add the ability to inject a HLS playlist parser through `HlsMediaSource`. 3379* Fix potential `IndexOutOfBoundsException` when using `ImaMediaSource` 3380 ([#3334](https://github.com/google/ExoPlayer/issues/3334)). 3381* Fix an issue parsing MP4 content containing non-CENC sinf boxes. 3382* Fix memory leak when seeking with repeated periods. 3383* Fix playback position when `ExoPlayer.prepare` is called with 3384 `resetPosition` set to false. 3385* Ignore MP4 edit lists that seem invalid 3386 ([#3351](https://github.com/google/ExoPlayer/issues/3351)). 3387* Add extractor flag for ignoring all MP4 edit lists 3388 ([#3358](https://github.com/google/ExoPlayer/issues/3358)). 3389* Improve extensibility by exposing public constructors for 3390 `FrameworkMediaCrypto` and by making `DefaultDashChunkSource.getNextChunk` 3391 non-final. 3392 3393### r2.5.3 (2017-09-20) 3394 3395* IMA extension: Support skipping of skippable ads on AndroidTV and other 3396 non-touch devices 3397 ([#3258](https://github.com/google/ExoPlayer/issues/3258)). 3398* HLS: Fix broken WebVTT captions when PTS wraps around 3399 ([#2928](https://github.com/google/ExoPlayer/issues/2928)). 3400* Captions: Fix issues rendering CEA-608 captions 3401 ([#3250](https://github.com/google/ExoPlayer/issues/3250)). 3402* Workaround broken AAC decoders on Galaxy S6 3403 ([#3249](https://github.com/google/ExoPlayer/issues/3249)). 3404* Caching: Fix infinite loop when cache eviction fails 3405 ([#3260](https://github.com/google/ExoPlayer/issues/3260)). 3406* Caching: Force use of BouncyCastle on JellyBean to fix decryption issue 3407 ([#2755](https://github.com/google/ExoPlayer/issues/2755)). 3408 3409### r2.5.2 (2017-09-11) 3410 3411* IMA extension: Fix issue where ad playback could end prematurely for some 3412 content types ([#3180](https://github.com/google/ExoPlayer/issues/3180)). 3413* RTMP extension: Fix SIGABRT on fast RTMP stream restart 3414 ([#3156](https://github.com/google/ExoPlayer/issues/3156)). 3415* UI: Allow app to manually specify ad markers 3416 ([#3184](https://github.com/google/ExoPlayer/issues/3184)). 3417* DASH: Expose segment indices to subclasses of DefaultDashChunkSource 3418 ([#3037](https://github.com/google/ExoPlayer/issues/3037)). 3419* Captions: Added robustness against malformed WebVTT captions 3420 ([#3228](https://github.com/google/ExoPlayer/issues/3228)). 3421* DRM: Support forcing a specific license URL. 3422* Fix playback error when seeking in media loaded through content:// URIs 3423 ([#3216](https://github.com/google/ExoPlayer/issues/3216)). 3424* Fix issue playing MP4s in which the last atom specifies a size of zero 3425 ([#3191](https://github.com/google/ExoPlayer/issues/3191)). 3426* Workaround playback failures on some Xiaomi devices 3427 ([#3171](https://github.com/google/ExoPlayer/issues/3171)). 3428* Workaround SIGSEGV issue on some devices when setting and swapping surface 3429 for secure playbacks 3430 ([#3215](https://github.com/google/ExoPlayer/issues/3215)). 3431* Workaround for Nexus 7 issue when swapping output surface 3432 ([#3236](https://github.com/google/ExoPlayer/issues/3236)). 3433* Workaround for SimpleExoPlayerView's surface not being hidden properly 3434 ([#3160](https://github.com/google/ExoPlayer/issues/3160)). 3435 3436### r2.5.1 (2017-08-08) 3437 3438* Fix an issue that could cause the reported playback position to stop 3439 advancing in some cases. 3440* Fix an issue where a Surface could be released whilst still in use by the 3441 player. 3442 3443### r2.5.0 (2017-08-07) 3444 3445* IMA extension: Wraps the Google Interactive Media Ads (IMA) SDK to provide 3446 an easy and seamless way of incorporating display ads into ExoPlayer 3447 playbacks. You can read more about the IMA extension 3448 [here](https://medium.com/google-exoplayer/playing-ads-with-exoplayer-and-ima-868dfd767ea). 3449* MediaSession extension: Provides an easy way to connect ExoPlayer with 3450 MediaSessionCompat in the Android Support Library. 3451* RTMP extension: An extension for playing streams over RTMP. 3452* Build: Made it easier for application developers to depend on a local 3453 checkout of ExoPlayer. You can learn how to do this 3454 [here](https://medium.com/google-exoplayer/howto-2-depend-on-a-local-checkout-of-exoplayer-bcd7f8531720). 3455* Core playback improvements: 3456 * Eliminated re-buffering when changing audio and text track selections 3457 during playback of progressive streams 3458 ([#2926](https://github.com/google/ExoPlayer/issues/2926)). 3459 * New DynamicConcatenatingMediaSource class to support playback of dynamic 3460 playlists. 3461 * New ExoPlayer.setRepeatMode method for dynamic toggling of repeat mode 3462 during playback. Use of setRepeatMode should be preferred to 3463 LoopingMediaSource for most looping use cases. You can read more about 3464 setRepeatMode 3465 [here](https://medium.com/google-exoplayer/repeat-modes-in-exoplayer-19dd85f036d3). 3466 * Eliminated jank when switching video playback from one Surface to 3467 another on API level 23+ for unencrypted content, and on devices that 3468 support the EGL_EXT_protected_content OpenGL extension for protected 3469 content ([#677](https://github.com/google/ExoPlayer/issues/677)). 3470 * Enabled ExoPlayer instantiation on background threads without Loopers. 3471 Events from such players are delivered on the application's main thread. 3472* HLS improvements: 3473 * Optimized adaptive switches for playlists that specify the 3474 EXT-X-INDEPENDENT-SEGMENTS tag. 3475 * Optimized in-buffer seeking 3476 ([#551](https://github.com/google/ExoPlayer/issues/551)). 3477 * Eliminated re-buffering when changing audio and text track selections 3478 during playback, provided the new selection does not require switching 3479 to different renditions 3480 ([#2718](https://github.com/google/ExoPlayer/issues/2718)). 3481 * Exposed all media playlist tags in ExoPlayer's MediaPlaylist object. 3482* DASH: Support for seamless switching across streams in different 3483 AdaptationSet elements 3484 ([#2431](https://github.com/google/ExoPlayer/issues/2431)). 3485* DRM: Support for additional crypto schemes (cbc1, cbcs and cens) on API 3486 level 24+ ([#1989](https://github.com/google/ExoPlayer/issues/1989)). 3487* Captions: Initial support for SSA/ASS subtitles 3488 ([#889](https://github.com/google/ExoPlayer/issues/889)). 3489* AndroidTV: Fixed issue where tunneled video playback would not start on some 3490 devices ([#2985](https://github.com/google/ExoPlayer/issues/2985)). 3491* MPEG-TS: Fixed segmentation issue when parsing H262 3492 ([#2891](https://github.com/google/ExoPlayer/issues/2891)). 3493* Cronet extension: Support for a user-defined fallback if Cronet library is 3494 not present. 3495* Fix buffer too small IllegalStateException issue affecting some composite 3496 media playbacks ([#2900](https://github.com/google/ExoPlayer/issues/2900)). 3497* Misc bugfixes. 3498 3499### r2.4.4 (2017-07-19) 3500 3501* HLS/MPEG-TS: Some initial optimizations of MPEG-TS extractor performance 3502 ([#3040](https://github.com/google/ExoPlayer/issues/3040)). 3503* HLS: Fix propagation of format identifier for CEA-608 3504 ([#3033](https://github.com/google/ExoPlayer/issues/3033)). 3505* HLS: Detect playlist stuck and reset conditions 3506 ([#2872](https://github.com/google/ExoPlayer/issues/2872)). 3507* Video: Fix video dimension reporting on some devices 3508 ([#3007](https://github.com/google/ExoPlayer/issues/3007)). 3509 3510### r2.4.3 (2017-06-30) 3511 3512* Audio: Workaround custom audio decoders misreporting their maximum supported 3513 channel counts ([#2940](https://github.com/google/ExoPlayer/issues/2940)). 3514* Audio: Workaround for broken MediaTek raw decoder on some devices 3515 ([#2873](https://github.com/google/ExoPlayer/issues/2873)). 3516* Captions: Fix TTML captions appearing at the top of the screen 3517 ([#2953](https://github.com/google/ExoPlayer/issues/2953)). 3518* Captions: Fix handling of some DVB subtitles 3519 ([#2957](https://github.com/google/ExoPlayer/issues/2957)). 3520* Track selection: Fix setSelectionOverride(index, tracks, null) 3521 ([#2988](https://github.com/google/ExoPlayer/issues/2988)). 3522* GVR extension: Add support for mono input 3523 ([#2710](https://github.com/google/ExoPlayer/issues/2710)). 3524* FLAC extension: Fix failing build 3525 ([#2977](https://github.com/google/ExoPlayer/pull/2977)). 3526* Misc bugfixes. 3527 3528### r2.4.2 (2017-06-06) 3529 3530* Stability: Work around Nexus 10 reboot when playing certain content 3531 ([#2806](https://github.com/google/ExoPlayer/issues/2806)). 3532* MP3: Correctly treat MP3s with INFO headers as constant bitrate 3533 ([#2895](https://github.com/google/ExoPlayer/issues/2895)). 3534* HLS: Use average rather than peak bandwidth when available 3535 ([#2863](https://github.com/google/ExoPlayer/issues/2863)). 3536* SmoothStreaming: Fix timeline for live streams 3537 ([#2760](https://github.com/google/ExoPlayer/issues/2760)). 3538* UI: Fix DefaultTimeBar invalidation 3539 ([#2871](https://github.com/google/ExoPlayer/issues/2871)). 3540* Misc bugfixes. 3541 3542### r2.4.1 (2017-05-23) 3543 3544* Stability: Avoid OutOfMemoryError in extractors when parsing malformed media 3545 ([#2780](https://github.com/google/ExoPlayer/issues/2780)). 3546* Stability: Avoid native crash on Galaxy Nexus. Avoid unnecessarily large 3547 codec input buffer allocations on all devices 3548 ([#2607](https://github.com/google/ExoPlayer/issues/2607)). 3549* Variable speed playback: Fix interpolation for rate/pitch adjustment 3550 ([#2774](https://github.com/google/ExoPlayer/issues/2774)). 3551* HLS: Include EXT-X-DATERANGE tags in HlsMediaPlaylist. 3552* HLS: Don't expose CEA-608 track if CLOSED-CAPTIONS=NONE 3553 ([#2743](https://github.com/google/ExoPlayer/issues/2743)). 3554* HLS: Correctly propagate errors loading the media playlist 3555 ([#2623](https://github.com/google/ExoPlayer/issues/2623)). 3556* UI: DefaultTimeBar enhancements and bug fixes 3557 ([#2740](https://github.com/google/ExoPlayer/issues/2740)). 3558* Ogg: Fix failure to play some Ogg files 3559 ([#2782](https://github.com/google/ExoPlayer/issues/2782)). 3560* Captions: Don't select text tack with no language by default. 3561* Captions: TTML positioning fixes 3562 ([#2824](https://github.com/google/ExoPlayer/issues/2824)). 3563* Misc bugfixes. 3564 3565### r2.4.0 (2017-04-25) 3566 3567* New modular library structure. You can read more about depending on 3568 individual library modules 3569 [here](https://medium.com/google-exoplayer/exoplayers-new-modular-structure-a916c0874907). 3570* Variable speed playback support on API level 16+. You can read more about 3571 changing the playback speed 3572 [here](https://medium.com/google-exoplayer/variable-speed-playback-with-exoplayer-e6e6a71e0343) 3573 ([#26](https://github.com/google/ExoPlayer/issues/26)). 3574* New time bar view, including support for displaying ad break markers. 3575* Support DVB subtitles in MPEG-TS and MKV. 3576* Support adaptive playback for audio only DASH, HLS and SmoothStreaming 3577 ([#1975](https://github.com/google/ExoPlayer/issues/1975)). 3578* Support for setting extractor flags on DefaultExtractorsFactory 3579 ([#2657](https://github.com/google/ExoPlayer/issues/2657)). 3580* Support injecting custom renderers into SimpleExoPlayer using a new 3581 RenderersFactory interface. 3582* Correctly set ExoPlayer's internal thread priority to 3583 `THREAD_PRIORITY_AUDIO`. 3584* TX3G: Support styling and positioning. 3585* FLV: 3586 * Support MP3 in FLV. 3587 * Skip unhandled metadata rather than failing 3588 ([#2634](https://github.com/google/ExoPlayer/issues/2634)). 3589 * Fix potential OutOfMemory errors. 3590* ID3: Better handle malformed ID3 data 3591 ([#2604](https://github.com/google/ExoPlayer/issues/2604), 3592 [#2663](https://github.com/google/ExoPlayer/issues/2663)). 3593* FFmpeg extension: Fixed build instructions 3594 ([#2561](https://github.com/google/ExoPlayer/issues/2561)). 3595* VP9 extension: Reduced binary size. 3596* FLAC extension: Enabled 64 bit targets. 3597* Misc bugfixes. 3598 3599### r2.3.1 (2017-03-23) 3600 3601* Fix NPE enabling WebVTT subtitles in DASH streams 3602 ([#2596](https://github.com/google/ExoPlayer/issues/2596)). 3603* Fix skipping to keyframes when MediaCodecVideoRenderer is enabled but 3604 without a Surface 3605 ([#2575](https://github.com/google/ExoPlayer/issues/2575)). 3606* Minor fix for CEA-708 decoder 3607 ([#2595](https://github.com/google/ExoPlayer/issues/2595)). 3608 3609### r2.3.0 (2017-03-16) 3610 3611* GVR extension: Wraps the Google VR Audio SDK to provide spatial audio 3612 rendering. You can read more about the GVR extension 3613 [here](https://medium.com/google-exoplayer/spatial-audio-with-exoplayer-and-gvr-cecb00e9da5f#.xdjebjd7g). 3614* DASH improvements: 3615 * Support embedded CEA-608 closed captions 3616 ([#2362](https://github.com/google/ExoPlayer/issues/2362)). 3617 * Support embedded EMSG events 3618 ([#2176](https://github.com/google/ExoPlayer/issues/2176)). 3619 * Support mspr:pro manifest element 3620 ([#2386](https://github.com/google/ExoPlayer/issues/2386)). 3621 * Correct handling of empty segment indices at the start of live events 3622 ([#1865](https://github.com/google/ExoPlayer/issues/1865)). 3623* HLS improvements: 3624 * Respect initial track selection 3625 ([#2353](https://github.com/google/ExoPlayer/issues/2353)). 3626 * Reduced frequency of media playlist requests when playback position is 3627 close to the live edge 3628 ([#2548](https://github.com/google/ExoPlayer/issues/2548)). 3629 * Exposed the master playlist through ExoPlayer.getCurrentManifest() 3630 ([#2537](https://github.com/google/ExoPlayer/issues/2537)). 3631 * Support CLOSED-CAPTIONS #EXT-X-MEDIA type 3632 ([#341](https://github.com/google/ExoPlayer/issues/341)). 3633 * Fixed handling of negative values in #EXT-X-SUPPORT 3634 ([#2495](https://github.com/google/ExoPlayer/issues/2495)). 3635 * Fixed potential endless buffering state for streams with WebVTT 3636 subtitles ([#2424](https://github.com/google/ExoPlayer/issues/2424)). 3637* MPEG-TS improvements: 3638 * Support for multiple programs. 3639 * Support for multiple closed captions and caption service descriptors 3640 ([#2161](https://github.com/google/ExoPlayer/issues/2161)). 3641* MP3: Add `FLAG_ENABLE_CONSTANT_BITRATE_SEEKING` extractor option to enable 3642 constant bitrate seeking in MP3 files that would otherwise be unseekable 3643 ([#2445](https://github.com/google/ExoPlayer/issues/2445)). 3644* ID3: Better handle malformed ID3 data 3645 ([#2486](https://github.com/google/ExoPlayer/issues/2486)). 3646* Track selection: Added maxVideoBitrate parameter to DefaultTrackSelector. 3647* DRM: Add support for CENC ClearKey on API level 21+ 3648 ([#2361](https://github.com/google/ExoPlayer/issues/2361)). 3649* DRM: Support dynamic setting of key request headers 3650 ([#1924](https://github.com/google/ExoPlayer/issues/1924)). 3651* SmoothStreaming: Fixed handling of start_time placeholder 3652 ([#2447](https://github.com/google/ExoPlayer/issues/2447)). 3653* FLAC extension: Fix proguard configuration 3654 ([#2427](https://github.com/google/ExoPlayer/issues/2427)). 3655* Misc bugfixes. 3656 3657### r2.2.0 (2017-01-30) 3658 3659* Demo app: Automatic recovery from BehindLiveWindowException, plus improved 3660 handling of pausing and resuming live streams 3661 ([#2344](https://github.com/google/ExoPlayer/issues/2344)). 3662* AndroidTV: Added Support for tunneled video playback 3663 ([#1688](https://github.com/google/ExoPlayer/issues/1688)). 3664* DRM: Renamed StreamingDrmSessionManager to DefaultDrmSessionManager and 3665 added support for using offline licenses 3666 ([#876](https://github.com/google/ExoPlayer/issues/876)). 3667* DRM: Introduce OfflineLicenseHelper to help with offline license 3668 acquisition, renewal and release. 3669* UI: Updated player control assets. Added vector drawables for use on API 3670 level 21 and above. 3671* UI: Made player control seek bar work correctly with key events if focusable 3672 ([#2278](https://github.com/google/ExoPlayer/issues/2278)). 3673* HLS: Improved support for streams that use EXT-X-DISCONTINUITY without 3674 EXT-X-DISCONTINUITY-SEQUENCE 3675 ([#1789](https://github.com/google/ExoPlayer/issues/1789)). 3676* HLS: Support for EXT-X-START tag 3677 ([#1544](https://github.com/google/ExoPlayer/issues/1544)). 3678* HLS: Check #EXTM3U header is present when parsing the playlist. Fail 3679 gracefully if not 3680 ([#2301](https://github.com/google/ExoPlayer/issues/2301)). 3681* HLS: Fix memory leak 3682 ([#2319](https://github.com/google/ExoPlayer/issues/2319)). 3683* HLS: Fix non-seamless first adaptation where master playlist omits 3684 resolution tags ([#2096](https://github.com/google/ExoPlayer/issues/2096)). 3685* HLS: Fix handling of WebVTT subtitle renditions with non-standard segment 3686 file extensions ([#2025](https://github.com/google/ExoPlayer/issues/2025) 3687 and [#2355](https://github.com/google/ExoPlayer/issues/2355)). 3688* HLS: Better handle inconsistent HLS playlist update 3689 ([#2249](https://github.com/google/ExoPlayer/issues/2249)). 3690* DASH: Don't overflow when dealing with large segment numbers 3691 ([#2311](https://github.com/google/ExoPlayer/issues/2311)). 3692* DASH: Fix propagation of language from the manifest 3693 ([#2335](https://github.com/google/ExoPlayer/issues/2335)). 3694* SmoothStreaming: Work around "Offset to sample data was negative" failures 3695 ([#2292](https://github.com/google/ExoPlayer/issues/2292), 3696 [#2101](https://github.com/google/ExoPlayer/issues/2101) and 3697 [#1152](https://github.com/google/ExoPlayer/issues/1152)). 3698* MP3/ID3: Added support for parsing Chapter and URL link frames 3699 ([#2316](https://github.com/google/ExoPlayer/issues/2316)). 3700* MP3/ID3: Handle ID3 frames that end with empty text field 3701 ([#2309](https://github.com/google/ExoPlayer/issues/2309)). 3702* Added ClippingMediaSource for playing clipped portions of media 3703 ([#1988](https://github.com/google/ExoPlayer/issues/1988)). 3704* Added convenience methods to query whether the current window is dynamic and 3705 seekable ([#2320](https://github.com/google/ExoPlayer/issues/2320)). 3706* Support setting of default headers on HttpDataSource.Factory implementations 3707 ([#2166](https://github.com/google/ExoPlayer/issues/2166)). 3708* Fixed cache failures when using an encrypted cache content index. 3709* Fix visual artifacts when switching output surface 3710 ([#2093](https://github.com/google/ExoPlayer/issues/2093)). 3711* Fix gradle + proguard configurations. 3712* Fix player position when replacing the MediaSource 3713 ([#2369](https://github.com/google/ExoPlayer/issues/2369)). 3714* Misc bug fixes, including 3715 [#2330](https://github.com/google/ExoPlayer/issues/2330), 3716 [#2269](https://github.com/google/ExoPlayer/issues/2269), 3717 [#2252](https://github.com/google/ExoPlayer/issues/2252), 3718 [#2264](https://github.com/google/ExoPlayer/issues/2264) and 3719 [#2290](https://github.com/google/ExoPlayer/issues/2290). 3720 3721### r2.1.1 (2016-12-20) 3722 3723* Fix some subtitle types (e.g. WebVTT) being displayed out of sync 3724 ([#2208](https://github.com/google/ExoPlayer/issues/2208)). 3725* Fix incorrect position reporting for on-demand HLS media that includes 3726 EXT-X-PROGRAM-DATE-TIME tags 3727 ([#2224](https://github.com/google/ExoPlayer/issues/2224)). 3728* Fix issue where playbacks could get stuck in the initial buffering state if 3729 over 1MB of data needs to be read to initialize the playback. 3730 3731### r2.1.0 (2016-12-14) 3732 3733* HLS: Support for seeking in live streams 3734 ([#87](https://github.com/google/ExoPlayer/issues/87)). 3735* HLS: Improved support: 3736 * Support for EXT-X-PROGRAM-DATE-TIME 3737 ([#747](https://github.com/google/ExoPlayer/issues/747)). 3738 * Improved handling of sample timestamps and their alignment across 3739 variants and renditions. 3740 * Fix issue that could cause playbacks to get stuck in an endless initial 3741 buffering state. 3742 * Correctly propagate BehindLiveWindowException instead of 3743 IndexOutOfBoundsException exception 3744 ([#1695](https://github.com/google/ExoPlayer/issues/1695)). 3745* MP3/MP4: Support for ID3 metadata, including embedded album art 3746 ([#979](https://github.com/google/ExoPlayer/issues/979)). 3747* Improved customization of UI components. You can read about customization of 3748 ExoPlayer's UI components 3749 [here](https://medium.com/google-exoplayer/customizing-exoplayers-ui-components-728cf55ee07a#.9ewjg7avi). 3750* Robustness improvements when handling MediaSource timeline changes and 3751 MediaPeriod transitions. 3752* CEA-608: Support for caption styling and positioning. 3753* MPEG-TS: Improved support: 3754 * Support injection of custom TS payload readers. 3755 * Support injection of custom section payload readers. 3756 * Support SCTE-35 splice information messages. 3757 * Support multiple table sections in a single PSI section. 3758 * Fix NullPointerException when an unsupported stream type is encountered 3759 ([#2149](https://github.com/google/ExoPlayer/issues/2149)). 3760 * Avoid failure when expected ID3 header not found 3761 ([#1966](https://github.com/google/ExoPlayer/issues/1966)). 3762* Improvements to the upstream cache package. 3763 * Support caching of media segments for DASH, HLS and SmoothStreaming. 3764 Note that caching of manifest and playlist files is still not supported 3765 in the (normal) case where the corresponding responses are compressed. 3766 * Support caching for ExtractorMediaSource based playbacks. 3767* Improved flexibility of SimpleExoPlayer 3768 ([#2102](https://github.com/google/ExoPlayer/issues/2102)). 3769* Fix issue where only the audio of a video would play due to capability 3770 detection issues ([#2007](https://github.com/google/ExoPlayer/issues/2007), 3771 [#2034](https://github.com/google/ExoPlayer/issues/2034) and 3772 [#2157](https://github.com/google/ExoPlayer/issues/2157)). 3773* Fix issues that could cause ExtractorMediaSource based playbacks to get 3774 stuck buffering ([#1962](https://github.com/google/ExoPlayer/issues/1962)). 3775* Correctly set SimpleExoPlayerView surface aspect ratio when an active player 3776 is attached ([#2077](https://github.com/google/ExoPlayer/issues/2077)). 3777* OGG: Fix playback of short OGG files 3778 ([#1976](https://github.com/google/ExoPlayer/issues/1976)). 3779* MP4: Support `.mp3` tracks 3780 ([#2066](https://github.com/google/ExoPlayer/issues/2066)). 3781* SubRip: Don't fail playbacks if SubRip file contains negative timestamps 3782 ([#2145](https://github.com/google/ExoPlayer/issues/2145)). 3783* Misc bugfixes. 3784 3785### r2.0.4 (2016-10-20) 3786 3787* Fix crash on Jellybean devices when using playback controls 3788 ([#1965](https://github.com/google/ExoPlayer/issues/1965)). 3789 3790### r2.0.3 (2016-10-17) 3791 3792* Fixed NullPointerException in ExtractorMediaSource 3793 ([#1914](https://github.com/google/ExoPlayer/issues/1914)). 3794* Fixed NullPointerException in HlsMediaPeriod 3795 ([#1907](https://github.com/google/ExoPlayer/issues/1907)). 3796* Fixed memory leak in PlaybackControlView 3797 ([#1908](https://github.com/google/ExoPlayer/issues/1908)). 3798* Fixed strict mode violation when using 3799 SimpleExoPlayer.setVideoPlayerTextureView(). 3800* Fixed L3 Widevine provisioning 3801 ([#1925](https://github.com/google/ExoPlayer/issues/1925)). 3802* Fixed hiding of controls with use_controller="false" 3803 ([#1919](https://github.com/google/ExoPlayer/issues/1919)). 3804* Improvements to Cronet network stack extension. 3805* Misc bug fixes. 3806 3807### r2.0.2 (2016-10-06) 3808 3809* Fixes for MergingMediaSource and sideloaded subtitles. 3810 ([#1882](https://github.com/google/ExoPlayer/issues/1882), 3811 [#1854](https://github.com/google/ExoPlayer/issues/1854), 3812 [#1900](https://github.com/google/ExoPlayer/issues/1900)). 3813* Reduced effect of application code leaking player references 3814 ([#1855](https://github.com/google/ExoPlayer/issues/1855)). 3815* Initial support for fragmented MP4 in HLS. 3816* Misc bug fixes and minor features. 3817 3818### r2.0.1 (2016-09-30) 3819 3820* Fix playback of short duration content 3821 ([#1837](https://github.com/google/ExoPlayer/issues/1837)). 3822* Fix MergingMediaSource preparation issue 3823 ([#1853](https://github.com/google/ExoPlayer/issues/1853)). 3824* Fix live stream buffering (out of memory) issue 3825 ([#1825](https://github.com/google/ExoPlayer/issues/1825)). 3826 3827### r2.0.0 (2016-09-14) 3828 3829ExoPlayer 2.x is a major iteration of the library. It includes significant API 3830and architectural changes, new features and many bug fixes. You can read about 3831some of the motivations behind ExoPlayer 2.x 3832[here](https://medium.com/google-exoplayer/exoplayer-2-x-why-what-and-when-74fd9cb139#.am7h8nytm). 3833 3834* Root package name changed to `com.google.android.exoplayer2`. The library 3835 structure and class names have also been sanitized. Read more 3836 [here](https://medium.com/google-exoplayer/exoplayer-2-x-new-package-and-class-names-ef8e1d9ba96f#.lv8sd4nez). 3837* Key architectural changes: 3838 * Late binding between rendering and media source components. Allows the 3839 same rendering components to be re-used from one playback to another. 3840 Enables features such as gapless playback through playlists and DASH 3841 multi-period support. 3842 * Improved track selection design. More details can be found 3843 [here](https://medium.com/google-exoplayer/exoplayer-2-x-track-selection-2b62ff712cc9#.n00zo76b6). 3844 * LoadControl now used to control buffering and loading across all 3845 playback types. 3846 * Media source components given additional structure. A new MediaSource 3847 class has been introduced. MediaSources expose Timelines that describe 3848 the media they expose, and can consist of multiple MediaPeriods. This 3849 enables features such as seeking in live playbacks and DASH multi-period 3850 support. 3851 * Responsibility for loading the initial DASH/SmoothStreaming/HLS manifest 3852 is promoted to the corresponding MediaSource components and is no longer 3853 the application's responsibility. 3854 * Higher level abstractions such as SimpleExoPlayer have been added to the 3855 library. These make the library easier to use for common use cases. The 3856 demo app is halved in size as a result, whilst at the same time gaining 3857 more functionality. Read more 3858 [here](https://medium.com/google-exoplayer/exoplayer-2-x-improved-demo-app-d97171aaaaa1). 3859 * Enhanced library support for implementing audio extensions. Read more 3860 [here](https://medium.com/google-exoplayer/exoplayer-2-x-new-audio-features-cfb26c2883a#.ua75vu4s3). 3861 * Format and MediaFormat are replaced by a single Format class. 3862* Key new features: 3863 * Playlist support. Includes support for gapless playback between playlist 3864 items and consistent application of LoadControl and TrackSelector 3865 policies when transitioning between items 3866 ([#1270](https://github.com/google/ExoPlayer/issues/1270)). 3867 * Seeking in live playbacks for DASH and SmoothStreaming 3868 ([#291](https://github.com/google/ExoPlayer/issues/291)). 3869 * DASH multi-period support 3870 ([#557](https://github.com/google/ExoPlayer/issues/557)). 3871 * MediaSource composition allows MediaSources to be concatenated into a 3872 playlist, merged and looped. Read more 3873 [here](https://medium.com/google-exoplayer/exoplayer-2-x-mediasource-composition-6c285fcbca1f#.zfha8qupz). 3874 * Looping support (see above) 3875 ([#490](https://github.com/google/ExoPlayer/issues/490)). 3876 * Ability to query information about all tracks in a piece of media 3877 (including those not supported by the device) 3878 ([#1121](https://github.com/google/ExoPlayer/issues/1121)). 3879 * Improved player controls. 3880 * Support for PSSH in fMP4 moof atoms 3881 ([#1143](https://github.com/google/ExoPlayer/issues/1143)). 3882 * Support for Opus in Ogg 3883 ([#1447](https://github.com/google/ExoPlayer/issues/1447)). 3884 * CacheDataSource support for standalone media file playbacks (mp3, mp4 3885 etc). 3886 * FFMPEG extension (for audio only). 3887* Key bug fixes: 3888 * Removed unnecessary secondary requests when playing standalone media 3889 files ([#1041](https://github.com/google/ExoPlayer/issues/1041)). 3890 * Fixed playback of video only (i.e. no audio) live streams 3891 ([#758](https://github.com/google/ExoPlayer/issues/758)). 3892 * Fixed silent failure when media buffer is too small 3893 ([#583](https://github.com/google/ExoPlayer/issues/583)). 3894 * Suppressed "Sending message to a Handler on a dead thread" warnings 3895 ([#426](https://github.com/google/ExoPlayer/issues/426)). 3896 3897# Legacy release notes 3898 3899Note: Since ExoPlayer V1 is still being maintained alongside V2, there is some 3900overlap between these notes and the notes above. r2.0.0 followed from r1.5.11, 3901and hence it can be assumed that all changes in r1.5.11 and earlier are included 3902in all V2 releases. This cannot be assumed for changes in r1.5.12 and later, 3903however it can be assumed that all such changes are included in the most recent 3904V2 release. 3905 3906### r1.5.16 3907 3908* VP9 extension: Reduced binary size. 3909* FLAC extension: Enabled 64 bit targets and fixed proguard config. 3910* Misc bugfixes. 3911 3912### r1.5.15 3913 3914* SmoothStreaming: Fixed handling of start_time placeholder 3915 ([#2447](https://github.com/google/ExoPlayer/issues/2447)). 3916* Misc bugfixes. 3917 3918### r1.5.14 3919 3920* Fixed cache failures when using an encrypted cache content index. 3921* SmoothStreaming: Work around "Offset to sample data was negative" failures 3922 ([#2292](https://github.com/google/ExoPlayer/issues/2292), 3923 [#2101](https://github.com/google/ExoPlayer/issues/2101) and 3924 [#1152](https://github.com/google/ExoPlayer/issues/1152)). 3925 3926### r1.5.13 3927 3928* Improvements to the upstream cache package. 3929* MP4: Support `.mp3` tracks 3930 ([#2066](https://github.com/google/ExoPlayer/issues/2066)). 3931* SubRip: Don't fail playbacks if SubRip file contains negative timestamps 3932 ([#2145](https://github.com/google/ExoPlayer/issues/2145)). 3933* MPEG-TS: Avoid failure when expected ID3 header not found 3934 ([#1966](https://github.com/google/ExoPlayer/issues/1966)). 3935* Misc bugfixes. 3936 3937### r1.5.12 3938 3939* Improvements to Cronet network stack extension. 3940* Fix bug in demo app introduced in r1.5.11 that caused L3 Widevine 3941 provisioning requests to fail. 3942* Misc bugfixes. 3943 3944### r1.5.11 3945 3946* Cronet network stack extension. 3947* HLS: Fix propagation of language for alternative audio renditions 3948 ([#1784](https://github.com/google/ExoPlayer/issues/1784)). 3949* WebM: Support for subsample encryption. 3950* ID3: Fix EOS detection for 2-byte encodings 3951 ([#1774](https://github.com/google/ExoPlayer/issues/1774)). 3952* MPEG-TS: Support multiple tracks of the same type. 3953* MPEG-TS: Work toward robust handling of stream corruption. 3954* Fix ContentDataSource failures triggered by garbage collector 3955 ([#1759](https://github.com/google/ExoPlayer/issues/1759)). 3956 3957### r1.5.10 3958 3959* HLS: Stability fixes. 3960* MP4: Support for stz2 Atoms. 3961* Enable 4K format selection on Sony AndroidTV + nVidia SHIELD. 3962* TX3G caption fixes. 3963 3964### r1.5.9 3965 3966* MP4: Fixed incorrect sniffing in some cases (#1523). 3967* MP4: Improved file compatibility (#1567). 3968* ID3: Support for TIT2 and APIC frames. 3969* Fixed querying of platform decoders on some devices. 3970* Misc bug fixes. 3971 3972### r1.5.8 3973 3974* HLS: Fix handling of HTTP redirects. 3975* Audio: Minor adjustment to improve A/V sync. 3976* OGG: Support FLAC in OGG. 3977* TTML: Support regions. 3978* WAV/PCM: Support 8, 24 and 32-bit WAV and PCM audio. 3979* Misc bug fixes and performance optimizations. 3980 3981### r1.5.7 3982 3983* OGG: Support added for OGG. 3984* FLAC: Support for FLAC extraction and playback (via an extension). 3985* HLS: Multiple audio track support (via Renditions). 3986* FMP4: Support multiple tracks in fragmented MP4 (not applicable to 3987 DASH/SmoothStreaming). 3988* WAV: Support for 16-bit WAV files. 3989* MKV: Support non-square pixel formats. 3990* Misc bug fixes. 3991 3992### r1.5.6 3993 3994* MP3: Fix mono streams playing at 2x speed on some MediaTek based devices 3995 (#801). 3996* MP3: Fix playback of some streams when stream length is unknown. 3997* ID3: Support multiple frames of the same type in a single tag. 3998* CEA-608: Correctly handle repeated control characters, fixing an issue in 3999 which captions would immediately disappear. 4000* AVC3: Fix decoder failures on some MediaTek devices in the case where the 4001 first buffer fed to the decoder does not start with SPS/PPS NAL units. 4002* Misc bug fixes. 4003 4004### r1.5.5 4005 4006* DASH: Enable MP4 embedded WebVTT playback (#1185) 4007* HLS: Fix handling of extended ID3 tags in MPEG-TS (#1181) 4008* MP3: Fix incorrect position calculation in VBRI header (#1197) 4009* Fix issue seeking backward using SingleSampleSource (#1193) 4010 4011### r1.5.4 4012 4013* HLS: Support for variant selection and WebVtt subtitles. 4014* MP4: Support for embedded WebVtt. 4015* Improved device compatibility. 4016* Fix for resource leak (Issue #1066). 4017* Misc bug fixes + minor features. 4018 4019### r1.5.3 4020 4021* Support for FLV (without seeking). 4022* MP4: Fix for playback of media containing basic edit lists. 4023* QuickTime: Fix parsing of QuickTime style audio sample entry. 4024* HLS: Add H262 support for devices that have an H262 decoder. 4025* Allow AudioTrack PlaybackParams (e.g. speed/pitch) on API level 23+. 4026* Correctly detect 4K displays on API level 23+. 4027* Misc bug fixes. 4028 4029### r1.5.2 4030 4031* MPEG-TS/HLS: Fix frame drops playing H265 video. 4032* SmoothStreaming: Fix parsing of ProtectionHeader. 4033 4034### r1.5.1 4035 4036* Enable smooth frame release by default. 4037* Added OkHttpDataSource extension. 4038* AndroidTV: Correctly detect 4K display size on Bravia devices. 4039* FMP4: Handle non-sample data in mdat boxes. 4040* TTML: Fix parsing of some colors on Jellybean. 4041* SmoothStreaming: Ignore tfdt boxes. 4042* Misc bug fixes. 4043 4044### r1.5.0 4045 4046* Multi-track support. 4047* DASH: Limited support for multi-period manifests. 4048* HLS: Smoother format adaptation. 4049* HLS: Support for MP3 media segments. 4050* TTML: Support for most embedded TTML styling. 4051* WebVTT: Enhanced positioning support. 4052* Initial playback tests. 4053* Misc bug fixes. 4054 4055### r1.4.2 4056 4057* Implemented automatic format detection for regular container formats. 4058* Added UdpDataSource for connecting to multicast streams. 4059* Improved robustness for MP4 playbacks. 4060* Misc bug fixes. 4061 4062### r1.4.1 4063 4064* HLS: Fix premature playback failures that could occur in some cases. 4065 4066### r1.4.0 4067 4068* Support for extracting Matroska streams (implemented by WebmExtractor). 4069* Support for tx3g captions in MP4 streams. 4070* Support for H.265 in MPEG-TS streams on supported devices. 4071* HLS: Added support for MPEG audio (e.g. MP3) in TS media segments. 4072* HLS: Improved robustness against missing chunks and variants. 4073* MP4: Added support for embedded MPEG audio (e.g. MP3). 4074* TTML: Improved handling of whitespace. 4075* DASH: Support Mpd.Location element. 4076* Add option to TsExtractor to allow non-IDR keyframes. 4077* Added MulticastDataSource for connecting to multicast streams. 4078* (WorkInProgress) - First steps to supporting seeking in DASH DVR window. 4079* (WorkInProgress) - First steps to supporting styled + positioned subtitles. 4080* Misc bug fixes. 4081 4082### r1.3.3 4083 4084* HLS: Fix failure when playing HLS AAC streams. 4085* Misc bug fixes. 4086 4087### r1.3.2 4088 4089* DataSource improvements: `DefaultUriDataSource` now handles http://, 4090 https://, file://, asset:// and content:// URIs automatically. It also 4091 handles file:///android_asset/* URIs, and file paths like /path/to/media.mp4 4092 where the scheme is omitted. 4093* HLS: Fix for some ID3 events being dropped. 4094* HLS: Correctly handle 0x0 and floating point RESOLUTION tags. 4095* Mp3Extractor: robustness improvements. 4096 4097### r1.3.1 4098 4099* No notes provided. 4100