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