Skip to content

Releases: androidx/media

1.4.0-alpha01

17 Apr 15:33
Compare
Choose a tag to compare
1.4.0-alpha01 Pre-release
Pre-release

This release includes the following changes since the 1.3.1 release:

  • ExoPlayer:
    • Add BasePreloadManager which coordinates the preloading for multiple sources based on the priorities defined by their rankingData. Customization is possible by extending this class. Add DefaultPreloadManager which uses PreloadMediaSource to preload media samples of the sources into memory, and uses an integer rankingData that indicates the index of an item on the UI.
    • Add PlayerId to most methods of LoadControl to enable LoadControl implementations to support multiple players.
    • Remove Buffer.isDecodeOnly() and C.BUFFER_FLAG_DECODE_ONLY. There is no need to set this flag as renderers and decoders will decide to skip buffers based on timestamp. Custom Renderer implementations should check if the buffer time is at least BaseRenderer.getLastResetPositionUs() to decide whether a sample should be shown. Custom SimpleDecoder implementations can check isAtLeastOutputStartTimeUs if needed or mark other buffers with DecoderOutputBuffer.shouldBeSkipped to skip them.
    • Allow a null value to be returned by TargetPreloadStatusControl.getTargetPreloadStatus(T) to indicate not to preload a MediaSource with the given rankingData.
    • Add remove(MediaSource) to BasePreloadManager.
  • Transformer:
    • Add audioConversionProcess and videoConversionProcess to ExportResult indicating how the respective track in the output file was made.
    • Relax trim optimization H.264 level checks.
    • Add support for changing between SDR and HDR input media in a sequence.
    • Add support for composition-level audio effects.
    • Add support for transcoding Ultra HDR images into HDR videos.
    • Fix issue where the DefaultAudioMixer does not output the correct amount of bytes after being reset and reused.
  • Video:
    • Fix issue where Listener.onRenderedFirstFrame() arrives too early when switching surfaces mid-playback.
  • DataSource:
    • Implement support for android.resource://package/id raw resource URIs where package is different to the package of the current application. This wasn't previously documented to work, but is a more efficient way of accessing resources in another package than by name.
    • Eagerly check url is non-null in the DataSpec constructors. This parameter was already annotated to be non-null.
  • Effect:
    • Support multiple speed changes within the same EditedMediaItem or Composition in SpeedChangeEffect.
    • Support for HLG and PQ output from ultra HDR bitmap input.
    • Add support for EGL_GL_COLORSPACE_BT2020_HLG_EXT, which improves HLG surface output in ExoPlayer.setVideoEffect and Transformer's Debug SurfaceView.
    • Update Overlay matrix implementation to make it consistent with the documentation by flipping the x and y values applied in setOverlayFrameAnchor(). If using OverlaySettings.Builder.setOverlayFrameAnchor(), flip their x and y values by multiplying them by -1.
  • Session:
    • Change default of CommandButton.enabled to true and ensure the value can stay false for controllers even if the associated command is available.
    • Add icon constants for CommandButton that should be used instead of custom icon resources.
    • Add MediaSessionService.isPlaybackOngoing() to let apps query whether the service needs to be stopped in onTaskRemoved() (#1219).
    • Add MediaSessionService.pauseAllPlayersAndStopSelf() that conveniently allows to pause playback of all sessions and call stopSelf to terminate the lifecycle of the MediaSessionService.
    • Override MediaSessionService.onTaskRemoved(Intent) to provide a safe default implementation that keeps the service running in the foreground if playback is ongoing or stops the service otherwise.
  • Downloads:
    • Ensure that DownloadHelper does not leak unreleased Renderer instances, which can eventually result in an app crashing with IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Test Utilities:
    • Implement onInit() and onRelease() in FakeRenderer.
    • Change TestPlayerRunHelper.runUntil/playUntil methods to fail on nonfatal errors (e.g. those reported to AnalyticsListener.onVideoCodecError). Use the new TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() method chain to disable this behavior.
  • Demo app:
    • Use DefaultPreloadManager in the short form demo app.
  • Remove deprecated symbols:
    • Remove CronetDataSourceFactory. Use CronetDataSource.Factory instead.
    • Remove some DataSpec constructors. Use DataSpec.Builder instead.

1.3.1

09 Apr 16:57
Compare
Choose a tag to compare

This release includes the following changes since the 1.3.0 release:

  • Common Library:
    • Add Format.labels to allow localized or other alternative labels.
  • ExoPlayer:
    • Fix issue where PreloadMediaPeriod cannot retain the streams when it is preloaded again.
    • Apply the correct corresponding TrackSelectionResult to the playing period in track reselection.
    • Start early-enabled renderers only after advancing the playing period when transitioning between media items (#1017).
    • Add missing return type to proguard -keepclasseswithmembers rule for DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformer:
    • Add workaround for exception thrown due to MediaMuxer not supporting negative presentation timestamps before API 30.
  • Track Selection:
    • DefaultTrackSelector: Prefer video tracks with a 'reasonable' frame rate (>=10fps) over those with a lower or unset frame rate. This ensures the player selects the 'real' video track in MP4s extracted from motion photos that can contain two HEVC tracks where one has a higher resolution but a very small number of frames (#1051).
  • Extractors:
    • Fix issue where padding was not skipped when reading odd-sized chunks from WAV files (#1117).
    • MP3: Populate Format.averageBitrate from metadata frames such as XING and VBRI.
    • MPEG-TS: Revert a change that aimed to ensure the last frame is rendered by passing the last access unit of a stream to the sample queue (#7909). This is due to the change causing new problems with I-frame only HLS streams (#1150) and H.262 HLS streams (#1126).
  • Audio:
    • Allow renderer recovery by disabling offload if audio track fails to initialize in offload mode.
  • Video:
    • Add workaround for a device issue on Galaxy Tab S7 FE, Chromecast with Google TV, and Lenovo M10 FHD Plus that causes 60fps H265 streams to be marked as unsupported
    • Add workaround that ensures the first frame is always rendered while tunneling even if the device does not do this automatically as required by the API (#1169). (#966).
    • Fix issue where HDR color info handling causes codec misbehavior and prevents adaptive format switches for SDR video tracks (#1158).
  • Text:
    • WebVTT: Prevent directly consecutive cues from creating spurious additional CuesWithTiming instances from WebvttParser.parse (#1177).
  • DRM:
    • Work around a NoSuchMethodError which can be thrown by the MediaDrm framework instead of ResourceBusyException or NotProvisionedException on some Android 14 devices (#1145).
  • Effect:
    • Improved PQ to SDR tone-mapping by converting color spaces.
  • Session:
    • Fix issue where the current position jumps back when the controller replaces the current item (#951).
    • Fix issue where MediaMetadata with just non-null extras is not transmitted between media controllers and sessions (#1176).
  • UI:
    • Fallback to include audio track language name if Locale cannot identify a display name (#988).
  • DASH Extension:
    • Populate all Label elements from the manifest into Format.labels (#1054).
  • RTSP Extension:
    • Skip empty session information values (i-tags) in SDP parsing (#1087).
  • Decoder Extensions (FFmpeg, VP9, AV1, MIDI, etc.):
    • Disable the MIDI extension as a local dependency by default because it requires an additional Maven repository to be configured. Users who need this module from a local dependency can re-enable it.

1.3.0

07 Mar 09:31
Compare
Choose a tag to compare

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.
    • Populate both artworkUri and artworkData in MediaMetadata.Builder.populate(MediaMetadata) when at least one of them is non-null (#964).
  • 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.
    • 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().
    • 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).
  • 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).
    • Add support for optimizing single asset mp4 trim operations.
    • Add support to ensure a video frame has the first timestamp in the output file. Fixes output files beginning with black frame on iOS based players (#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).
    • 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).
  • 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).
  • 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).
  • Image:
    • Add support for DASH thumbnails. Grid images are cropped and individual thumbnails are provided to ImageOutput close to their presentation times.
  • DRM:
  • IMA extension:
    • Fix issue where DASH and HLS ads without the appropriate file extension can't be played.
  • Session:
    • Disable double-click detection for TV apps (#962).
    • 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:
    • Reduce HlsMediaPeriod to package-private visibility. This type shouldn't be directly depended on from outside the HLS package.
    • Resolve seeks to beginning of a segment more efficiently (#1031).
  • 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.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.