Skip to content

Releases: androidx/media

1.3.0-rc01

22 Feb 13:12
Compare
Choose a tag to compare

This release includes the following changes since the 1.3.0-beta01 release:

  • ExoPlayer:
    • Add source prefix to all Format.id fields generated from MergingMediaSource. This helps to identify which source produced a Format (#883).
    • Fix the regex used for validating custom Common Media Client Data (CMCD) key names by modifying it to only check for hyphen (#1028).
    • Stop double-encoding CMCD query parameters (#1075).
  • Audio:
    • Improve silence skipping algorithm with smooth volume ramp; retained minimal silence and more natural silence durations (#7423).
    • Report the skipped silence more deterministically (#1035).
  • Session:
    • Fix issue where MediaItem.RequestMetadata with just non-null extras is not transmitted between media controllers and sessions.
    • Add constructor to MediaLibrarySession.Builder that only takes a Context instead of a MediaLibraryService.
  • HLS Extension:
    • Resolve seeks to beginning of a segment more efficiently (#1031).

1.3.0-beta01

09 Feb 11:18
Compare
Choose a tag to compare
1.3.0-beta01 Pre-release
Pre-release

This release includes the following changes since the 1.3.0-alpha01 release:

  • Common Library:
    • Populate both artworkUri and artworkData in MediaMetadata.Builder.populate(MediaMetadata) when at least one of them is non-null (#964).
  • ExoPlayer:
    • Prevent subclassing CompositeSequenceableLoader. This component was previously made extensible but was never subclassed within the library. Customizations can be done by wrapping an instance using the decorator pattern and implementing a custom CompositeSequenceableLoaderFactory.
    • Fix issue where repeating the same time causes metadata from this item to be cleared (#1007).
    • Rename experimentalSetSubtitleParserFactory methods on BundledChunkExtractor.Factory and DefaultHlsExtractorFactory to setSubtitleParserFactory and disallow passing null. Use the new experimentalParseSubtitlesDuringExtraction(boolean) methods to control parsing behaviour.
    • Add support for customising the SubtitleParser.Factory used during extraction. This can be achieved with MediaSource.Factory.setSubtitleParserFactory().
  • Extractors:
    • MP3: Use constant bitrate (CBR) seeking for files with an Info header (the CBR equivalent of the Xing header). Previously we used the seek table from the Info header, but this results in less precise seeking than if we ignore it and assume the file is CBR.
    • MPEG2-TS: Add DTS, DTS-LBR and DTS:X Profile2 support (#275).
    • Extract audio types from TS descriptors and map them to role flags, allowing users to make better-informed audio track selections (#973).
  • Image:
    • Add support for DASH thumbnails. Grid images are cropped and individual thumbnails are provided to ImageOutput close to their presentation times.
  • Session:
    • Disable double-click detection for TV apps (#962).

1.3.0-alpha01

19 Jan 14:57
Compare
Choose a tag to compare
1.3.0-alpha01 Pre-release
Pre-release

This release includes the following changes since the 1.2.1 release:

  • Common Library:
    • Implement support for android.resource://package/[type/]name raw resource URIs where package is different to the package of the current application. This has always been documented to work, but wasn't correctly implemented until now.
    • Normalize MIME types set by app code or read from media to be fully lower-case.
    • Define ads with a full MediaItem instead of a single Uri in AdPlaybackState.
    • Increase minSdk to 19 (Android KitKat). This is aligned with all other AndroidX libraries, and is required for us to upgrade to the latest versions of our AndroidX dependencies.
  • ExoPlayer:
    • Add PreloadMediaSource and PreloadMediaPeriod that allows apps to preload a content media source at a specific start position before playback. PreloadMediaSource takes care of preparing the content media source to receive the Timeline, preparing and caching the period at the given start position, selecting tracks and loading media data for the period. Apps control the preload progress by implementing PreloadMediaSource.PreloadControl and set the preloaded source to the player for playback.
    • Add ExoPlayer.setImageOutput that allows apps to set ImageRenderer.ImageOutput.
    • DefaultRenderersFactory now provides an ImageRenderer to the player by default with null ImageOutput and ImageDecoder.Factory.DEFAULT.
    • Emit Player.Listener.onPositionDiscontinuity event when silence is skipped (#765).
    • Add experimental support for parsing subtitles during extraction. You can enable this using MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Support adaptive media sources with PreloadMediaSource.
    • Implement HttpEngineDataSource, an HttpDataSource using the HttpEngine API.
  • Transformer:
    • Add support for flattening H.265/HEVC SEF slow motion videos.
    • Increase transmuxing speed, especially for 'remove video' edits.
    • Add API to ensure that the output file starts on a video frame. This can make the output of trimming operations more compatible with player implementations that don't show the first video frame until its presentation timestamp (#829).
  • Track Selection:
    • Add DefaultTrackSelector.selectImageTrack to enable image track selection.
    • Add TrackSelectionParameters.isPrioritizeImageOverVideoEnabled to determine whether to select an image track if both an image track and a video track are available. The default value is false which means selecting a video track is prioritized.
  • Extractors:
    • Add additional AV1C parsing to MP4 extractor to retrieve ColorInfo.colorSpace, ColorInfo.colorTransfer, and ColorInfo.colorRange values (#692).
  • Video:
    • Change the MediaCodecVideoRenderer constructor that takes a VideoFrameProcessor.Factory argument and replace it with a constructor that takes a VideoSinkProvider argument. Apps that want to inject a custom VideoFrameProcessor.Factory can instantiate a CompositingVideoSinkProvider that uses the custom VideoFrameProcessor.Factory and pass the video sink provider to MediaCodecVideoRenderer.
  • Text:
    • Fix serialization of bitmap cues to resolve Tried to marshall a Parcel that contained Binder objects error when using DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: Ignore rowLock value. The CEA-708-E S-2023 spec states that rowLock and columnLock should both be assumed to be true, regardless of the values present in the stream (columnLock support is not implemented, so it's effectively assumed to always be false).
  • DRM:
  • IMA extension:
    • Fix issue where DASH and HLS ads without the appropriate file extension can't be played.
  • HLS Extension:
    • Reduce HlsMediaPeriod to package-private visibility. This type shouldn't be directly depended on from outside the HLS package.
  • Decoder Extensions (FFmpeg, VP9, AV1, MIDI, etc.):
    • MIDI decoder: Ignore SysEx event messages (#710).
  • Test Utilities:
    • Don't pause playback in TestPlayerRunHelper.playUntilPosition. The test keeps the playback in a playing state, but suspends progress until the test is able to add assertions and further actions.
  • Demo app:
    • Add a shortform demo module to demo the usage of PreloadMediaSource with the short-form content use case.

1.2.1

16 Jan 16:44
b930b40
Compare
Choose a tag to compare

This release includes the following changes since the 1.2.0 release:

  • ExoPlayer:
    • Fix issue where manual seeks outside of the LiveConfiguration.min/maxOffset range keep adjusting the offset back to min/maxOffset.
    • Fix issue that OPUS and VORBIS channel layouts are wrong for 3, 5, 6, 7 and 8 channels (#8396).
    • Fix issue where track selections after seek to zero in a live stream incorrectly let the stream start at its default position (#9347).
    • Fix the issue where new instances of CmcdData.Factory were receiving negative values for bufferedDurationUs from chunk sources, resulting in an IllegalArgumentException (#888).
  • Transformer:
    • Work around an issue where the encoder would throw at configuration time due to setting a high operating rate.
  • Extractors:
    • Mark secondary (unplayable) HEVC tracks in JPEG motion photos as ROLE_FLAG_ALTERNATE to prevent them being automatically selected for playback because of their higher resolution.
    • Fix wrong keyframe detection for TS H264 streams (#864).
    • Fix duration estimation of TS streams that are longer than 47721 seconds (#855).
  • Audio:
    • Fix handling of EOS for SilenceSkippingAudioProcessor when called multiple times (#712).
  • Video:
    • Add workaround for a device issue on Galaxy Tab S7 FE, Chromecast with Google TV, and Lenovo M10 FHD Plus that causes 60fps AVC streams to be marked as unsupported (#693).
  • Metadata:
    • Fix bug where MediaMetadata was only populated from Vorbis comments (#876).
    • Catch OutOfMemoryError when parsing very large ID3 frames, meaning playback can continue without the tag info instead of playback failing completely.
  • DRM:
    • Extend workaround for spurious ClearKey https://default.url license URL to API 33+ (previously the workaround only applied on API 33 exactly) (#837).
    • Fix ERROR_DRM_SESSION_NOT_OPENED when switching from encrypted to clear content without a surface attached to the player. The error was due to incorrectly using a secure decoder to play the clear content.
  • Session:
    • Put the custom keys and values in MediaMetadataCompat to MediaMetadata.extras and MediaMetadata.extras to
      MediaMetadataCompat (#756, #802).
    • Fix broadcasting notifyChildrenChanged for legacy controllers (#644).
    • Fix a bug where setting a negative time for a disabled setWhen timer of the notification caused a crash on some devices (#903).
    • Fix IllegalStateException when the media notification controller hasn't completed connecting when the first notification update is requested (#917).
  • UI:
    • Fix issue where forward and rewind buttons are not visible when used with Material Design in a BottomSheetDialogFragment (#511).
    • Fix issue where the numbers in the fast forward button of the PlayerControlView were misaligned (#547).
  • DASH Extension:
    • Parse "f800" as channel count of 5 for Dolby in DASH manifest (#688).
  • Decoder Extensions (FFmpeg, VP9, AV1, MIDI, etc.):
    • MIDI: Fix issue where seeking forward skips the Program Change events (#704).
    • Migrate to FFmpeg 6.0 and update supported NDK to r26b (#707, #867).
  • Cast Extension:
    • Sanitize creation of a Timeline to not crash the app when loading media fails on the cast device (#708).

1.2.0

17 Nov 16:21
Compare
Choose a tag to compare

This release includes the following changes since the 1.1.1 release:

  • Common Library:
    • Add a @Nullable Throwable parameter to the methods in the Log.Logger interface. The message parameter to these methods no longer contains any information about the Throwable passed to the Log.{d,i,w,e}() methods, so implementations will need to manually append this information if desired (possibly using Logger.appendThrowableString(String, Throwable)).
    • Fix Kotlin compatibility issue where nullable generic type parameters and nullable array element types are not detected as nullable. Examples are TrackSelectorResult and SimpleDecoder method parameters (#6792).
    • Change default UI and notification behavior in Util.shouldShowPlayButton to show a "play" button while playback is temporarily suppressed (e.g. due to transient audio focus loss). The legacy behavior can be maintained by using PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) or MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Upgrade androidx.annotation:annotation-experimental to 1.3.1 to fix https://issuetracker.google.com/251172715.
    • Move ExoPlayer.setAudioAttributes to the Player interface.
  • 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 as Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT if 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.canUpdateMediaItem and MediaSource.updateMediaItem to accept MediaItem updates after creation via Player.replaceMediaItem(s).
    • Allow MediaItem updates for all MediaSource classes provided by the library via Player.replaceMediaItem(s) (#33, #9978).
    • Rename MimeTypes.TEXT_EXOPLAYER_CUES to MimeTypes.APPLICATION_MEDIA3_CUES.
    • Add PngExtractor that sends and reads a whole PNG file into the TrackOutput as one sample.
    • Enhance SequenceableLoader.continueLoading(long) method in the SequenceableLoader interface to SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo contains additional parameters, including playbackSpeed and lastRebufferRealtimeMs in addition to the existing playbackPositionUs.
    • Enhance ChunkSource.getNextChunk(long, long, List, ChunkHolder) method in the ChunkSource interface to ChunkSource.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).
    • Add luma and chroma bitdepth to ColorInfo (#491).
    • Add additional fields to Common Media Client Data (CMCD) logging: next object request (nor) and next range request (nrr) (#8699).
    • Add functionality to transmit Common Media Client Data (CMCD) data using query parameters (#553).
    • Fix ConcurrentModificationException in ExperimentalBandwidthMeter (#612).
    • Add MediaPeriodId parameter to CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Support ClippingMediaSource (and other sources with period/window time offsets) in ConcatenatingMediaSource2 (#11226).
    • Change BaseRenderer.onStreamChanged() to also receive a MediaPeriodId argument.
  • Transformer:
    • Parse EXIF rotation data for image inputs.
    • Remove TransformationRequest.HdrMode annotation type and its associated constants. Use Composition.HdrMode and its associated constants instead.
    • Simplify the OverlaySettings to fix rotation issues.
    • Changed frameRate and durationUs parameters of SampleConsumer.queueInputBitmap to TimestampIterator.
  • Track Selection:
    • Add DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness to explicitly allow or disallow non-seamless adaptation. The default stays at its current behavior of true.
  • 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. Changed projectionPosePitch to projectionPoseRoll (#461).
    • Remove the assumption that Extractor instances can be directly inspected with instanceof. If you want runtime access to the implementation details of an Extractor you must first call Extractor.getUnderlyingInstance.
    • Add BmpExtractor.
    • Add WebpExtractor.
    • Add HeifExtractor.
    • Add QuickTime classic support to Mp4Extractor.
  • Audio:
    • Add support for 24/32-bit big-endian PCM in MP4 and Matroska, and parse PCM encoding for lpcm in MP4.
    • Add support for extracting Vorbis audio in MP4.
    • Add AudioSink.getFormatOffloadSupport(Format) that retrieves level of offload support the sink can provide for the format through a DefaultAudioOffloadSupportProvider. It returns the new AudioOffloadSupport that contains isFormatSupported, isGaplessSupported, and isSpeedChangeSupported.
    • Add AudioSink.setOffloadMode() through which the offload configuration on the audio sink is configured. Default is AudioSink.OFFLOAD_MODE_DISABLED.
    • Offload can be enabled through setAudioOffloadPreference in TrackSelectionParameters. 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 audioOffloadModePreference is set to AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, then the DefaultTrackSelector will 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 enableOffload from DefaultRenderersFactory.buildAudioSink method signature.
    • Remove method DefaultAudioSink.Builder.setOffloadMode.
    • Remove intdef value DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Add support for Opus gapless metadata during offload playback.
    • Allow renderer recovery by disabling offload if failed at first write (#627).
    • Enable Offload Scheduling by default for audio-only offloaded playback.
    • Delete ExoPlayer.experimentalSetOffloadSchedulingEnabled and AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Renamed onExperimentalSleepingForOffloadChanged as onSleepingForOffloadChanged and onExperimentalOffloadedPlayback as onOffloadedPlayback.
    • Move audio offload mode related TrackSelectionParameters interfaces and definitions to an inner AudioOffloadPreferences class.
    • Add onAudioTrackInitialized and onAudioTrackReleased callbacks to AnalyticsListener, AudioRendererEventListener and AudioSink.Listener.
    • Fix DTS Express audio buffer underflow issue (#650).
    • Fix bug where the capabilities check for E-AC3-JOC throws an IllegalArgumentException (#677).
  • Video:
    • Allow MediaCodecVideoRenderer to use a custom VideoFrameProcessor.Factory.
    • Fix bug where the first frame couldn't be rendered if the audio stream starts with negative timestamps (#291).
  • Text:
    • Remove ExoplayerCuesDecoder. Text tracks with sampleMimeType = application/x-media3-cues are now directly handled by TextRenderer without needing a SubtitleDecoder instance.
  • Metadata:
    • MetadataDecoder.decode will no longer be called for "decode-only" samples as the implementation must return null anyway.
  • Effect:
    • Add VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) queuing bitmap input by timestamp.
    • Change VideoFrameProcessor.registerInputStream() to be non-blocking. Apps must implement VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Changed frameRate and durationUs parameters of VideoFrameProcessor.queueInputBitmap to TimestampIterator.
  • IMA extension:
    • Fix bug where a multi-period DASH live stream that is not the first item in a playlist can throw an exception (#571).
    • Release StreamManager before calling AdsLoader.destroy()
    • Bump IMA SDK version to 3.31.0.
  • Session:
    • Set the notifications foreground service behavior to FOREGROUND_SERVICE_IMMEDIATE in DefaultMediaNotificationProvider ([#167](https://gith...
Read more

1.2.0-rc01

02 Nov 10:29
Compare
Choose a tag to compare
  • ExoPlayer:
    • Add luma and chroma bitdepth to ColorInfo #491.
  • Track Selection:
    • Add DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness to explicitly allow or disallow non-seamless adaptation. The default stays at its current behavior of true.
  • Audio:
    • Fix DTS Express audio buffer underflow issue (#650).
    • Fix bug where the capabilities check for E-AC3-JOC throws an IllegalArgumentException (#677).
  • Text:
    • Remove ExoplayerCuesDecoder. Text tracks with sampleMimeType = application/x-media3-cues are now directly handled by TextRenderer without needing a SubtitleDecoder instance.
  • Session:
    • Do not set the queue of the framework session when COMMAND_GET_TIMELINE is not available for the media notification controller. With Android Auto as the client controller reading from the framework session, this has the effect that the queue button in the UI of Android Auto is not displayed ((#339).
    • Use DataSourceBitmapLoader by default instead of SimpleBitmapLoader (#271,#327).
    • Add MediaSession.Callback.onMediaButtonEvent(Intent) that allows apps to override the default media button event handling.
  • HLS Extension:
    • Refresh the HLS live playlist with an interval calculated from the last load start time rather than the last load completed time (#663).
  • DASH Extension:
    • Add experimental support for parsing subtitles during extraction. This has better support for merging overlapping subtitles, including resolving flickering when transitioning between subtitle segments. You can enable this using DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Decoder Extensions (FFmpeg, VP9, AV1, MIDI, etc.):
    • Fix bug publishing MIDI decoder artifact to Maven repository. The artifact is renamed to media3-exoplayer-midi (#734).
  • Remove deprecated symbols:
    • Remove deprecated DownloadNotificationHelper.buildProgressNotification method, use a non deprecated method that takes a notMetRequirements parameter instead.

1.2.0-beta01

19 Oct 15:44
Compare
Choose a tag to compare
1.2.0-beta01 Pre-release
Pre-release
  • Audio:
    • Add onAudioTrackInitialized and onAudioTrackReleased callbacks to AnalyticsListener, AudioRendererEventListener and AudioSink.Listener.
  • Metadata:
    • MetadataDecoder.decode will no longer be called for "decode-only" samples as the implementation must return null anyway.
  • Session:
    • Add session demo module for Automotive OS and enable session demo for Android Auto.
  • DASH Extension:
    • Allow multiple of the same DASH identifier in segment template url.
  • RTSP Extension:
    • Use RTSP Setup Response timeout value in time interval of sending keep-alive RTSP Options requests (#662).
  • Decoder Extensions (FFmpeg, VP9, AV1, MIDI, etc.):
    • Add DecoderOutputBuffer.shouldBeSkipped to directly mark output buffers that don't need to be presented. This is preferred over C.BUFFER_FLAG_DECODE_ONLY that will be deprecated.
    • Add Decoder.setOutputStartTimeUs and SimpleDecoder.isAtLeastOutputStartTimeUs to allow decoders to drop decode-only samples before the start time. This should be preferred to Buffer.isDecodeOnly that will be deprecated.

1.2.0-alpha02

02 Oct 14:48
Compare
Choose a tag to compare
1.2.0-alpha02 Pre-release
Pre-release
  • Common Library:
  • ExoPlayer:
    • Add additional fields to Common Media Client Data (CMCD) logging: next object request (nor) and next range request (nrr)(#8699).
    • Add functionality to transmit Common Media Client Data (CMCD) data using query parameters (#553).
    • Fix ConcurrentModificationException in ExperimentalBandwidthMeter (#612).
    • Add MediaPeriodId parameter to CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Support ClippingMediaSource (and other sources with period/window time offsets) in ConcatenatingMediaSource2 (#11226).
    • Change BaseRenderer.onStreamChanged() to also receive a MediaPeriodId argument.
  • Transformer:
    • Changed frameRate and durationUs parameters of SampleConsumer.queueInputBitmap to TimestampIterator.
  • Extractors:
    • Add BmpExtractor.
    • Add WebpExtractor.
    • Add HeifExtractor.
    • Add QuickTime classic
      support to Mp4Extractor.
  • Audio:
    • Add support for Opus gapless metadata during offload playback.
    • Allow renderer recovery by disabling offload if failed at first write (#627).
    • Enable Offload Scheduling by default for audio-only offloaded playback.
    • Delete ExoPlayer.experimentalSetOffloadSchedulingEnabled and AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Renamed onExperimentalSleepingForOffloadChanged as onSleepingForOffloadChanged and onExperimentalOffloadedPlayback as onOffloadedPlayback.
    • Move audio offload mode related TrackSelectionParameters interfaces
      and definitions to an inner AudioOffloadPreferences class.
  • Effect:
    • Changed frameRate and durationUs parameters of VideoFrameProcessor.queueInputBitmap to TimestampIterator.
  • IMA extension:
    • Fix bug where a multi-period DASH live stream that is not the first item in a playlist can throw an exception (#571).
    • Release StreamManager before calling AdsLoader.destroy()
    • Bump IMA SDK version to 3.31.0.
  • Session:
    • Set the notifications foreground service behavior to FOREGROUND_SERVICE_IMMEDIATE in DefaultMediaNotificationProvider (#167).
    • Use only android.media.session.MediaSession.setMediaButtonBroadcastReceiver() above API 31 to avoid problems with deprecated API on Samsung devices (#167).
    • Use the media notification controller as proxy to set available commands and custom layout used to populate the notification and the platform session.
    • Convert media button events that are received by MediaSessionService.onStartCommand() within Media3 instead of routing them to the platform session and back to Media3. With this, the caller controller is always the media notification controller and apps can easily recognize calls coming from the notification in the same way on all supported API levels.
    • Fix bug where MediaController.getCurrentPosition() is not advancing when connected to a legacy MediaSessionCompat.
    • Add MediaLibrarySession.getSubscribedControllers(mediaId) for convenience.
    • Override MediaLibrarySession.Callback.onSubscribe() to assert the availability of the parent Id for which the controller subscribes. If successful, the subscription is accepted and notifyChildrenChanged() is called immediately to inform the browser (#561).
  • RTSP Extension:
    • Fix a race condition that could lead to IndexOutOfBoundsException when falling back to TCP, or playback hanging in some situations.
    • Check state in RTSP setup when returning loading state of RtspMediaPeriod (#577).
    • Ignore custom Rtsp request methods in Options response public header (#613).
  • Leanback extension:
    • Fix bug where disabling a surface can cause an ArithmeticException in Leanback code (#617).

1.2.0-alpha01

22 Aug 17:20
Compare
Choose a tag to compare
1.2.0-alpha01 Pre-release
Pre-release

This release includes the following changes since 1.1.1 release:

  • Common Library:
    • Add a @Nullable Throwable parameter to the methods in the Log.Logger interface. The message parameter to these methods no longer contains any information about the Throwable passed to the Log.{d,i,w,e}() methods, so implementations will need to manually append this information if desired (possibly using Logger.appendThrowableString(String, Throwable)).
    • Fix Kotlin compatibility issue where nullable generic type parameters and nullable array element types are not detected as nullable. Examples are TrackSelectorResult and SimpleDecoder method parameters (#6792).
    • Change default UI and notification behavior in Util.shouldShowPlayButton to show a "play" button while playback is temporarily suppressed (e.g. due to transient audio focus loss). The legacy behavior can be maintained by using PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) or MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
  • 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 as Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT if 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.canUpdateMediaItem and MediaSource.updateMediaItem to accept MediaItem updates after creation via Player.replaceMediaItem(s).
    • Allow MediaItem updates for all MediaSource classes provided by the library via Player.replaceMediaItem(s) ((#33),(#9978)).
    • Rename MimeTypes.TEXT_EXOPLAYER_CUES to MimeTypes.APPLICATION_MEDIA3_CUES.
    • Add PngExtractor that sends and reads a whole PNG file into the TrackOutput as one sample.
    • Enhance SequenceableLoader.continueLoading(long) method in the SequenceableLoader interface to SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo contains additional parameters, including playbackSpeed and lastRebufferRealtimeMs in addition to the existing playbackPositionUs.
    • Enhance ChunkSource.getNextChunk(long, long, List, ChunkHolder) method in the ChunkSource interface to ChunkSource.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.HdrMode annotation type and its associated constants. Use Composition.HdrMode and its associated constants instead.
    • Simplify the OverlaySettings to 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. Changed projectionPosePitch to projectionPoseRoll (#461).
    • Remove the assumption that Extractor instances can be directly inspected with instanceof. If you want runtime access to the implementation details of an Extractor you must first call Extractor.getUnderlyingInstance.
  • Audio:
    • Add support for 24/32-bit big-endian PCM in MP4 and Matroska, and parse PCM encoding for lpcm in MP4.
    • Add support for extracting Vorbis audio in MP4.
  • Audio Offload:
    • Add AudioSink.getFormatOffloadSupport(Format) that retrieves level of offload support the sink can provide for the format through a DefaultAudioOffloadSupportProvider. It returns the new AudioOffloadSupport that contains isFormatSupported, isGaplessSupported, and isSpeedChangeSupported.
    • Add AudioSink.setOffloadMode() through which the offload configuration on the audio sink is configured. Default is AudioSink.OFFLOAD_MODE_DISABLED.
    • Offload can be enabled through setAudioOffloadPreference in TrackSelectionParameters. 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 audioOffloadModePreference is set to AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, then the DefaultTrackSelector will 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 enableOffload from DefaultRenderersFactory.buildAudioSink method signature.
    • Remove method DefaultAudioSink.Builder.setOffloadMode.
    • Remove intdef value DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
  • Video:
    • Allow MediaCodecVideoRenderer to use a custom VideoFrameProcessor.Factory.
    • Fix bug where the first frame couldn't be rendered if the audio stream starts with negative timestamps (#291).
  • Effect:
    • Add VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) queuing bitmap input by timestamp.
  • UI:
    • Add a Player.Listener implementation for Wear OS devices that handles playback suppression due to Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT by 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).
  • Downloads:
    • Declare "data sync" foreground service type for DownloadService for Android 14 compatibility. When using this service, the app also needs to add dataSync as foregroundServiceType in the manifest and add the FOREGROUND_SERVICE_DATA_SYNC permission (#11239).
  • 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 TestExoPlayerBuilder and FakeClock compatible with Espresso UI tests and Compose UI tests. This fixes a bug where playback advances non-deterministically during Espresso or Compose view interactions.
  • Remove deprecated symbols:
    • Remove TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) and TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Use Composition.Builder.setHdrMode(int) and pass the Composition to Transformer.start(Composition, String) instead.

1.1.1

16 Aug 13:43
Compare
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).