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