github androidx/media 1.6.0

latest releases: 1.9.0-alpha01, 1.8.0, 1.8.0-rc02...
7 months ago

This release includes the following changes since the
1.5.1 release:

  • Common Library:
    • Add AudioManagerCompat and AudioFocusRequestCompat to replace the equivalent classes in androidx.media.
    • Upgrade Kotlin from 1.9.20 to 2.0.20 and use Compose Compiler Gradle plugin. Upgrade KotlinX Coroutines library from 1.8.1 to 1.9.0.
    • Remove Format.toBundle(boolean excludeMetadata) method, use Format.toBundle() instead.
    • Fix bug in SimpleBasePlayer where setting a new currentMediaItemIndex in State after setPlaylist with null MediaMetadata does not reevaluate the metadata (#1940).
    • Change SimpleBasePlayer.State access from protected to public to make it easier to handle updates in other classes(#2128).
  • ExoPlayer:
    • Add MediaExtractorCompat, a new class that provides equivalent features to platform MediaExtractor.
    • Add experimental 'ExoPlayer' pre-warming support for playback usingMediaCodecVideoRenderer. You can configure DefaultRenderersFactory through experimentalSetEnableMediaCodecVideoRendererPrewarming to provide a secondary MediaCodecVideoRenderer to ExoPlayer. If enabled, ExoPlayer pre-processes the video of consecutive media items during playback to reduce media item transition latency.
    • Reduce default values for bufferForPlaybackMs and bufferForPlaybackAfterRebufferMs in DefaultLoadControl to 1000 and 2000 ms respectively.
    • Initialize DeviceInfo and device volume asynchronously (if enabled using setDeviceVolumeControlEnabled). These values aren't available instantly after ExoPlayer.Builder.build(), and Player.Listener notifies changes through onDeviceInfoChanged and onDeviceVolumeChanged.
    • Initial audio session id is no longer immediately available after creating the player. You can use AnalyticsListener.onAudioSessionIdChanged to listen to the initial update if required.
    • Consider language when selecting a video track. By default, select a 'main' video track that matches the language of the selected audio track, if available. Explicit video language preferences can be expressed with TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Add selectedAudioLanguage parameter to DefaultTrackSelector.selectVideoTrack() method.
    • Add retryCount parameter to MediaSourceEventListener.onLoadStarted and corresponding MediaSourceEventListener.EventDispatcher methods.
    • Fix bug where playlist items or periods in multi-period DASH streams with durations that don't match the actual content could cause frame freezes at the end of the item (#1698).
    • Move BasePreloadManager.Listener to a top-level PreloadManagerListener.
    • RenderersFactory.createSecondaryRenderer can be implemented to provide secondary renderers for pre-warming. Pre-warming enables quicker media item transitions during playback.
    • Enable sending CmcdData for manifest requests in adaptive streaming formats DASH, HLS, and SmoothStreaming (#1951).
    • Provide MediaCodecInfo of the codec that will be initialized in MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Change AdsMediaSource to allow the AdPlaybackStates to grow by appending ad groups. Invalid modifications are detected and throw an exception.
    • Fix issue where additional decode-only frames may be displayed in quick succession when transitioning to content media after a mid-roll ad.
    • Make DefaultRenderersFactory add two MetadataRenderer instances to enable apps to receive two different schemes of metadata by default.
    • Reevaluate whether the ongoing load of a chunk should be cancelled when playback is paused (#1785).
    • Add option to ClippingMediaSource to allow clipping in unseekable media.
    • Fix bug where seeking with pre-warming could block following media item transition.
    • Fix a bug where ExoPlayer.isLoading() remains true while it has transitioned to STATE_IDLE or STATE_ENDED (#2133).
    • Add lastRebufferRealtimeMs to LoadControl.Parameter (#2113).
  • Transformer:
    • Add support for transmuxing into alternative backward compatible formats.
    • Add support for transcoding and transmuxing Dolby Vision (profile 8) format.
    • Update parameters of VideoFrameProcessor.registerInputStream and VideoFrameProcessor.Listener.onInputStreamRegistered to use Format.
    • Generate HDR static metadata when using DefaultEncoderFactory.
    • Enable support for Android platform diagnostics using MediaMetricsManager. Transformer forwards editing events and performance data to the platform, which helps to provide system performance and debugging information on the device. This data may also be collected by Google if sharing usage and diagnostics data is enabled by the user of the device. Apps can opt-out of contributing to platform diagnostics for Transformer with Transformer.Builder.setUsePlatformDiagnostics(false).
    • Split InAppMuxer into InAppMp4Muxer and InAppFragmentedMp4Muxer. You use InAppMp4Muxer to produce a non-fragmented MP4 file, while InAppFragmentedMp4Muxer is for producing a fragmented MP4 file.
    • Move Muxer interface from media3-muxer to media3-transformer.
    • Add MediaProjectionAssetLoader, which provides media from a MediaProjection for screen recording, and add support for screen recording to the Transformer demo app.
    • Add #getInputFormat() to Codec interface.
    • Shift the responsibility to release the GlObjectsProvider onto the caller in DefaultVideoFrameProcessor and DefaultVideoCompositor when possible.
  • Extractors:
    • AVI: Fix handling of files with constant bitrate compressed audio where the stream header stores the number of bytes instead of the number of chunks.
    • Fix handling of NAL units with lengths expressed in 1 or 2 bytes (rather than 4).
    • Fix ArrayIndexOutOfBoundsException in MP4 edit lists when the edit list starts at a non-sync frame with no preceding sync frame (#2062).
    • Fix issue where TS streams can get stuck on some devices (#2069).
    • FLAC: Add support for 32-bit FLAC files. Previously these would fail to play with IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Audio:
    • Fix onAudioPositionAdvancing to be called when playback resumes (previously it was called when playback was paused).
    • Don't bypass SonicAudioProcessor when SpeedChangingAudioProcessor is configured with default parameters.
    • Fix underflow in Sonic#getOutputSize() that could cause DefaultAudioSink to stall.
    • Fix MediaCodecAudioRenderer.getDurationToProgressUs() and DecoderAudioRenderer.getDurationToProgressUs() so that seeks correctly reset the provided durations.
    • Make androidx.media3.common.audio.SonicAudioProcessor final.
    • Add support for float PCM to ChannelMappingAudioProcessor and TrimmingAudioProcessor.
  • Video:
    • Change MediaCodecVideoRenderer.shouldUsePlaceholderSurface to protected so that applications can override to block usage of placeholder surfaces (#1905).
    • Add experimental ExoPlayer AV1 sample dependency parsing to speed up seeking. Enable it with the new DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies API.
    • Add experimental ExoPlayer API to drop late MediaCodecVideoRenderer decoder input buffers that are not depended on. Enable it with DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs.
    • Fix issue where a player without a surface was ready immediately and very slow decoding any pending frames (#1973).
    • Exclude Xiaomi and OPPO devices from detached surface mode to avoid screen flickering (#2059).
  • Text:
    • Add support for VobSub subtitles (#8260).
    • Stop eagerly loading all subtitle files configured with MediaItem.Builder.setSubtitleConfigurations, and instead only load one if it is selected by track selection (#1721).
    • TTML: Add support for referencing tts:origin and tts:extent using style (#2953).
    • Restrict WebVTT and SubRip timestamps to exactly 3 decimal places. Previously we incorrectly parsed any number of decimal places but always assumed the value was in milliseconds, leading to incorrect timestamp (#1997).
    • Fix playback hanging when a playlist contains clipped items with CEA-608 or CEA-708 captions.
    • Fix IllegalStateException when an SSA file contains a cue with zero duration (start and end time equal) (#2052).
    • Suppress (and log) subtitle parsing errors when subtitles are muxed into the same container as audio and vide (#2052).
    • Fix handling of multi-byte UTF-8 characters in WebVTT files using CR line endings (#2167).
  • DRM:
    • Fix MediaCodec$CryptoException: Operation not supported in this configuration error when playing ClearKey content on API < 27 devices (#1732).
  • Effect:
    • Moved the functionality of OverlaySettings into StaticOverlaySettings. OverlaySettings can be subclassed to allow dynamic overlay settings.
  • Muxers:
    • Moved MuxerException out of Muxer interface to avoid a very long fully qualified name.
    • Renamed setSampleCopyEnabled() method to setSampleCopyingEnabled() in both Mp4Muxer.Builder and FragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack() and FragmentedMp4Muxer.addTrack() now return an int track ID instead of a TrackToken.
    • Mp4Muxer and FragmentedMp4Muxer no longer implement Muxer interface.
    • Disable Mp4Muxer sample batching and copying by default.
    • Fix a bug in FragmentedMp4Muxer that creates a lot of fragments when only audio track is written.
  • Session:
    • Keep foreground service state for an additional 10 minutes when playback pauses, stops or fails. This allows users to resume playback within this timeout without risking foreground service restrictions on various devices. Note that simply calling player.pause() can no longer be used to stop the foreground service before stopSelf() when overriding onTaskRemoved, use MediaSessionService.pauseAllPlayersAndStopSelf() instead.
    • Keep notification visible when playback enters an error or stopped state. The notification is only removed if the playlist is cleared or the player is released.
    • Improve handling of Android platform MediaSession actions ACTION_PLAY and ACTION_PAUSE to only set one of them according to the available commands and also accept if only one of them is set.
    • Add Context as a parameter to MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Fix bug where calling a Player method on a MediaController connected to a legacy session dropped changes from a pending update.
    • Make MediaSession.setSessionActivity(PendingIntent) accept null (#2109).
    • Fix bug where a stale notification stays visible when the playlist is cleared (#2211).
  • UI:
    • Add state holders and composables to the media3-ui-compose module for PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState and PlaybackSpeedState.
  • Downloads:
    • Fix bug in CacheWriter that leaves data sources open and cache areas locked in case the data source throws an Exception other than IOException (#9760).
  • HLS extension:
    • Add a first version of HlsInterstitialsAdsLoader. The ads loader reads the HLS interstitials of an HLS media playlist and maps them to the AdPlaybackState that is passed to the AdsMediaSource. This initial version only supports HLS VOD streams with X-ASSET-URI attributes.
    • Add HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Apps can use it to create AdsMediaSource instances that use an HlsInterstitialsAdsLoader in a convenient and safe way.
    • Parse SUPPLEMENTAL-CODECS tag from HLS playlist to detect Dolby Vision formats (#1785).
    • Loosen the condition for seeking to sync positions in an HLS stream (#2209).
  • DASH extension:
    • Add AC-4 Level-4 format support for DASH (#1898).
    • Fix issue when calculating the update interval for ad insertion in multi-period live stream (#1698).
    • Parse scte214:supplementalCodecs attribute from DASH manifest to detect Dolby Vision formats (#1785).
    • Improve handling of period transitions in live streams where the period contains media samples beyond the declared period duration (#1698).
    • Fix issue where adaptation sets marked with adaptation-set-switching but different languages or role flags are merged together (#2222).
  • Decoder extensions (FFmpeg, VP9, AV1, etc.):
    • Add the MPEG-H decoder module which uses the native MPEG-H decoder module to decode MPEG-H audio (#1826).
  • MIDI extension:
    • Plumb custom AudioSink and AudioRendererEventListener instances into MidiRenderer.
  • Cast extension:
    • Bump the play-services-cast-framework dependency to 21.5.0 to fix a FLAG_MUTABLE crash in apps targeting API 34+ on devices with Google Play services installed but disabled (#2178).
  • Demo app:
    • Extend demo-compose with additional buttons and enhance PlayerSurface integration with scaling and shutter support.
  • Remove deprecated symbols:
    • Remove deprecated AudioMixer.create() method. Use DefaultAudioMixer.Factory().create() instead.
    • Remove the following deprecated Transformer.Builder methods:
      • setTransformationRequest(), use setAudioMimeType(), setVideoMimeType(), and setHdrMode() instead.
      • setAudioProcessors(), set the audio processor in an EditedMediaItem.Builder.setEffects(), and pass it to Transformer.start() instead.
      • setVideoEffects(), set video effect in an EditedMediaItem.Builder.setEffects(), and pass it to Transformer.start() instead.
      • setRemoveAudio(), use EditedMediaItem.Builder.setRemoveAudio() to remove the audio from the EditedMediaItem passed to Transformer.start() instead.
      • setRemoveVideo(), use EditedMediaItem.Builder.setRemoveVideo() to remove the video from the EditedMediaItem passed to Transformer.start() instead.
      • setFlattenForSlowMotion(), use EditedMediaItem.Builder.setFlattenForSlowMotion() to flatten the EditedMediaItem passed to Transformer.start() instead.
      • setListener(), use addListener(), removeListener() or removeAllListeners() instead.
    • Remove the following deprecated Transformer.Listener methods:
      • onTransformationCompleted(MediaItem), use onCompleted(Composition, ExportResult) instead.
      • onTransformationCompleted(MediaItem, TransformationResult), use onCompleted(Composition, ExportResult) instead.
      • onTransformationError(MediaItem, Exception), use onError(Composition, ExportResult, ExportException) instead.
      • onTransformationError(MediaItem, TransformationException), use onError(Composition, ExportResult, ExportException) instead.
      • onTransformationError(MediaItem, TransformationResult, TransformationException), use onError(Composition, ExportResult, ExportException) instead.
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), use onFallbackApplied(Composition, TransformationRequest, TransformationRequest) instead.
    • Remove deprecated TransformationResult class. Use ExportResult instead.
    • Remove deprecated TransformationException class. Use ExportException instead.
    • Remove deprecated Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Use Transformer.PROGRESS_STATE_NOT_STARTED instead.
    • Remove deprecated Transformer.setListener(). Use Transformer.addListener(), Transformer.removeListener() or Transformer.removeAllListeners() instead.
    • Remove deprecated Transformer.startTransformation(). Use Transformer.start(MediaItem, String) instead.
    • Remove deprecated SingleFrameGlShaderProgram. Use BaseGlShaderProgram instead.
    • Remove Transformer.flattenForSlowMotion. Use EditedMediaItem.flattenForSlowMotion instead.
    • Removed ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent and ExoPlayer.DeviceComponent.
    • Removed androidx.media3.exoplayer.audio.SonicAudioProcessor.
    • Removed the following deprecated DownloadHelper methods:
      • Constructor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), use DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList) instead.
      • getRendererCapabilities(RenderersFactory), equivalent functionality can be achieved by creating a DefaultRendererCapabilitiesList with a RenderersFactory, and calling DefaultRendererCapabilitiesList.getRendererCapabilities().
    • Removed PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) method. Use PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) and pass in (MediaSession.Token) compatToken.getToken() instead.

Don't miss a new media release

NewReleases is sending notifications on new releases.