Skip to content

Releases: androidx/media

1.1.1

16 Aug 13:43

Choose a tag to compare

This release corresponds to the ExoPlayer 2.19.1 release.

This release includes the following changes since the 1.1.0 release:

  • Common Library:
    • Remove accidentally added multidex dependency from all modules (#499).
  • ExoPlayer:
    • Fix issue in PlaybackStatsListener where spurious PlaybackStats are created after the playlist is cleared.
    • Add additional fields to Common Media Client Data (CMCD) logging: streaming format (sf), stream type (st), version (v), top birate (tb), object duration (d), measured throughput (mtp) and object type (ot) (#8699).
  • Audio:
    • Fix a bug where Player.getState() never transitioned to STATE_ENDED when playing very short files (#538).
  • Audio Offload:
    • Prepend Ogg ID Header and Comment Header Pages to bitstream for offloaded Opus playback in accordance with RFC 7845.
  • Video:
    • H.265/HEVC: Fix parsing SPS short and long term reference picture info.
  • Text:
    • CEA-608: Change cue truncation logic to only consider visible text. Previously indent and tab offset were included when limiting the cue length to 32 characters (which was technically correct by the spec) (#11019).
  • IMA extension:
    • Bump IMA SDK version to 3.30.3.
  • Session:
    • Add custom layout to the state of the controller and provide a getter to access it. When the custom layout changes, MediaController.Listener.onCustomLayoutChanged is called. Apps that want to send different custom layouts to different Media3 controller can do this in MediaSession.Callback.onConnect by using an AcceptedResultBuilder to make sure the custom layout is available to the controller when connection completes.
    • Fix cases where MediaLibraryServiceLegacyStub sent an error to a Result that didn't support this which produced an UnsupportedOperationException (#78).
    • Fix the way PlayerWrapper creates a VolumeProviderCompat by determining volumeControlType through both legacy commands (COMMAND_ADJUST_DEVICE_VOLUME and COMMAND_SET_DEVICE_VOLUME) and new commands (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS and COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

1.1.0

05 Jul 09:17
5328d64

Choose a tag to compare

This release corresponds to the ExoPlayer 2.19.0 release.

This release contains the following changes since the 1.0.2 release:

  • Common Library:
    • Add suppression reason for unsuitable audio route and play when ready change reason for suppressed too long. (#15).
    • Add commands to Player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Add overloaded methods to Player which allow users to specify volume flags:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Add Builder for DeviceInfo and deprecate existing constructor.
    • Add DeviceInfo.routingControllerId to specify the routing controller ID for remote playbacks.
    • Add Player.replaceMediaItem(s) as a shortcut to adding and removing items at the same position (#8046).
  • ExoPlayer:
    • Allow ExoPlayer to have control of device volume methods only if explicitly opted in. Use ExoPlayer.Builder.setDeviceVolumeControlEnabled to have access to:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) and setDeviceVolume(int, int)
      • increaseDeviceVolume(int) and increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) and decreaseDeviceVolume(int, int)
    • Add FilteringMediaSource that allows to filter available track types from a MediaSource.
    • Add support for including Common Media Client Data (CMCD) in the outgoing requests of adaptive streaming formats DASH, HLS, and SmoothStreaming. The following fields, br, bl, cid, rtp, and sid, have been incorporated (#8699). API structure and API methods:
      • CMCD logging is disabled by default, use MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) to enable it.
      • All keys are enabled by default, override CmcdConfiguration.RequestConfig.isKeyAllowed(String key) to filter out which keys are logged.
      • Override CmcdConfiguration.RequestConfig.getCustomData() to enable custom key logging.
    • Add additional action to manifest of main demo to make it easier to start the demo app with a custom *.exolist.json file (#439).
    • Add ExoPlayer.setVideoEffects() for using Effect during video playback.
    • Update SampleQueue to store sourceId as a long rather than an int. This changes the signatures of public methods SampleQueue.sourceId and SampleQueue.peekSourceId.
    • Add parameters to LoadControl methods shouldStartPlayback and onTracksSelected that allow associating these methods with the relevant MediaPeriod.
    • Change signature of ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) by adding a timeline parameter that contains the periods with the UIDs used as keys in the map. This is required to avoid concurrency issues with multi-period live streams.
    • Deprecate EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) and BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). The variant of the methods without the mediaTimeOffsetUs can be called instead. Note that even for the deprecated variants, the offset is not anymore added to startTimeUs and endTimeUs of the MediaLoadData objects that are dispatched by the dispatcher.
    • Rename ExoTrackSelection.blacklist to excludeTrack and isBlacklisted to isTrackExcluded.
    • Fix inconsistent behavior between ExoPlayer.setMediaItem(s) and addMediaItem(s) when called on an empty playlist.
  • Transformer:
    • Remove Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Use ExoPlayerAssetLoader.Factory(MediaSource.Factory) and Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) instead.
    • Remove Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Fix a bug where transformation could get stuck (leading to muxer timeout) if the end of the video stream was signaled at the moment when an input frame was pending processing.
    • Query codecs via MediaCodecList instead of using findDecoder/EncoderForFormat utilities, to expand support.
    • Remove B-frame configuration in DefaultEncoderFactory because it doesn't work on some devices.
  • Track selection:
    • Add DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange which is disabled by default. When enabled, the DefaultTrackSelector will trigger a new track selection when the renderer capabilities changed.
  • Extractors:
    • Ogg: Fix bug when seeking in files with a long duration (#391).
    • FMP4: Fix issue where TimestampAdjuster initializes a wrong timestamp offset with metadata sample time from emsg atom (#356).
  • Audio:
    • Fix bug where some playbacks fail when tunneling is enabled and AudioProcessors are active, e.g. for gapless trimming (#10847).
    • Encapsulate Opus frames in Ogg packets in direct playbacks (offload).
    • Extrapolate current position during sleep with offload scheduling.
    • Add Renderer.release() and AudioSink.release() for releasing the resources at the end of player's lifecycle.
    • Listen to audio capabilities changes in DefaultAudioSink. Add a required parameter context in the constructor of DefaultAudioSink, with which the DefaultAudioSink will register as the listener to the AudioCapabilitiesReceiver and update its audioCapabilities property when informed with a capabilities change.
    • Propagate audio capabilities changes via a new event onAudioCapabilitiesChanged in AudioSink.Listener interface, and a new interface RendererCapabilities.Listener which triggers onRendererCapabilitiesChanged events.
    • Add ChannelMixingAudioProcessor for applying scaling/mixing to audio channels.
    • Add new int value DISCARD_REASON_AUDIO_BYPASS_POSSIBLE to DecoderDiscardReasons to discard audio decoder when bypass mode is possible after audio capabilities change.
    • Add direct playback support for DTS Express and DTS:X (#335).
  • Video:
    • Make MediaCodecVideoRenderer report a VideoSize with a width and height of 0 when the renderer is disabled. Player.Listener.onVideoSizeChanged is called accordingly when Player.getVideoSize() changes. With this change, ExoPlayer's video size with MediaCodecVideoRenderer has a width and height of 0 when Player.getCurrentTracks does not support video, or the size of the supported video track is not yet determined.
  • DRM:
    • Reduce the visibility of several internal-only methods on DefaultDrmSession that aren't expected to be called from outside the DRM package:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Add a new muxer library which can be used to create an MP4 container file.
  • IMqA extension:
    • Enable multi-period live DASH streams for DAI. Please note that the current implementation does not yet support seeking in live streams (#10912).
    • Fix a bug where a new ad group is inserted in live streams because the calculated content position in consecutive timelines varies slightly.
  • Session:
    • Add helper method MediaSession.getControllerForCurrentRequest to obtain information about the controller that is currently calling aPlayer method.
    • Add androidx.media3.session.MediaButtonReceiver to enable apps to implement playback resumption with media button events sent by, for example, a Bluetooth headset (#167).
    • Add default implementation to MediaSession.Callback.onAddMediaItems to allow requested MediaItems to be passed onto Player if they have LocalConfiguration (e.g. URI) (#282).
    • Add "seek to previous" and "seek to next" command buttons on compact media notification view by default for Android 12 and below (#410).
  • UI:
    • Add Util methods shouldShowPlayButton and handlePlayPauseButtonAction to write custom UI elements with a play/pause button.
  • RTSP Extension:
    • For MPEG4-LATM, use default profile-level-id value if absent in Describe Response SDP message (#302).
    • Use base Uri for relative path resolution from the RTSP session if present in DESCRIBE response header (#11160).
  • DASH Extension:
    • Remove the media time offset from MediaLoadData.startTimeMs and MediaLoadData.endTimeMs for multi period DASH streams.
    • Fix a bug where re-preparing a multi-period live Dash media source produced a IndexOutOfBoundsException (#10838).
  • HLS Extension:
    • Add HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) to set a timeout for the loading thread to wait for the TimestampAdjuster to initialize. If the initialization doesn't complete before the timeout, a PlaybackException is thro...
Read more

1.1.0-rc01

21 Jun 08:54

Choose a tag to compare

This release includes the following changes since 1.1.0-beta01:

  • ExoPlayer:
    • Add support for including Common Media Client Data (CMCD) in the outgoing requests of adaptive streaming formats DASH, HLS, and SmoothStreaming. The following fields, br, bl, cid, rtp, and sid, have been incorporated (#8699). API structure and API methods:
      • CMCD logging is disabled by default, use MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) to enable it.
      • All keys are enabled by default, override CmcdConfiguration.RequestConfig.isKeyAllowed(String key) to filter out which keys are logged.
      • Override CmcdConfiguration.RequestConfig.getCustomData() to enable custom key logging.
    • Add additional action to manifest of main demo to make it easier to start the demo app with a custom *.exolist.json file (#439).
  • Extractors:
    • FMP4: Fix issue where TimestampAdjuster initializes a wrong timestamp offset with metadata sample time from emsg atom (#356).

1.1.0-beta01

07 Jun 09:38

Choose a tag to compare

1.1.0-beta01 Pre-release
Pre-release
  • Common Library:
    • Add Player.replaceMediaItem(s) as a shortcut to adding and removing items at the same position (#8046).
  • ExoPlayer:
    • Add FilteringMediaSource that allows to filter available track types from a MediaSource.
    • Allow ExoPlayer to have control of device volume methods only if
      explicitly opted in. Use
      ExoPlayer.Builder.setDeviceVolumeControlEnabled to have access to:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) and setDeviceVolume(int, int)
      • increaseDeviceVolume(int) and increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) and decreaseDeviceVolume(int, int)
  • Extractors:
    • Ogg: Fix bug when seeking in files with a long duration (#391).
  • Audio:
    • Add direct playback support for DTS Express and DTS:X (#335).
  • Video:
    • Make MediaCodecVideoRenderer report a VideoSize with a width and height of 0 when the renderer is disabled. Player.Listener.onVideoSizeChanged is called accordingly when Player.getVideoSize() changes. With this change, ExoPlayer's video size with MediaCodecVideoRenderer has a width and height of 0 when Player.getCurrentTracks does not support video, or the size of the supported video track is not yet determined.
  • IMA extension:
    • Enable multi-period live DASH streams for DAI. Please note that the current implementation does not yet support seeking in live streams (#10912).
  • Session:
    • Add androidx.media3.session.MediaButtonReceiver to enable apps to implement playback resumption with media button events sent by, for example, a Bluetooth headset (#167).
  • RTSP Extension:
    • Use base Uri for relative path resolution from the RTSP session if present in DESCRIBE response header (#11160).
  • Remove deprecated symbols:
    • Remove two deprecated SimpleCache constructors, use a non-deprecated constructor that takes a DatabaseProvider instead for better performance.
    • Remove DefaultBandwidthMeter constructor, use DefaultBandwidthMeter.Builder instead.
    • Remove DefaultDrmSessionManager constructors, use DefaultDrmSessionManager.Builder instead.
    • Remove two deprecated HttpDataSource.InvalidResponseCodeException constructors, use a non-deprecated constructor that accepts additional fields(cause, responseBody) to enhance error logging.
    • Remove DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash, and DownloadHelper.forSmoothStreaming, use DownloadHelper.forMediaItem instead.
    • Remove deprecated DownloadService constructor, use a non deprecated constructor that includes the option to provide a channelDescriptionResourceId parameter.
    • Remove deprecated String constants for Charsets (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME and UTF16LE_NAME), use Kotlin Charsets from the kotlin.text package, the java.nio.charset.StandardCharsets or the com.google.common.base.Charsets instead.
    • Remove deprecated WorkManagerScheduler constructor, use a non deprecated constructor that includes the option to provide a Context parameter instead.
    • Remove the deprecated methods createVideoSampleFormat, createAudioSampleFormat, createContainerFormat, and createSampleFormat, which were used to instantiate the Format class. Instead use Format.Builder for creating instances of Format.
    • Remove the deprecated methods copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate and copyWithVideoSize, use Format.buildUpon() and setter methods instead.
    • Remove deprecated ExoPlayer.retry(), use prepare() instead.
    • Remove deprecated zero-arg DefaultTrackSelector constructor, use DefaultTrackSelector(Context) instead.
    • Remove deprecated OfflineLicenseHelper constructor, use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) instead.
    • Remove deprecated DownloadManager constructor, use the constructor that takes an Executor instead.
    • Remove deprecated Cue constructors, use Cue.Builder instead.
    • Remove deprecated OfflineLicenseHelper constructor, use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher) instead.
    • Remove four deprecated AnalyticsListener methods:
      • onDecoderEnabled, use onAudioEnabled and/or onVideoEnabled instead.
      • onDecoderInitialized, use onAudioDecoderInitialized and/or onVideoDecoderInitialized instead.
      • onDecoderInputFormatChanged, use onAudioInputFormatChanged and/or onVideoInputFormatChanged instead.
      • onDecoderDisabled, use onAudioDisabled and/or onVideoDisabled instead.
    • Remove the deprecated Player.Listener.onSeekProcessed and AnalyticsListener.onSeekProcessed, use onPositionDiscontinuity with DISCONTINUITY_REASON_SEEK instead.
    • Remove ExoPlayer.setHandleWakeLock(boolean), use setWakeMode(int) instead.
    • Remove deprecated DefaultLoadControl.Builder.createDefaultLoadControl(), use build() instead.

1.0.2

17 May 16:31
2fc189d

Choose a tag to compare

This release corresponds to the ExoPlayer 2.18.7 release.

This release contains the following changes since the 1.0.1 release:

  • Core library:
    • Add Buffer.isLastSample() that denotes if Buffer contains flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Fix issue where last frame may not be rendered if the last sample with frames is dequeued without reading the 'end of stream' sample. (#11079).
  • Extractors:
    • Fix parsing of H.265 SPS in MPEG-TS files by re-using the parsing logic already used by RTSP and MP4 extractors (#303).
  • Text:
    • SSA: Add support for UTF-16 files if they start with a byte order mark (#319).
  • Session:
    • Fix issue where MediaController doesn't update its available commands when connected to a legacy MediaSessionCompat that updates its actions.
    • Fix bug that prevented the MediaLibraryService from returning null for a call from System UI to Callback.onGetLibraryRoot with params.isRecent == true on API 30 (#355).
    • Fix memory leak of MediaSessionService or MediaLibraryService (#346).
    • Fix bug where a combined Timeline and position update in a MediaSession may cause a MediaController to throw an IllegalStateException.

1.1.0-alpha01

10 May 19:42

Choose a tag to compare

1.1.0-alpha01 Pre-release
Pre-release
  • Core library:
    • Add suppression reason for unsuitable audio route and play when ready change reason for suppressed too long. (#15).
    • Add ExoPlayer.setVideoEffects() for using Effect during video playback.
    • Update SampleQueue to store sourceId as a long rather than an int. This changes the signatures of public methods SampleQueue.sourceId and SampleQueue.peekSourceId.
    • Add parameters to LoadControl methods shouldStartPlayback and onTracksSelected that allow associating these methods with the relevant MediaPeriod.
    • Change signature of ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) by adding a timeline parameter that contains the periods with the UIDs used as keys in the map. This is required to avoid concurrency issues with multi-period live streams.
    • Deprecate EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) and BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). The variant of the methods without the mediaTimeOffsetUs can be called instead. Note that even for the deprecated variants, the offset is not anymore added to startTimeUs and endTimeUs of the MediaLoadData objects that are dispatched by the dispatcher.
    • Rename ExoTrackSelection.blacklist to excludeTrack and isBlacklisted to isTrackExcluded.
    • Deprecate Player.COMMAND_GET_MEDIA_ITEMS_METADATA and COMMAND_SET_MEDIA_ITEMS_METADATA. Use COMMAND_GET_METADATA and COMMAND_SET_PLAYLIST_METADATA instead.
    • Add Buffer.isLastSample() that denotes if Buffer contains flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Fix issue where last frame may not be rendered if the last sample with frames is dequeued without reading the 'end of stream' sample. (#11079).
    • Add Builder for DeviceInfo and deprecate existing constructor.
    • Add DeviceInfo.routingControllerId to specify the routing controller ID for remote playbacks.
    • Fix inconsistent behavior between ExoPlayer.setMediaItem(s) and addMediaItem(s) when called on an empty playlist.
  • Extractors:
    • Fix parsing of H.265 SPS in MPEG-TS files by re-using the parsing logic already used by RTSP and MP4 extractors (#303).
  • Session:
    • Deprecate 4 volume-controlling methods in Player and add overloaded methods which allow users to specify volume flags:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Fix issue where MediaController doesn't update its available commands when connected to a legacy MediaSessionCompat that updates its actions.
    • Add helper method MediaSession.getControllerForCurrentRequest to obtain information about the controller that is currently calling aPlayer method.
    • Fix bug that prevented the MediaLibraryService from returning null for a call from System UI to Callback.onGetLibraryRoot with params.isRecent == true on API 30 (#355).
    • Fix memory leak of MediaSessionService or MediaLibraryService (#346).
  • UI:
    • Add Util methods shouldShowPlayButton and handlePlayPauseButtonAction to write custom UI elements with a play/pause button.
  • Track selection:
    • Add DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange which is disabled by default. When enabled, the DefaultTrackSelector will trigger a new track selection when the renderer capabilities changed.
  • Audio:
    • Fix bug where some playbacks fail when tunneling is enabled and AudioProcessors are active, e.g. for gapless trimming (#10847).
    • Encapsulate Opus frames in Ogg packets in direct playbacks (offload).
    • Extrapolate current position during sleep with offload scheduling.
    • Add Renderer.release() and AudioSink.release() for releasing the resources at the end of player's lifecycle.
    • Listen to audio capabilities changes in DefaultAudioSink. Add a required parameter context in the constructor of DefaultAudioSink, with which the DefaultAudioSink will register as the listener to the AudioCapabilitiesReceiver and update its audioCapabilities property when informed with a capabilities change.
    • Propagate audio capabilities changes via a new event onAudioCapabilitiesChanged in AudioSink.Listener interface, and a new interface RendererCapabilities.Listener which triggers onRendererCapabilitiesChanged events.
    • Add ChannelMixingAudioProcessor for applying scaling/mixing to audio channels.
    • Add new int value DISCARD_REASON_AUDIO_BYPASS_POSSIBLE to DecoderDiscardReasons to discard audio decoder when bypass mode is possible after audio capabilities change.
  • Metadata:
    • Deprecate MediaMetadata.folderType in favor of isBrowsable and mediaType.
  • DRM:
    • Reduce the visibility of several internal-only methods on DefaultDrmSession that aren't expected to be called from outside the DRM package:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Transformer:
    • Remove Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Use ExoPlayerAssetLoader.Factory(MediaSource.Factory) and Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory) instead.
    • Remove Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Fix a bug where transformation could get stuck (leading to muxer timeout) if the end of the video stream was signaled at the moment when an input frame was pending processing.
    • Query codecs via MediaCodecList instead of using findDecoder/EncoderForFormat utilities, to expand support.
    • Remove B-frame configuration in DefaultEncoderFactory because it doesn't work on some devices.
  • Muxer:
    • Add a new muxer library which can be used to create an MP4 container file.
  • DASH:
    • Remove the media time offset from MediaLoadData.startTimeMs and MediaLoadData.endTimeMs for multi period DASH streams.
  • RTSP:
    • For MPEG4-LATM, use default profile-level-id value if absent in Describe Response SDP message (#302).
  • IMA DAI extension:
  • Text:
    • Fix a bug where a new ad group is inserted in live streams because the calculated content position in consecutive timelines varies slightly.
    • SSA: Add support for UTF-16 files if they start with a byte order mark (#319).
  • Test Utilities:
    • Check for URI scheme case insensitivity in DataSourceContractTest.
  • Remove deprecated symbols:
    • Remove DefaultAudioSink constructors, use DefaultAudioSink.Builder instead.
    • Remove HlsMasterPlaylist, use HlsMultivariantPlaylist instead.
    • Remove Player.stop(boolean). Use Player.stop() and Player.clearMediaItems() (if reset is true) instead.

1.0.1

19 Apr 17:30
3c01488

Choose a tag to compare

This release corresponds to the ExoPlayer 2.18.6 release.

  • Core library:
    • Reset target live stream override when seeking to default position (#11051).
    • Fix bug where empty sample streams in the media could cause playback to be stuck.
  • Session:
    • Fix bug where multiple identical queue items published by a legacy MediaSessionCompat result in an exception in MediaController (#290).
    • Add missing forwarding of MediaSession.broadcastCustomCommand to the legacy MediaControllerCompat.Callback.onSessionEvent (#293).
    • Fix bug where calling MediaSession.setPlayer doesn't update the available commands.
    • Fix issue that TrackSelectionOverride instances sent from a MediaController are ignored if they reference a group with Format.metadata (#296).
    • Fix issue where Player.COMMAND_GET_CURRENT_MEDIA_ITEM needs to be available to access metadata via the legacy MediaSessionCompat.
    • Fix issue where MediaSession instances on a background thread cause crashes when used in MediaSessionService (#318).
    • Fix issue where a media button receiver was declared by the library without the app having intended this (#314).
  • DASH:
    • Fix handling of empty segment timelines (#11014).
  • RTSP:
    • Retry with TCP if RTSP Setup with UDP fails with RTSP Error 461 UnsupportedTransport (#11069).

1.0.0

22 Mar 09:52
95f9e8f

Choose a tag to compare

This release corresponds to the ExoPlayer 2.18.5 release.

There are no changes since 1.0.0-rc02.

1.0.0-rc02

06 Mar 11:56
1ef427f

Choose a tag to compare

This release corresponds to the ExoPlayer 2.18.4 release.

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

1.0.0-rc01

16 Feb 17:14
f17e846

Choose a tag to compare

  • Core library:
    • Tweak the renderer's decoder ordering logic to uphold the MediaCodecSelector's preferences, even if a decoder reports it may not be able to play the media performantly. For example with default selector, hardware decoder with only functional support will be
      preferred over software decoder that fully supports the format (#10604).
    • Add ExoPlayer.Builder.setPlaybackLooper that sets a pre-existing playback thread for a new ExoPlayer instance.
    • Allow download manager helpers to be cleared (#10776).
    • Add parameter to BasePlayer.seekTo to also indicate the command used for seeking.
    • Use theme when loading drawables on API 21+ (#220).
    • Add ConcatenatingMediaSource2 that allows combining multiple media items into a single window (#247).
  • Extractors:
    • Throw a ParserException instead of a NullPointerException if the sample table (stbl) is missing a required sample description (stsd) when parsing trak atoms.
    • Correctly skip samples when seeking directly to a sync frame in fMP4 (#10941).
  • Audio:
    • Use the compressed audio format bitrate to calculate the min buffer size for AudioTrack in direct playbacks (passthrough).
  • Text:
    • Fix TextRenderer passing an invalid (negative) index to Subtitle.getEventTime if a subtitle file contains no cues.
    • SubRip: Add support for UTF-16 files if they start with a byte order mark.
  • Metadata:
    • Parse multiple null-separated values from ID3 frames, as permitted by ID3 v2.4.
    • Add MediaMetadata.mediaType to denote the type of content or the type of folder described by the metadata.
    • Add MediaMetadata.isBrowsable as a replacement for MediaMetadata.folderType. The folder type will be deprecated in the next release.
  • DASH:
    • Add full parsing for image adaptation sets, including tile counts (#3752).
  • UI:
    • Fix the deprecated PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) to ensure visibility changes are passed to the registered listener (#229).
    • Fix the ordering of the center player controls in PlayerView when using a right-to-left (RTL) layout (#227).
  • Session:
    • Add abstract SimpleBasePlayer to help implement the Player interface for custom players.
    • Add helper method to convert platform session token to Media3SessionToken (#171).
    • Use onMediaMetadataChanged to trigger updates of the platform media session (#219).
    • Add the media session as an argument of getMediaButtons() of theDefaultMediaNotificationProvider and use immutable lists for clarity (#216).
    • Add onSetMediaItems callback listener to provide means to modify/set MediaItem list, starting index and position by session before setting onto Player (#156).
    • Avoid double tap detection for non-Bluetooth media button events (#233).
    • Make QueueTimeline more robust in case of a shady legacy session state (#241).
  • Metadata:
    • Parse multiple null-separated values from ID3 frames, as permitted by ID3 v2.4.
    • Add MediaMetadata.mediaType to denote the type of content or the type of folder described by the metadata.
    • Add MediaMetadata.isBrowsable as a replacement for MediaMetadata.folderType. The folder type will be deprecated in the next release.
  • Cast extension:
    • Bump Cast SDK version to 21.2.0.
  • IMA extension:
    • Remove player listener of the ImaServerSideAdInsertionMediaSource on the application thread to avoid threading issues.
    • Add a property focusSkipButtonWhenAvailable to the ImaServerSideAdInsertionMediaSource.AdsLoader.Builder to request focusing the skip button on TV devices and set it to true by default.
    • Add a method focusSkipButton() to the ImaServerSideAdInsertionMediaSource.AdsLoader to programmatically request to focus the skip button.
    • Bump IMA SDK version to 3.29.0.
  • Demo app:
    • Request notification permission for download notifications at runtime (#10884).