androidx/media (androidx.media3:media3-test-utils-robolectric)
### [`v1.4.1`](https://togithub.com/androidx/media/blob/HEAD/RELEASENOTES.md#141-2024-08-23)
[Compare Source](https://togithub.com/androidx/media/compare/1.4.0...1.4.1)
This release includes the following changes since the
[1.4.0 release](#140-2024-07-24):
- ExoPlayer:
- Handle preload callbacks asynchronously in `PreloadMediaSource`
([#1568](https://togithub.com/androidx/media/issues/1568)).
- Allow playback regardless of buffered duration when loading fails
([#1571](https://togithub.com/androidx/media/issues/1571)).
- Extractors:
- MP3: Fix `Searched too many bytes` error by correctly ignoring trailing
non-MP3 data based on the length field in an `Info` frame
([#1480](https://togithub.com/androidx/media/issues/1480)).
- Text:
- TTML: Fix handling of percentage `tts:fontSize` values to ensure they
are correctly inherited from parent nodes with percentage `tts:fontSize`
values.
- Fix `IndexOutOfBoundsException` in `LegacySubtitleUtil` due to
incorrectly handling the case of the requested output start time being
greater than or equal to the final event time in the `Subtitle`
([#1516](https://togithub.com/androidx/media/issues/1516)).
- DRM:
- Fix `android.media.MediaCodec$CryptoException: Operation not supported
in this configuration: ERROR_DRM_CANNOT_HANDLE` error on API 31+ devices
playing L1 Widevine content. This error is caused by an incomplete
implementation of the framework
[`MediaDrm.requiresSecureDecoder`](https://developer.android.com/reference/android/media/MediaDrm#requiresSecureDecoder\(java.lang.String\))
method ([#1603](https://togithub.com/androidx/media/issues/1603)).
- Effect:
- Add a `release()` method to `GlObjectsProvider`.
- Session:
- Transform a double-tap of `KEYCODE_HEADSETHOOK` into a 'seek to next'
action, as
[documented](https://developer.android.com/reference/androidx/media3/session/MediaSession#media-key-events-mapping)
([#1493](https://togithub.com/androidx/media/issues/1493)).
- Handle `KEYCODE_HEADSETHOOK` as a 'play' command in
`MediaButtonReceiver` when deciding whether to ignore it to avoid a
`ForegroundServiceDidNotStartInTimeException`
([#1581](https://togithub.com/androidx/media/issues/1581)).
- RTSP Extension:
- Skip invalid Media Descriptions in SDP parsing
([#1087](https://togithub.com/androidx/media/issues/1472)).
### [`v1.4.0`](https://togithub.com/androidx/media/blob/HEAD/RELEASENOTES.md#140-2024-07-24)
[Compare Source](https://togithub.com/androidx/media/compare/1.3.1...1.4.0)
This release includes the following changes since the
[1.3.1 release](#131-2024-04-11):
- Common Library:
- Forward presumed no-op seek calls to the protected `BasePlayer.seekTo()`
and `SimpleBasePlayer.handleSeek()` methods instead of ignoring them. If
you are implementing these methods in a custom player, you may need to
handle these additional calls with `mediaItemIndex == C.INDEX_UNSET`.
- Remove compile dependency on enhanced Java 8 desugaring
([#1312](https://togithub.com/androidx/media/issues/1312)).
- Ensure the duration passed to `MediaItem.Builder.setImageDurationMs()`
is ignored for a non-image `MediaItem` (as documented).
- Add `Format.customData` to store app-provided custom information about
`Format` instances.
- 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`.
- Add `reset()` to `BasePreloadManager` to release all the holding sources
while keep the preload manager instance.
- Add `ExoPlayer.setPriority()` (and `Builder.setPriority()`) to define
the priority value used in `PriorityTaskManager` and for MediaCodec
importance from API 35.
- Fix issue with updating the last rebuffer time which resulted in
incorrect `bs` (buffer starvation) key in CMCD
([#1124](https://togithub.com/androidx/media/issues/1124)).
- Add
`PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)`
to indicate that the source has loaded to the end. This allows the
`DefaultPreloadManager` and the custom
`PreloadMediaSource.PreloadControl` implementations to preload the next
source or take other actions.
- Fix bug where silence skipping at the end of items can trigger a
playback exception.
- Add `clear` to `PreloadMediaSource` to discard the preloading period.
- Add new error code
`PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED` that is used
when codec resources are reclaimed for higher priority tasks.
- Let `AdsMediaSource` load preroll ads before initial content media
preparation completes
([#1358](https://togithub.com/androidx/media/issues/1358)).
- Fix bug where playback moved to `STATE_ENDED` when re-preparing a
multi-period DASH live stream after the original period was already
removed from the manifest.
- Rename `onTimelineRefreshed()` to `onSourcePrepared()` and
`onPrepared()` to `onTracksSelected()` in
`PreloadMediaSource.PreloadControl`. Also rename the IntDefs in
`DefaultPreloadManager.Stage` accordingly.
- Add experimental support for dynamic scheduling to better align work
with CPU wake-cycles and delay waking up to when renderers can progress.
You can enable this using `experimentalSetDynamicSchedulingEnabled()`
when setting up your ExoPlayer instance.
- Add `Renderer.getDurationToProgressUs()`. A `Renderer` can implement
this method to return to ExoPlayer the duration that playback must
advance for the renderer to progress. If `ExoPlayer` is set with
`experimentalSetDynamicSchedulingEnabled()` then `ExoPlayer` will call
this method when calculating the time to schedule its work task.
- Add `MediaCodecAdapter#OnBufferAvailableListener` to alert when input
and output buffers are available for use by `MediaCodecRenderer`.
`MediaCodecRenderer` will signal `ExoPlayer` when receiving these
callbacks and if `ExoPlayer` is set with
`experimentalSetDynamicSchedulingEnabled()`, then `ExoPlayer` will
schedule its work loop as renderers can make progress.
- Use data class for `LoadControl` methods instead of individual
parameters.
- Add `ExoPlayer.isReleased()` to check whether `Exoplayer.release()` has
been called.
- Add `ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()` to configure
the maximum position for which `seekToPrevious()` seeks to the previous
item ([#1425](https://togithub.com/androidx/media/issues/1425)).
- Fix some audio focus inconsistencies, e.g. not reporting full or
transient focus loss while the player is paused
([#1436](https://togithub.com/androidx/media/issues/1436)).
- Fix potential `IndexOutOfBoundsException` caused by extractors reporting
additional tracks after the initial preparation step
([#1476](https://togithub.com/androidx/media/issues/1476)).
- `Effects` in `ExoPlayer.setVideoEffect()` will receive the timestamps
with the renderer offset removed
([#1098](https://togithub.com/androidx/media/issues/1098)).
- Fix potential `IllegalArgumentException` when handling player error that
happened while reading ahead into another playlist item
([#1483](https://togithub.com/androidx/media/issues/1483)).
- 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.
- Work around a decoder bug where the number of audio channels was capped
at stereo when handling PCM input.
- When selecting tracks in `ExoPlayerAssetLoader`, ignore audio channel
count constraints as they only apply for playback.
- Replace `androidx.media3.transformer.Muxer` interface with
`androidx.media3.muxer.Muxer` and remove
`androidx.media3.transformer.Muxer`.
- Fix HEIC image loading from content URI schemes.
([#1373](https://togithub.com/androidx/media/issues/1373)).
- Adjust audio track duration in `AudioGraphInput` to improve AV sync.
- Remove `ExportResult.processedInputs` field. If you use this field for
codec details, then use `DefaultDecoderFactory.listener` instead. In
case of a codec exception, codec details will be available in the
`ExportException.codecInfo`.
- Extractors:
- MPEG-TS: Roll forward the change ensuring the last frame is rendered by
passing the last access unit of a stream to the sample queue
([#7909](https://togithub.com/google/ExoPlayer/issues/7909)).
Incorporating fixes to resolve the issues that emerged in I-frame only
HLS streams([#1150](https://togithub.com/androidx/media/issues/1150)) and
H.262 HLS streams
([#1126](https://togithub.com/androidx/media/issues/1126)).
- MP3: Prefer the data size from an `Info` frame over the size reported by
the underlying stream (e.g. file size, or HTTP `Content-Length` header).
This helps to exclude non-playable trailer data (e.g. album artwork)
from constant bitrate seeking calculations, making seeks more accurate
([#1376](https://togithub.com/androidx/media/issues/1376)).
- MP3: Use the frame count and other data in an `Info` frame (if present)
to compute an average bitrate for constant bitrate seeking, rather than
extrapolating from the bitrate of the frame after the `Info` frame,
which may be artificially small, e.g. `PCUT` frame
([#1376](https://togithub.com/androidx/media/issues/1376)).
- Fix PCM audio format extraction in AVI containers.
- Audio:
- Fix DTS:X Profile 2 encoding attributes for passthrough playback
([#1299](https://togithub.com/androidx/media/pull/1299)).
- For offloaded playback, reset the tracking field for stream completion
in `DefaultAudioSink` prior to calling `AudioTrack.stop()` so that
`AudioTrack.StreamEventCallback#onPresentationEnded` correctly
identifies when all pending data has been played.
- Fix bug in `SilenceSkippingAudioProcessor` where transitions between
different audio formats (for example stereo to mono) can cause the
processor to throw an exception
([#1352](https://togithub.com/androidx/media/issues/1352)).
- Implement `MediaCodecAudioRenderer.getDurationToProgressUs()` so that
ExoPlayer will dynamically schedule its main work loop to when the
MediaCodecAudioRenderer can make progress.
- Video:
- Fix issue where `Listener.onRenderedFirstFrame()` arrives too early when
switching surfaces mid-playback.
- Fix decoder fallback logic for Dolby Vision to use a compatible AV1
decoder if needed
([#1389](https://togithub.com/androidx/media/pull/1389)).
- Fix codec exception that may be caused by enabling a video renderer
mid-playback.
- Text:
- Fix issue where subtitles starting before a seek position are skipped.
This issue was only introduced in Media3 1.4.0-alpha01.
- Change default subtitle parsing behavior so it happens during extraction
instead of during rendering (see
[ExoPlayer's architecture diagram](https://developer.android.com/media/media3/exoplayer/glossary#exoplayer)
for the difference between extraction and rendering).
- This change can be overridden by calling **both**
`MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)`
and `TextRenderer.experimentalSetLegacyDecodingEnabled(true)`. See
the
[docs on customization](https://developer.android.com/media/media3/exoplayer/customization)
for how to plumb these components into an `ExoPlayer` instance.
These methods (and all support for legacy subtitle decoding) will be
removed in a future release.
- Apps with custom `SubtitleDecoder` implementations need to update
them to implement `SubtitleParser` instead (and
`SubtitleParser.Factory` instead of `SubtitleDecoderFactory`).
- PGS: Fix run-length decoding to resolve `0` as a color index, instead of
a literal color value
([#1367](https://togithub.com/androidx/media/pull/1367)).
- 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).
- This was originally included in the `1.3.0-alpha01` release notes,
but the change was accidentally reverted before the `1.3.0-rc01`
release. This is now fixed, so the change is present again.
- CEA-708: Avoid duplicate newlines being added by ExoPlayer's naive
handling of the 'set pen location' command
([#1315](https://togithub.com/androidx/media/pull/1315)).
- Fix an `IllegalArgumentException` from `LegacySubtitleUtil` when a
WebVTT subtitle sample contains no cues, e.g. as part of a DASH stream
([#1516](https://togithub.com/androidx/media/issues/1516)).
- Metadata:
- Fix mapping of MP4 to ID3 sort tags. Previously the 'album sort'
(`soal`), 'artist sort' (`soar`) and 'album artist sort' (`soaa`) MP4
tags were wrongly mapped to the `TSO2`, `TSOA` and `TSOP` ID3 tags
([#1302](https://togithub.com/androidx/media/issues/1302)).
- Fix reading of MP4 (/iTunes) numeric `gnre` (genre) and `tmpo` (tempo)
tags when the value is more than one byte long.
- Propagate ID3 `TCON` frame to `MediaMetadata.genre`
([#1305](https://togithub.com/androidx/media/issues/1305)).
- Image:
- Add support for non-square DASH thumbnail grids
([#1300](https://togithub.com/androidx/media/pull/1300)).
- Add support for AVIF for API 34+.
- Allow `null` as parameter for `ExoPlayer.setImageOutput()` to clear a
previously set `ImageOutput`.
- 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.
- Allow `ByteArrayDataSource` to resolve a URI to a byte array during
`open()`, instead of being hard-coded at construction
([#1405](https://togithub.com/androidx/media/issues/1405)).
- DRM:
- Allow setting a `LoadErrorHandlingPolicy` on
`DefaultDrmSessionManagerProvider`
([#1271](https://togithub.com/androidx/media/issues/1271)).
- 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`.
- Fix bug where `TimestampWrapper` crashes when used with
`ExoPlayer#setVideoEffects`
([#821](https://togithub.com/androidx/media/issues/821)).
- Change default SDR color working space from linear colors to electrical
BT 709 SDR video. Also provide third option to retain the original
colorspace.
- Allow defining indeterminate z-order of EditedMediaItemSequences
([#1055](https://togithub.com/androidx/media/pull/1055)).
- Maintain a consistent luminance range across different pieces of HDR
content (uses the HLG range).
- Add support for Ultra HDR (bitmap) overlays on HDR content.
- Allow `SeparableConvolution` effects to be used before API 26.
- Remove unused `OverlaySettings.useHdr` since dynamic range of overlay
and frame must match.
- Add HDR support for `TextOverlay`. Luminance of the text overlay can be
adjusted with `OverlaySettings.Builder.setHdrLuminanceMultiplier()`.
- IMA extension:
- Promote API that is required for apps to play
[DAI ad streams](https://developers.google.com/ad-manager/dynamic-ad-insertion/full-service)
to stable.
- Add `replaceAdTagParameters(Map )` to
`ImaServerSideAdInsertionMediaSource.AdLoader` that allows replacing ad
tag parameters at runtime.
- Fix bug where `VideoAdPlayer.VideoAdPlayerCallback.onError()` was not
called when a player error happened during ad playback
([#1334](https://togithub.com/androidx/media/issues/1334)).
- Bump IMA SDK version to 3.33.0 to fix a `NullPointerException` when
using `data://` ad tag URIs
([#700](https://togithub.com/androidx/media/issues/700)).
- 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](https://togithub.com/androidx/media/issues/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.
- Hide seekbar in the media notification for live streams by not setting
the duration into the platform session metadata
([#1256](https://togithub.com/androidx/media/issues/1256)).
- Align conversion of `MediaMetadata` to `MediaDescriptionCompat`, to use
the same preferred order and logic when selecting metadata properties as
in media1.
- Add `MediaSession.sendError()` that allows sending non-fatal errors to
Media3 controller. When using the notification controller (see
`MediaSession.getMediaNotificationControllerInfo()`), the custom error
is used to update the `PlaybackState` of the platform session to an
error state with the given error information
([#543](https://togithub.com/androidx/media/issues/543)).
- Add `MediaSession.Callback.onPlayerInteractionFinished()` to inform
sessions when a series of player interactions from a specific controller
finished.
- Add `SessionError` and use it in `SessionResult` and `LibraryResult`
instead of the error code to provide more information about the error
and how to resolve the error if possible.
- Publish the code for the media3 controller test app that can be used to
test interactions with apps publishing a media session.
- Propagate extras passed to media3's
`MediaSession[Builder].setSessionExtras()` to a media1 controller's
`PlaybackStateCompat.getExtras()`.
- Map fatal and non-fatal errors to and from the platform session. A
`PlaybackException` is mapped to a fatal error state of the
`PlaybackStateCompat`. A `SessionError` sent to the media notification
controller with `MediaSession.sendError(ControllerInfo, SessionError)`
is mapped to a non-fatal error in `PlaybackStateCompat` which means that
error code and message are set but the state of the platform session
remains different to `STATE_ERROR`.
- Allow the session activity to be set per controller to override the
global session activity. The session activity can be defined for a
controller at connection time by creating a `ConnectionResult` with
`AcceptedResultBuilder.setSessionActivivty(PendingIntent)`. Once
connected, the session activity can be updated with
`MediaSession.setSessionActivity(ControllerInfo, PendingIntent)`.
- Improve error replication of calls to `MediaLibrarySession.Callback`.
Error replication can now be configured by using
`MediaLibrarySession.Builder.setLibraryErrorReplicationMode()` for
choosing the error type or opt-ing out of error replication which is on
by default.
- UI:
- Add image display support to `PlayerView` when connected to an
`ExoPlayer` ([#1144](https://togithub.com/androidx/media/issues/1144)).
- Add customization of various icons in `PlayerControlView` through xml
attributes to allow different drawables per `PlayerView` instance,
rather than global overrides
([#1200](https://togithub.com/androidx/media/issues/1200)).
- Work around a platform bug causing stretched/cropped video when using
`SurfaceView` inside a Compose `AndroidView` on API 34
([#1237](https://togithub.com/androidx/media/issues/1237)).
- 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](https://togithub.com/androidx/media/issues/1224)).
- Cronet Extension:
- Fix `SocketTimeoutException` in `CronetDataSource`. In some versions of
Cronet, the request provided by the callback is not always the same.
This leads to callback not completing and request timing out
(https://issuetracker.google.com/328442628).
- HLS Extension:
- Fix bug where pending EMSG samples waiting for a discontinuity were
delegated in `HlsSampleStreamWrapper` with an incorrect offset causing
an `IndexOutOfBoundsException` or an `IllegalArgumentException`
([#1002](https://togithub.com/androidx/media/issues/1002)).
- Fix bug where non-primary playlists keep reloading for LL-HLS streams
([#1240](https://togithub.com/androidx/media/issues/1240)).
- Fix bug where enabling CMCD for HLS with initialization segments
resulted in `Source Error` and `IllegalArgumentException`.
- Fix bug where non-primary playing playlists are not refreshed during
live playback ([#1240](https://togithub.com/androidx/media/issues/1240)).
- Fix bug where enabling CMCD for HLS live streams causes
`ArrayIndexOutOfBoundsException`
([#1395](https://togithub.com/androidx/media/issues/1395)).
- DASH Extension:
- Fix bug where re-preparing a multi-period live stream can throw an
`IndexOutOfBoundsException`
([#1329](https://togithub.com/androidx/media/issues/1329)).
- Add support for `dashif:Laurl` license urls
([#1345](https://togithub.com/androidx/media/issues/1345)).
- Cast Extension:
- Fix bug that converted the album title of the `MediaQueueItem` to the
artist in the Media3 media item
([#1255](https://togithub.com/androidx/media/pull/1255)).
- 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.
- Allow setting repeat mode with `Intent` arguments from command line
([#1266](https://togithub.com/androidx/media/pull/1266)).
- Use `HttpEngineDataSource` as the `HttpDataSource` when supported by the
device.
- Remove deprecated symbols:
- Remove `CronetDataSourceFactory`. Use `CronetDataSource.Factory`
instead.
- Remove some `DataSpec` constructors. Use `DataSpec.Builder` instead.
- Remove `setContentTypePredicate(Predicate)` method from
`DefaultHttpDataSource`, `OkHttpDataSource` and `CronetDataSource`. Use
the equivalent method on each `XXXDataSource.Factory` instead.
- Remove `OkHttpDataSource` constructors and `OkHttpDataSourceFactory`.
Use `OkHttpDataSource.Factory` instead.
- Remove `PlayerMessage.setHandler(Handler)`. Use `setLooper(Looper)`
instead.
- Remove `Timeline.Window.isLive` field. Use the `isLive()` method
instead.
- Remove `DefaultHttpDataSource` constructors. Use
`DefaultHttpDataSource.Factory` instead.
- Remove `DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS`. Use
`DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS` instead.
- Remove `MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format,
boolean)`. Use `MediaCodecInfo.canReuseCodec(Format, Format)` instead.
- Remove `DrmSessionManager.DUMMY` and `getDummyDrmSessionManager()`
method. Use `DrmSessionManager.DRM_UNSUPPORTED` instead.
- Remove `AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)`,
`AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)`,
`AudioRendererEventListener.onAudioInputFormatChanged(Format)`,
`VideoRendererEventListener.onVideoInputFormatChanged(Format)`. Use the
overloads that take a `DecoderReuseEvaluation` instead.
- Remove `RendererSupport.FormatSupport` IntDef and `FORMAT_HANDLED`,
`FORMAT_EXCEEDS_CAPABILITIES`, `FORMAT_UNSUPPORTED_DRM`,
`FORMAT_UNSUPPORTED_SUBTYPE`, `FORMAT_UNSUPPORTED_TYPE` constants. Use
the equivalent IntDef and constants in `androidx.media3.common.C`
instead (e.g. `C.FORMAT_HANDLED`).
- Remove `Bundleable` interface. This includes removing all
`Bundleable.Creator CREATOR` constant fields. Callers should use
the `Bundle toBundle()` and `static Foo fromBundle(Bundle)` methods on
each type instead.
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
â™» Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
[ ] If you want to rebase/retry this PR, check this box
This PR contains the following updates:
1.3.1
->1.4.1
1.3.1
->1.4.1
1.3.1
->1.4.1
1.3.1
->1.4.1
Release Notes
androidx/media (androidx.media3:media3-test-utils-robolectric)
### [`v1.4.1`](https://togithub.com/androidx/media/blob/HEAD/RELEASENOTES.md#141-2024-08-23) [Compare Source](https://togithub.com/androidx/media/compare/1.4.0...1.4.1) This release includes the following changes since the [1.4.0 release](#140-2024-07-24): - ExoPlayer: - Handle preload callbacks asynchronously in `PreloadMediaSource` ([#1568](https://togithub.com/androidx/media/issues/1568)). - Allow playback regardless of buffered duration when loading fails ([#1571](https://togithub.com/androidx/media/issues/1571)). - Extractors: - MP3: Fix `Searched too many bytes` error by correctly ignoring trailing non-MP3 data based on the length field in an `Info` frame ([#1480](https://togithub.com/androidx/media/issues/1480)). - Text: - TTML: Fix handling of percentage `tts:fontSize` values to ensure they are correctly inherited from parent nodes with percentage `tts:fontSize` values. - Fix `IndexOutOfBoundsException` in `LegacySubtitleUtil` due to incorrectly handling the case of the requested output start time being greater than or equal to the final event time in the `Subtitle` ([#1516](https://togithub.com/androidx/media/issues/1516)). - DRM: - Fix `android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE` error on API 31+ devices playing L1 Widevine content. This error is caused by an incomplete implementation of the framework [`MediaDrm.requiresSecureDecoder`](https://developer.android.com/reference/android/media/MediaDrm#requiresSecureDecoder\(java.lang.String\)) method ([#1603](https://togithub.com/androidx/media/issues/1603)). - Effect: - Add a `release()` method to `GlObjectsProvider`. - Session: - Transform a double-tap of `KEYCODE_HEADSETHOOK` into a 'seek to next' action, as [documented](https://developer.android.com/reference/androidx/media3/session/MediaSession#media-key-events-mapping) ([#1493](https://togithub.com/androidx/media/issues/1493)). - Handle `KEYCODE_HEADSETHOOK` as a 'play' command in `MediaButtonReceiver` when deciding whether to ignore it to avoid a `ForegroundServiceDidNotStartInTimeException` ([#1581](https://togithub.com/androidx/media/issues/1581)). - RTSP Extension: - Skip invalid Media Descriptions in SDP parsing ([#1087](https://togithub.com/androidx/media/issues/1472)). ### [`v1.4.0`](https://togithub.com/androidx/media/blob/HEAD/RELEASENOTES.md#140-2024-07-24) [Compare Source](https://togithub.com/androidx/media/compare/1.3.1...1.4.0) This release includes the following changes since the [1.3.1 release](#131-2024-04-11): - Common Library: - Forward presumed no-op seek calls to the protected `BasePlayer.seekTo()` and `SimpleBasePlayer.handleSeek()` methods instead of ignoring them. If you are implementing these methods in a custom player, you may need to handle these additional calls with `mediaItemIndex == C.INDEX_UNSET`. - Remove compile dependency on enhanced Java 8 desugaring ([#1312](https://togithub.com/androidx/media/issues/1312)). - Ensure the duration passed to `MediaItem.Builder.setImageDurationMs()` is ignored for a non-image `MediaItem` (as documented). - Add `Format.customData` to store app-provided custom information about `Format` instances. - 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`. - Add `reset()` to `BasePreloadManager` to release all the holding sources while keep the preload manager instance. - Add `ExoPlayer.setPriority()` (and `Builder.setPriority()`) to define the priority value used in `PriorityTaskManager` and for MediaCodec importance from API 35. - Fix issue with updating the last rebuffer time which resulted in incorrect `bs` (buffer starvation) key in CMCD ([#1124](https://togithub.com/androidx/media/issues/1124)). - Add `PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)` to indicate that the source has loaded to the end. This allows the `DefaultPreloadManager` and the custom `PreloadMediaSource.PreloadControl` implementations to preload the next source or take other actions. - Fix bug where silence skipping at the end of items can trigger a playback exception. - Add `clear` to `PreloadMediaSource` to discard the preloading period. - Add new error code `PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED` that is used when codec resources are reclaimed for higher priority tasks. - Let `AdsMediaSource` load preroll ads before initial content media preparation completes ([#1358](https://togithub.com/androidx/media/issues/1358)). - Fix bug where playback moved to `STATE_ENDED` when re-preparing a multi-period DASH live stream after the original period was already removed from the manifest. - Rename `onTimelineRefreshed()` to `onSourcePrepared()` and `onPrepared()` to `onTracksSelected()` in `PreloadMediaSource.PreloadControl`. Also rename the IntDefs in `DefaultPreloadManager.Stage` accordingly. - Add experimental support for dynamic scheduling to better align work with CPU wake-cycles and delay waking up to when renderers can progress. You can enable this using `experimentalSetDynamicSchedulingEnabled()` when setting up your ExoPlayer instance. - Add `Renderer.getDurationToProgressUs()`. A `Renderer` can implement this method to return to ExoPlayer the duration that playback must advance for the renderer to progress. If `ExoPlayer` is set with `experimentalSetDynamicSchedulingEnabled()` then `ExoPlayer` will call this method when calculating the time to schedule its work task. - Add `MediaCodecAdapter#OnBufferAvailableListener` to alert when input and output buffers are available for use by `MediaCodecRenderer`. `MediaCodecRenderer` will signal `ExoPlayer` when receiving these callbacks and if `ExoPlayer` is set with `experimentalSetDynamicSchedulingEnabled()`, then `ExoPlayer` will schedule its work loop as renderers can make progress. - Use data class for `LoadControl` methods instead of individual parameters. - Add `ExoPlayer.isReleased()` to check whether `Exoplayer.release()` has been called. - Add `ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()` to configure the maximum position for which `seekToPrevious()` seeks to the previous item ([#1425](https://togithub.com/androidx/media/issues/1425)). - Fix some audio focus inconsistencies, e.g. not reporting full or transient focus loss while the player is paused ([#1436](https://togithub.com/androidx/media/issues/1436)). - Fix potential `IndexOutOfBoundsException` caused by extractors reporting additional tracks after the initial preparation step ([#1476](https://togithub.com/androidx/media/issues/1476)). - `Effects` in `ExoPlayer.setVideoEffect()` will receive the timestamps with the renderer offset removed ([#1098](https://togithub.com/androidx/media/issues/1098)). - Fix potential `IllegalArgumentException` when handling player error that happened while reading ahead into another playlist item ([#1483](https://togithub.com/androidx/media/issues/1483)). - 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. - Work around a decoder bug where the number of audio channels was capped at stereo when handling PCM input. - When selecting tracks in `ExoPlayerAssetLoader`, ignore audio channel count constraints as they only apply for playback. - Replace `androidx.media3.transformer.Muxer` interface with `androidx.media3.muxer.Muxer` and remove `androidx.media3.transformer.Muxer`. - Fix HEIC image loading from content URI schemes. ([#1373](https://togithub.com/androidx/media/issues/1373)). - Adjust audio track duration in `AudioGraphInput` to improve AV sync. - Remove `ExportResult.processedInputs` field. If you use this field for codec details, then use `DefaultDecoderFactory.listener` instead. In case of a codec exception, codec details will be available in the `ExportException.codecInfo`. - Extractors: - MPEG-TS: Roll forward the change ensuring the last frame is rendered by passing the last access unit of a stream to the sample queue ([#7909](https://togithub.com/google/ExoPlayer/issues/7909)). Incorporating fixes to resolve the issues that emerged in I-frame only HLS streams([#1150](https://togithub.com/androidx/media/issues/1150)) and H.262 HLS streams ([#1126](https://togithub.com/androidx/media/issues/1126)). - MP3: Prefer the data size from an `Info` frame over the size reported by the underlying stream (e.g. file size, or HTTP `Content-Length` header). This helps to exclude non-playable trailer data (e.g. album artwork) from constant bitrate seeking calculations, making seeks more accurate ([#1376](https://togithub.com/androidx/media/issues/1376)). - MP3: Use the frame count and other data in an `Info` frame (if present) to compute an average bitrate for constant bitrate seeking, rather than extrapolating from the bitrate of the frame after the `Info` frame, which may be artificially small, e.g. `PCUT` frame ([#1376](https://togithub.com/androidx/media/issues/1376)). - Fix PCM audio format extraction in AVI containers. - Audio: - Fix DTS:X Profile 2 encoding attributes for passthrough playback ([#1299](https://togithub.com/androidx/media/pull/1299)). - For offloaded playback, reset the tracking field for stream completion in `DefaultAudioSink` prior to calling `AudioTrack.stop()` so that `AudioTrack.StreamEventCallback#onPresentationEnded` correctly identifies when all pending data has been played. - Fix bug in `SilenceSkippingAudioProcessor` where transitions between different audio formats (for example stereo to mono) can cause the processor to throw an exception ([#1352](https://togithub.com/androidx/media/issues/1352)). - Implement `MediaCodecAudioRenderer.getDurationToProgressUs()` so that ExoPlayer will dynamically schedule its main work loop to when the MediaCodecAudioRenderer can make progress. - Video: - Fix issue where `Listener.onRenderedFirstFrame()` arrives too early when switching surfaces mid-playback. - Fix decoder fallback logic for Dolby Vision to use a compatible AV1 decoder if needed ([#1389](https://togithub.com/androidx/media/pull/1389)). - Fix codec exception that may be caused by enabling a video renderer mid-playback. - Text: - Fix issue where subtitles starting before a seek position are skipped. This issue was only introduced in Media3 1.4.0-alpha01. - Change default subtitle parsing behavior so it happens during extraction instead of during rendering (see [ExoPlayer's architecture diagram](https://developer.android.com/media/media3/exoplayer/glossary#exoplayer) for the difference between extraction and rendering). - This change can be overridden by calling **both** `MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)` and `TextRenderer.experimentalSetLegacyDecodingEnabled(true)`. See the [docs on customization](https://developer.android.com/media/media3/exoplayer/customization) for how to plumb these components into an `ExoPlayer` instance. These methods (and all support for legacy subtitle decoding) will be removed in a future release. - Apps with custom `SubtitleDecoder` implementations need to update them to implement `SubtitleParser` instead (and `SubtitleParser.Factory` instead of `SubtitleDecoderFactory`). - PGS: Fix run-length decoding to resolve `0` as a color index, instead of a literal color value ([#1367](https://togithub.com/androidx/media/pull/1367)). - 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). - This was originally included in the `1.3.0-alpha01` release notes, but the change was accidentally reverted before the `1.3.0-rc01` release. This is now fixed, so the change is present again. - CEA-708: Avoid duplicate newlines being added by ExoPlayer's naive handling of the 'set pen location' command ([#1315](https://togithub.com/androidx/media/pull/1315)). - Fix an `IllegalArgumentException` from `LegacySubtitleUtil` when a WebVTT subtitle sample contains no cues, e.g. as part of a DASH stream ([#1516](https://togithub.com/androidx/media/issues/1516)). - Metadata: - Fix mapping of MP4 to ID3 sort tags. Previously the 'album sort' (`soal`), 'artist sort' (`soar`) and 'album artist sort' (`soaa`) MP4 tags were wrongly mapped to the `TSO2`, `TSOA` and `TSOP` ID3 tags ([#1302](https://togithub.com/androidx/media/issues/1302)). - Fix reading of MP4 (/iTunes) numeric `gnre` (genre) and `tmpo` (tempo) tags when the value is more than one byte long. - Propagate ID3 `TCON` frame to `MediaMetadata.genre` ([#1305](https://togithub.com/androidx/media/issues/1305)). - Image: - Add support for non-square DASH thumbnail grids ([#1300](https://togithub.com/androidx/media/pull/1300)). - Add support for AVIF for API 34+. - Allow `null` as parameter for `ExoPlayer.setImageOutput()` to clear a previously set `ImageOutput`. - 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. - Allow `ByteArrayDataSource` to resolve a URI to a byte array during `open()`, instead of being hard-coded at construction ([#1405](https://togithub.com/androidx/media/issues/1405)). - DRM: - Allow setting a `LoadErrorHandlingPolicy` on `DefaultDrmSessionManagerProvider` ([#1271](https://togithub.com/androidx/media/issues/1271)). - 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`. - Fix bug where `TimestampWrapper` crashes when used with `ExoPlayer#setVideoEffects` ([#821](https://togithub.com/androidx/media/issues/821)). - Change default SDR color working space from linear colors to electrical BT 709 SDR video. Also provide third option to retain the original colorspace. - Allow defining indeterminate z-order of EditedMediaItemSequences ([#1055](https://togithub.com/androidx/media/pull/1055)). - Maintain a consistent luminance range across different pieces of HDR content (uses the HLG range). - Add support for Ultra HDR (bitmap) overlays on HDR content. - Allow `SeparableConvolution` effects to be used before API 26. - Remove unused `OverlaySettings.useHdr` since dynamic range of overlay and frame must match. - Add HDR support for `TextOverlay`. Luminance of the text overlay can be adjusted with `OverlaySettings.Builder.setHdrLuminanceMultiplier()`. - IMA extension: - Promote API that is required for apps to play [DAI ad streams](https://developers.google.com/ad-manager/dynamic-ad-insertion/full-service) to stable. - Add `replaceAdTagParameters(MapConfiguration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
â™» Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.