This release includes the following changes since 1.1.1 release:
- Common Library:
- Add a
@Nullable Throwableparameter to the methods in theLog.Loggerinterface. Themessageparameter to these methods no longer contains any information about theThrowablepassed to theLog.{d,i,w,e}()methods, so implementations will need to manually append this information if desired (possibly usingLogger.appendThrowableString(String, Throwable)). - Fix Kotlin compatibility issue where nullable generic type parameters and nullable array element types are not detected as nullable. Examples are
TrackSelectorResultandSimpleDecodermethod parameters (#6792). - Change default UI and notification behavior in
Util.shouldShowPlayButtonto show a "play" button while playback is temporarily suppressed (e.g. due to transient audio focus loss). The legacy behavior can be maintained by usingPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)orMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)(#11213).
- Add a
- ExoPlayer:
- Fix seeking issues in AC4 streams caused by not identifying decode-only samples correctly (#11000).
- Add suppression of playback on unsuitable audio output devices (e.g. the built-in speaker on Wear OS devices) when this feature is enabled via
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. The playback suppression reason will be updated asPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUTif playback is attempted when no suitable audio outputs are available, or if all suitable outputs are disconnected during playback. The suppression reason will be removed when a suitable output is connected. - Add
MediaSource.canUpdateMediaItemandMediaSource.updateMediaItemto acceptMediaItemupdates after creation viaPlayer.replaceMediaItem(s). - Allow
MediaItemupdates for allMediaSourceclasses provided by the library viaPlayer.replaceMediaItem(s)((#33),(#9978)). - Rename
MimeTypes.TEXT_EXOPLAYER_CUEStoMimeTypes.APPLICATION_MEDIA3_CUES. - Add
PngExtractorthat sends and reads a whole PNG file into theTrackOutputas one sample. - Enhance
SequenceableLoader.continueLoading(long)method in theSequenceableLoaderinterface toSequenceableLoader.continueLoading(LoadingInfo loadingInfo).LoadingInfocontains additional parameters, includingplaybackSpeedandlastRebufferRealtimeMsin addition to the existingplaybackPositionUs. - Enhance
ChunkSource.getNextChunk(long, long, List, ChunkHolder)method in theChunkSourceinterface toChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder). - Add additional fields to Common Media Client Data (CMCD) logging: buffer starvation (
bs), deadline (dl), playback rate (pr) and startup (su) (#8699).
- Transformer:
- Parse EXIF rotation data for image inputs.
- Remove
TransformationRequest.HdrModeannotation type and its associated constants. UseComposition.HdrModeand its associated constants instead. - Simplify the
OverlaySettingsto fix rotation issues.
- Extractors:
- MPEG-TS: Ensure the last frame is rendered by passing the last access unit of a stream to the sample queue (#7909).
- Fix typo when determining
rotationDegrees. ChangedprojectionPosePitchtoprojectionPoseRoll(#461). - Remove the assumption that
Extractorinstances can be directly inspected withinstanceof. If you want runtime access to the implementation details of anExtractoryou must first callExtractor.getUnderlyingInstance.
- Audio:
- Add support for 24/32-bit big-endian PCM in MP4 and Matroska, and parse PCM encoding for
lpcmin MP4. - Add support for extracting Vorbis audio in MP4.
- Add support for 24/32-bit big-endian PCM in MP4 and Matroska, and parse PCM encoding for
- Audio Offload:
- Add
AudioSink.getFormatOffloadSupport(Format)that retrieves level of offload support the sink can provide for the format through aDefaultAudioOffloadSupportProvider. It returns the newAudioOffloadSupportthat containsisFormatSupported,isGaplessSupported, andisSpeedChangeSupported. - Add
AudioSink.setOffloadMode()through which the offload configuration on the audio sink is configured. Default isAudioSink.OFFLOAD_MODE_DISABLED. - Offload can be enabled through
setAudioOffloadPreferenceinTrackSelectionParameters. If the set preference is to enable, the device supports offload for the format, and the track selection is a single audio track, then audio offload will be enabled. - If
audioOffloadModePreferenceis set toAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, then theDefaultTrackSelectorwill only select an audio track and only if that track's format is supported in offload. If no audio track is supported in offload, then no track will be selected. - Disabling gapless support for offload when pre-API level 33 due to playback position issue after track transition.
- Remove parameter
enableOffloadfromDefaultRenderersFactory.buildAudioSinkmethod signature. - Remove method
DefaultAudioSink.Builder.setOffloadMode. - Remove intdef value
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
- Add
- Video:
- Allow
MediaCodecVideoRendererto use a customVideoFrameProcessor.Factory. - Fix bug where the first frame couldn't be rendered if the audio stream starts with negative timestamps (#291).
- Allow
- Effect:
- Add
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)queuing bitmap input by timestamp.
- Add
- UI:
- Add a
Player.Listenerimplementation for Wear OS devices that handles playback suppression due toPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUTby launching a system dialog to allow a user to connect a suitable audio output (e.g. bluetooth headphones). The listener will auto-resume playback if a suitable device is connected within a configurable timeout (default is 5 minutes).
- Add a
- Downloads:
- Declare "data sync" foreground service type for
DownloadServicefor Android 14 compatibility. When using this service, the app also needs to adddataSyncasforegroundServiceTypein the manifest and add theFOREGROUND_SERVICE_DATA_SYNCpermission (#11239).
- Declare "data sync" foreground service type for
- MIDI extension:
- Release the MIDI decoder module, which provides support for playback of standard MIDI files using the Jsyn library to synthesize audio.
- Test Utilities:
- Make
TestExoPlayerBuilderandFakeClockcompatible with Espresso UI tests and Compose UI tests. This fixes a bug where playback advances non-deterministically during Espresso or Compose view interactions.
- Make
- Remove deprecated symbols:
- Remove
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)andTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). UseComposition.Builder.setHdrMode(int)and pass theCompositiontoTransformer.start(Composition, String)instead.
- Remove