diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4e3e35767d..348bf2008e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,194 +2,87 @@ ### dev-v2 (not yet released) -* New release notes go here! -* Core library: - * Log a warning when `SingleSampleMediaPeriod` transforms a load error - into end-of-stream. - * Fall back to AVC/HEVC decoders for Dolby Vision streams with level 10 - to 13 - ([#8530](https://github.com/google/ExoPlayer/issues/8530)). * UI: * Add builder for `PlayerNotificationManager`. -* Extractors: - * Fix Vorbis private codec data parsing in the Matroska extractor - ([#8496](https://github.com/google/ExoPlayer/issues/8496)). -* Text: - * Add support for the SSA `primaryColour` style attribute - ([#8435](https://github.com/google/ExoPlayer/issues/8435)). -### 2.13.0 (not yet released - targeted for 2021-02-TBD) +### 2.13.0 (2021-02-04) * Core library: - * Remove long deprecated symbols: - * `AdaptiveMediaSourceEventListener`. Use `MediaSourceEventListener` - instead. - * `DashMediaSource.Factory.setMinLoadableRetryCount(int)`. Use - `DashMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` - instead. - * `DefaultAnalyticsListener`. Use `AnalyticsListener` directly - instead. - * `DefaultLoadControl` constructors. Use `DefaultLoadControl.Builder` - instead. - * `DrmInitData.get(UUID)`. Use `DrmInitData.get(int)` and - `DrmInitData.SchemeData.matches(UUID)` instead. - * `ExtractorsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use - `ExtractorsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` - instead. - * `FixedTrackSelection.Factory`. If you need to disable adaptive - selection in `DefaultTrackSelector`, enable the - `DefaultTrackSelector.Parameters.forceHighestSupportedBitrate` flag. - * `HlsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use - `HlsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` - instead. - * `MappedTrackInfo.getTrackFormatSupport(int, int, int)`. Use - `MappedTrackInfo.getTrackSupport(int, int, int)`. - * `MappedTrackInfo.getTrackTypeRendererSupport(int)`. Use - `MappedTrackInfo.getTypeSupport(int)`. - * `MappedTrackInfo.getUnassociatedTrackGroups()`. Use - `MappedTrackInfo.getUnmappedTrackGroups()`. - * `MappedTrackInfo.length` - Use `MappedTrackInfo.getRendererCount()` - instead. - * `Player.DefaultEventListener.onTimelineChanged(Timeline, Object)`. - Use `Player.EventListener.onTimelineChanged(Timeline, int)` instead. - * `Player.setAudioAttributes(AudioAttributes)`. Use - `Player.AudioComponent.setAudioAttributes(AudioAttributes, boolean)` - instead. - * `PlayerView.setDefaultArtwork(Bitmap)`. Use - `PlayerView.setDefaultArtwork(Drawable)` instead. - * `PlayerView.setShowBuffering(boolean)`. Use - `PlayerView.setShowBuffering(int)` instead. - * `SimpleExoPlayer.clearMetadataOutput(MetadataOutput)`. Use - `SimpleExoPlayer.removeMetadataOutput(MetadataOutput)` instead. - * `SimpleExoPlayer.clearTextOutput(TextOutput)`. Use - `SimpleExoPlayer.removeTextOutput(TextOutput)` instead. - * `SimpleExoPlayer.clearVideoListener()`. Use - `SimpleExoPlayer.removeVideoListener(VideoListener)` instead. - * `SimpleExoPlayer.getAudioStreamType()`. Use - `SimpleExoPlayer.getAudioAttributes()` instead. - * `SimpleExoPlayer.setAudioDebugListener(AudioRendererEventListener)`. - Use `SimpleExoPlayer.addAnalyticsListener(AnalyticsListener)` - instead. - * `SimpleExoPlayer.setAudioStreamType(int)`. Use - `SimpleExoPlayer.setAudioAttributes(AudioAttributes)` instead. - * `SimpleExoPlayer.setMetadataOutput(MetadataOutput)`. Use - `SimpleExoPlayer.addMetadataOutput(MetadataOutput)` instead. If your - application is calling `SimpleExoPlayer.setMetadataOutput(null)`, - make sure to replace this call with - `SimpleExoPlayer.removeMetadataOutput(MetadataOutput)`. - * `SimpleExoPlayer.setPlaybackParams(PlaybackParams)`. Use - `SimpleExoPlayer.setPlaybackParameters(PlaybackParameters)` instead. - * `SimpleExoPlayer.setTextOutput(TextOutput)`. Use - `SimpleExoPlayer.addTextOutput(TextOutput)` instead. If your - application is calling `SimpleExoPlayer.setTextOutput(null)`, make - sure to replace this call with - `SimpleExoPlayer.removeTextOutput(TextOutput)`. - * `SimpleExoPlayer.setVideoDebugListener(VideoRendererEventListener)`. - Use `SimpleExoPlayer.addAnalyticsListener(AnalyticsListener)` - instead. - * `SimpleExoPlayer.setVideoListener(VideoListener)`. Use - `SimpleExoPlayer.addVideoListener(VideoListener)` instead. If your - application is calling `SimpleExoPlayer.setVideoListener(null)`, - make sure to replace this call with - `SimpleExoPlayer.removeVideoListener(VideoListener)`. - * `SimpleExoPlayer.VideoListener`. Use - `com.google.android.exoplayer2.video.VideoListener` instead. - * `SingleSampleMediaSource.EventListener` and constructors. Use - `MediaSourceEventListener` and `SingleSampleMediaSource.Factory` - * `SimpleExoPlayer.addVideoDebugListener`, - `SimpleExoPlayer.removeVideoDebugListener`, - `SimpleExoPlayer.addAudioDebugListener` and - `SimpleExoPlayer.removeAudioDebugListener`. Use - `SimpleExoPlayer.addAnalyticsListener` and - `SimpleExoPlayer.removeAnalyticsListener` instead. - * `AdaptiveMediaSourceEventListener`. Use `MediaSourceEventListener` - instead. - * `SingleSampleMediaSource.Factory.setMinLoadableRetryCount(int)`. Use - `SingleSampleMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` - instead. - * `SsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use - `SsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` - instead. - * Add a `LivePlaybackSpeedControl` component to control the playback speed - during live playbacks. This allows the player to stay close to the - configured live offset. A configurable default implementation - `DefaultLivePlaybackSpeedControl` is added to `ExoPlayer` and - `SimpleExoPlayer` by default. - * Add `LiveConfiguration` to `MediaItem` to allow media-specific live - offset and live playback speed settings. The same settings can be set - for all `MediaItems` in `DefaultMediaSourceFactory`. - * Add `targetLiveOffsetUs` parameter to `LoadControl.shouldStartPlayback`. * Verify correct thread usage in `SimpleExoPlayer` by default. Opt-out is still possible until the next major release using `setThrowsWhenUsingWrongThread(false)` ([#4463](https://github.com/google/ExoPlayer/issues/4463)). - * Add a getter and callback for static metadata to the player + * Add `Player.getCurrentStaticMetadata` and + `EventListener.onStaticMetadataChanged` to expose static metadata + belonging to the currently playing stream ([#7266](https://github.com/google/ExoPlayer/issues/7266)). - * Time out on release to prevent ANRs if the underlying platform call is + * Add `PlayerMessage.setLooper` and deprecate `PlayerMessage.setHandler`. + * Add option to `MergingMediaSource` to clip the durations of all sources + to have the same length + ([#8422](https://github.com/google/ExoPlayer/issues/8422)). + * Remove `Player.setVideoDecoderOutputBufferRenderer` from Player API. Use + `setVideoSurfaceView` and `clearVideoSurfaceView` instead. + * Default `SingleSampleMediaSource.treatLoadErrorsAsEndOfStream` to `true` + so that errors loading external subtitle files do not cause playback + to fail ([#8430](https://github.com/google/ExoPlayer/issues/8430)). A + warning will be logged by `SingleSampleMediaPeriod` whenever a load + error is treated as though the end of the stream has been reached. + * Time out on release to prevent ANRs if an underlying platform call is stuck ([#4352](https://github.com/google/ExoPlayer/issues/4352)). * Time out when detaching a surface to prevent ANRs if the underlying platform call is stuck ([#5887](https://github.com/google/ExoPlayer/issues/5887)). - * Fix bug where `AnalyticsListener` callbacks can arrive in the wrong + * Fix bug where `AnalyticsListener` callbacks could arrive in the wrong order ([#8048](https://github.com/google/ExoPlayer/issues/8048)). - * Add `onEvents` callback to `Player.EventListener` and - `AnalyticsListener` to notify when all simultaneous state changes have - been handled and the values reported through callbacks are again - completely consistent with the values obtained from the `Player` - getters. - * Deprecate `HttpDataSource.Factory.getDefaultRequestProperties` and add - `HttpDataSource.Factory.setDefaultRequestProperties` instead. - * Add `DefaultHttpDataSource.Factory` and deprecate - `DefaultHttpDataSourceFactory`. - * Add option to `MergingMediaSource` to clip the durations of all sources - to have the same length - ([#8422](https://github.com/google/ExoPlayer/issues/8422)). - * Remove `ExoPlaybackException.OutOfMemoryError`. - * Remove `setVideoDecoderOutputBufferRenderer` from Player API. Clients - should use `setOutputSurface` directly instead. - * Default `SingleSampleMediaSource.treatLoadErrorsAsEndOfStream` to `true` - ([#8430](https://github.com/google/ExoPlayer/issues/8430)). - * Remove `setVideoDecoderOutputBufferRenderer` from Player API. Use - `setVideoSurfaceView` and `clearVideoSurfaceView` instead. - * Replace `PlayerMessage.setHandler` with `PlayerMessage.setLooper`. - * Log a warning when `SingleSampleMediaPeriod` transforms a load error - into end-of-stream. -* Transformer: - * Add a library to transform media inputs. The available transformations - are: - * Configuration of output container format. - * Removal of audio or video tracks. - * Slow motion flattening. +* Media transformation: + * Add a new `transformer` module for converting media streams. The + initially available transformations are changing the container format, + removing tracks, and slow motion flattening. +* Low latency live streaming: + * Support low-latency DASH (also known as ULL-CMAF) and Apple's + low-latency HLS extension. + * Add `LiveConfiguration` to `MediaItem` to define live offset and + playback speed adjustment parameters. The same parameters can be set on + `DefaultMediaSourceFactory` to apply for all `MediaItems`. + * Add `LivePlaybackSpeedControl` to control playback speed adjustments + during live playbacks. Such adjustments allow the player to stay close + to the live offset. `DefaultLivePlaybackSpeedControl` is provided as a + default implementation. + * Add `targetLiveOffsetUs` parameter to `LoadControl.shouldStartPlayback`. * Extractors: * Populate codecs string for H.264/AVC in MP4, Matroska and FLV streams to - allow decoder capability checks based on codec profile/level + allow decoder capability checks based on codec profile and level ([#8393](https://github.com/google/ExoPlayer/issues/8393)). * Populate codecs string for H.265/HEVC in MP4, Matroska and MPEG-TS - streams to allow decoder capability checks based on codec profile/level - ([#8393](https://github.com/google/ExoPlayer/issues/8393)). - * Handle sample size mismatches between raw audio `stsd` information and - `stsz` fixed sample size in MP4 extractors. + streams to allow decoder capability checks based on codec profile and + level ([#8393](https://github.com/google/ExoPlayer/issues/8393)). * Add support for playing JPEG motion photos ([#5405](https://github.com/google/ExoPlayer/issues/5405)). + * Handle sample size mismatches between raw audio `stsd` information and + `stsz` fixed sample size in MP4 extractors. * Fix Vorbis private codec data parsing in the Matroska extractor ([#8496](https://github.com/google/ExoPlayer/issues/8496)). * Track selection: * Move `Player.getTrackSelector` to the `ExoPlayer` interface. - * Allow parallel adaptation for video and audio + * Move the mutable parts of `TrackSelection` into an `ExoTrackSelection` + subclass. + * Allow parallel adaptation of video and audio ([#5111](https://github.com/google/ExoPlayer/issues/5111)). * Simplify enabling tunneling with `DefaultTrackSelector`. `ParametersBuilder.setTunnelingAudioSessionId` has been replaced with `ParametersBuilder.setTunnelingEnabled`. The player's audio session ID will be used, and so a tunneling specific ID is no longer needed. - * Add option to specify multiple preferred audio or text languages. - * Add option to specify preferred MIME type(s) for video and audio - ([#8320](https://github.com/google/ExoPlayer/issues/8320)). - * Add option to specify preferred audio role flags. + * Add additional configuration parameters to `DefaultTrackSelector`. + `DefaultTrackSelector.ParametersBuilder` now includes: + * `setPreferredVideoMimeType`, `setPreferredVideoMimeTypes`, + `setPreferredAudioMimeType` and `setPreferredAudioMimeTypes` for + specifying preferred video and audio MIME type(s) + ([#8320](https://github.com/google/ExoPlayer/issues/8320)). + * `setPreferredAudioLanguages` and `setPreferredTextLanguages` for + specifying multiple preferred audio and text languages. + * `setPreferredAudioRoleFlags` for specifying preferred audio role + flags. * Forward `Timeline` and `MediaPeriodId` to `TrackSelection.Factory`. - * In order to make it immutable, `TrackSelection` in the `Player` API now - only contains methods related to static selection. The rest of the - methods have been moved to the child class `ExoTrackSelection` which is - used by all ExoPlayer components. * DASH: * Support low-latency DASH playback (`availabilityTimeOffset` and `ServiceDescription` tags) @@ -203,31 +96,34 @@ * Support low-latency HLS playback (`EXT-X-PART` and preload hints) ([#5011](https://github.com/google/ExoPlayer/issues/5011)). * UI: + * Improve `StyledPlayerControlView` button animations. * Miscellaneous fixes for `StyledPlayerControlView` in minimal mode. - * Show overflow button in `StyledPlayerControlView` only when there is not - enough space. - * Update StyledPlayer's control overlay scrim from 30% opacity to 60% - opacity for Accessibility requirements. - * Switch `StyledPlayerControlView` button controls to borderless ripples. * DRM: * Fix playback failure when switching from PlayReady protected content to Widevine or Clearkey protected content in a playlist. * Add `ExoMediaDrm.KeyRequest.getRequestType` ([#7847](https://github.com/google/ExoPlayer/issues/7847)). - * Drop key & provision responses if `DefaultDrmSession` is released while - waiting for the response. This prevents these (harmless) log messages: + * Drop key and provision responses if `DefaultDrmSession` is released + while waiting for the response. This prevents harmless log messages of + the form: `IllegalStateException: sending message to a Handler on a dead thread` ([#8328](https://github.com/google/ExoPlayer/issues/8328)). - * Allow apps to fully customize DRM behaviour per-`MediaItem` by passing a - `DrmSessionManagerProvider` to `MediaSourceFactory` + * Allow apps to fully customize DRM behaviour for each `MediaItem` by + passing a `DrmSessionManagerProvider` to `MediaSourceFactory` ([#8466](https://github.com/google/ExoPlayer/issues/8466)). * Analytics: + * Add an `onEvents` callback to `Player.EventListener` and + `AnalyticsListener`. When one or more player states change + simultaneously, `onEvents` is called once after all of the callbacks + associated with the individual state changes. * Pass a `DecoderReuseEvaluation` to `AnalyticsListener`'s `onVideoInputFormatChanged` and `onAudioInputFormatChanged` methods. The `DecoderReuseEvaluation` indicates whether it was possible to re-use an existing decoder instance for the new format, and if not then the reasons why. * Video: + * Fall back to AVC/HEVC decoders for Dolby Vision streams with level 10 + to 13 ([#8530](https://github.com/google/ExoPlayer/issues/8530)). * Fix VP9 format capability checks on API level 23 and earlier. The platform does not correctly report the VP9 level supported by the decoder in this case, so we estimate it based on the decoder's maximum @@ -248,14 +144,19 @@ * Create E-AC3 JOC passthrough `AudioTrack` instances using the maximum supported channel count (instead of assuming 6 channels) from API 29. * Text: + * Add support for the SSA `primaryColour` style attribute + ([#8435](https://github.com/google/ExoPlayer/issues/8435)). * Fix CEA-708 sequence number discontinuity handling ([#1807](https://github.com/google/ExoPlayer/issues/1807)). * Fix CEA-708 handling of unexpectedly small packets ([#1807](https://github.com/google/ExoPlayer/issues/1807)). - * Add support for the SSA `primaryColour` style attribute - ([#8435](https://github.com/google/ExoPlayer/issues/8435)). * Data sources: - * Use the user agent of the underlying network stack by default. + * For `HttpDataSource` implementations, default to using the user agent of + the underlying network stack. + * Deprecate `HttpDataSource.Factory.getDefaultRequestProperties`. + `HttpDataSource.Factory.setDefaultRequestProperties` instead. + * Add `DefaultHttpDataSource.Factory` and deprecate + `DefaultHttpDataSourceFactory`. * Metadata retriever: * Parse Google Photos HEIC and JPEG motion photo metadata. * IMA extension: @@ -263,8 +164,8 @@ ([#3750](https://github.com/google/ExoPlayer/issues/3750)). * Add `ImaAdsLoader.Builder.setEnableContinuousPlayback` for setting whether to request ads for continuous playback. - * Upgrade IMA SDK dependency to 3.22.0, bringing in a fix for leaking the - ad view group ([#7344](https://github.com/google/ExoPlayer/issues/7344), + * Upgrade IMA SDK dependency to 3.22.0. This fixes leaking of the ad view + group ([#7344](https://github.com/google/ExoPlayer/issues/7344), [#8339](https://github.com/google/ExoPlayer/issues/8339)). * Fix a bug that could cause the next content position played after a seek to snap back to the cue point of the preceding ad, rather than the @@ -290,6 +191,91 @@ * Support `setPlaybackSpeed(float)` and disable it by default. Use `MediaSessionConnector.setEnabledPlaybackActions(long)` to enable ([#8229](https://github.com/google/ExoPlayer/issues/8229)). +* Remove deprecated symbols: + * `AdaptiveMediaSourceEventListener`. Use `MediaSourceEventListener` + instead. + * `DashMediaSource.Factory.setMinLoadableRetryCount(int)`. Use + `DashMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` + instead. + * `DefaultAnalyticsListener`. Use `AnalyticsListener` instead. + * `DefaultLoadControl` constructors. Use `DefaultLoadControl.Builder` + instead. + * `DrmInitData.get(UUID)`. Use `DrmInitData.get(int)` and + `DrmInitData.SchemeData.matches(UUID)` instead. + * `ExtractorsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use + `ExtractorsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` + instead. + * `FixedTrackSelection.Factory`. If you need to disable adaptive + selection in `DefaultTrackSelector`, enable the + `DefaultTrackSelector.Parameters.forceHighestSupportedBitrate` flag. + * `HlsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use + `HlsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` + instead. + * `MappedTrackInfo.getTrackFormatSupport(int, int, int)`. Use + `MappedTrackInfo.getTrackSupport(int, int, int)` instead. + * `MappedTrackInfo.getTrackTypeRendererSupport(int)`. Use + `MappedTrackInfo.getTypeSupport(int)` instead. + * `MappedTrackInfo.getUnassociatedTrackGroups()`. Use + `MappedTrackInfo.getUnmappedTrackGroups()` instead. + * `MappedTrackInfo.length`. Use `MappedTrackInfo.getRendererCount()` + instead. + * `Player.DefaultEventListener.onTimelineChanged(Timeline, Object)`. + Use `Player.EventListener.onTimelineChanged(Timeline, int)` instead. + * `Player.setAudioAttributes(AudioAttributes)`. Use + `Player.AudioComponent.setAudioAttributes(AudioAttributes, boolean)` + instead. + * `PlayerView.setDefaultArtwork(Bitmap)`. Use + `PlayerView.setDefaultArtwork(Drawable)` instead. + * `PlayerView.setShowBuffering(boolean)`. Use + `PlayerView.setShowBuffering(int)` instead. + * `SimpleExoPlayer.clearMetadataOutput(MetadataOutput)`. Use + `SimpleExoPlayer.removeMetadataOutput(MetadataOutput)` instead. + * `SimpleExoPlayer.clearTextOutput(TextOutput)`. Use + `SimpleExoPlayer.removeTextOutput(TextOutput)` instead. + * `SimpleExoPlayer.clearVideoListener()`. Use + `SimpleExoPlayer.removeVideoListener(VideoListener)` instead. + * `SimpleExoPlayer.getAudioStreamType()`. Use + `SimpleExoPlayer.getAudioAttributes()` instead. + * `SimpleExoPlayer.setAudioDebugListener(AudioRendererEventListener)`. + Use `SimpleExoPlayer.addAnalyticsListener(AnalyticsListener)` instead. + * `SimpleExoPlayer.setAudioStreamType(int)`. Use + `SimpleExoPlayer.setAudioAttributes(AudioAttributes)` instead. + * `SimpleExoPlayer.setMetadataOutput(MetadataOutput)`. Use + `SimpleExoPlayer.addMetadataOutput(MetadataOutput)` instead. If your + application is calling `SimpleExoPlayer.setMetadataOutput(null)`, make + sure to replace this call with a call to + `SimpleExoPlayer.removeMetadataOutput(MetadataOutput)`. + * `SimpleExoPlayer.setPlaybackParams(PlaybackParams)`. Use + `SimpleExoPlayer.setPlaybackParameters(PlaybackParameters)` instead. + * `SimpleExoPlayer.setTextOutput(TextOutput)`. Use + `SimpleExoPlayer.addTextOutput(TextOutput)` instead. If your + application is calling `SimpleExoPlayer.setTextOutput(null)`, make sure + to replace this call with a call to + `SimpleExoPlayer.removeTextOutput(TextOutput)`. + * `SimpleExoPlayer.setVideoDebugListener(VideoRendererEventListener)`. + Use `SimpleExoPlayer.addAnalyticsListener(AnalyticsListener)` instead. + * `SimpleExoPlayer.setVideoListener(VideoListener)`. Use + `SimpleExoPlayer.addVideoListener(VideoListener)` instead. If your + application is calling `SimpleExoPlayer.setVideoListener(null)`, make + sure to replace this call with a call to + `SimpleExoPlayer.removeVideoListener(VideoListener)`. + * `SimpleExoPlayer.VideoListener`. Use + `com.google.android.exoplayer2.video.VideoListener` instead. + * `SingleSampleMediaSource.EventListener` and constructors. Use + `MediaSourceEventListener` and `SingleSampleMediaSource.Factory` + instead. + * `SimpleExoPlayer.addVideoDebugListener`, + `SimpleExoPlayer.removeVideoDebugListener`, + `SimpleExoPlayer.addAudioDebugListener` and + `SimpleExoPlayer.removeAudioDebugListener`. Use + `SimpleExoPlayer.addAnalyticsListener` and + `SimpleExoPlayer.removeAnalyticsListener` instead. + * `SingleSampleMediaSource.Factory.setMinLoadableRetryCount(int)`. Use + `SingleSampleMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` + instead. + * `SsMediaSource.Factory.setMinLoadableRetryCount(int)`. Use + `SsMediaSource.Factory.setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)` + instead. ### 2.12.3 (2021-01-13) ###