Playing M4A produces a lot of sequential onTimelineChanged events with the reason SOURCE_UPDATE
- Dominant language
- Java
- Stars
- 21.9k
- Forks
- 6k
- PR merge metrics
- No merged PRs in 30d
Description
### ExoPlayer Version
2.18.2
### Devices that reproduce the issue
All devices and emulators.
### Devices that do not reproduce the issue
_No response_
### Reproducible in the demo app?
Yes
### Reproduction steps
Play the attached file in the demo app.
### Expected result
Exoplayer doesn't produces so many heavy events sequentially.
### Actual result
Exoplayer produces many `onTimelineChanged` events which finally triggers heavy `PlayerNotificationManager#startOrUpdateNotification` and `MediaSessionConnector.ComponentListener#onEvents` (`TimelineQueueNavigator#publishFloatingQueueWindow`, `MediaSessionConnector#invalidateMediaSessionMetadata` and `MediaSessionConnector#invalidateMediaSessionPlaybackState`).
Because of this my app freezes for 5-15 seconds or even crashes at start of playing attached m4a.
Demo app doesn't freeze (because doesn't has a notification and media session connection), but also generates many events.


I did a little digging and got the following:
- Log of the EventLogger:
```
2023-02-05 02:40:22.261 29007-29007 EventLogger D timeline [eventTime=12.61, mediaPos=0.00, window=0, periodCount=1, windowCount=1, reason=PLAYLIST_CHANGED
2023-02-05 02:40:22.261 29007-29007 EventLogger D period [?]
2023-02-05 02:40:22.261 29007-29007 EventLogger D window [?, seekable=false, dynamic=true]
2023-02-05 02:40:22.261 29007-29007 EventLogger D ]
2023-02-05 02:40:22.261 29007-29007 EventLogger D mediaItem [eventTime=12.61, mediaPos=0.00, window=0, reason=PLAYLIST_CHANGED]
2023-02-05 02:40:22.263 29007-29007 EventLogger D state [eventTime=12.62, mediaPos=0.00, window=0, BUFFERING]
2023-02-05 02:40:22.268 29007-29007 EventLogger D playWhenReady [eventTime=12.62, mediaPos=0.00, window=0, true, USER_REQUEST]
2023-02-05 02:40:22.295 29007-29007 EventLogger D timeline [eventTime=12.65, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.295 29007-29007 EventLogger D period [?]
2023-02-05 02:40:22.295 29007-29007 EventLogger D window [?, seekable=false, dynamic=false]
2023-02-05 02:40:22.295 29007-29007 EventLogger D ]
2023-02-05 02:40:22.297 29007-29007 EventLogger D loading [eventTime=12.65, mediaPos=0.00, window=0, period=0, true]
2023-02-05 02:40:22.311 29007-29007 EventLogger D timeline [eventTime=12.66, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.311 29007-29007 EventLogger D period [1.00]
2023-02-05 02:40:22.311 29007-29007 EventLogger D window [1.00, seekable=true, dynamic=false]
2023-02-05 02:40:22.311 29007-29007 EventLogger D ]
2023-02-05 02:40:22.332 29007-29007 EventLogger D audioEnabled [eventTime=12.69, mediaPos=0.00, window=0, period=0]
2023-02-05 02:40:22.334 29007-29007 EventLogger D tracks [eventTime=12.69, mediaPos=0.00, window=0, period=0
2023-02-05 02:40:22.334 29007-29007 EventLogger D group [
2023-02-05 02:40:22.334 29007-29007 EventLogger D [X] Track:0, id=1, mimeType=audio/mp4a-latm, bitrate=256000, codecs=mp4a.40.2, channels=2, sample_rate=48000, language=und, supported=YES
2023-02-05 02:40:22.334 29007-29007 EventLogger D ]
2023-02-05 02:40:22.334 29007-29007 EventLogger D ]
2023-02-05 02:40:22.334 29007-29007 EventLogger D downstreamFormat [eventTime=12.69, mediaPos=0.00, window=0, period=0, id=1, mimeType=audio/mp4a-latm, bitrate=256000, codecs=mp4a.40.2, channels=2, sample_rate=48000, language=und]
2023-02-05 02:40:22.454 29007-29007 EventLogger D audioDecoderInitialized [eventTime=12.81, mediaPos=0.00, window=0, period=0, c2.android.aac.decoder]
2023-02-05 02:40:22.455 29007-29007 EventLogger D audioInputFormat [eventTime=12.81, mediaPos=0.00, window=0, period=0, id=1, mimeType=audio/mp4a-latm, bitrate=256000, codecs=mp4a.40.2, channels=2, sample_rate=48000, language=und]
2023-02-05 02:40:22.468 29007-29007 EventLogger D state [eventTime=12.82, mediaPos=0.00, window=0, period=0, READY]
2023-02-05 02:40:22.468 29007-29007 EventLogger D isPlaying [eventTime=12.82, mediaPos=0.00, window=0, period=0, true]
2023-02-05 02:40:22.469 29007-29007 EventLogger D timeline [eventTime=12.82, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.469 29007-29007 EventLogger D period [32.00]
2023-02-05 02:40:22.469 29007-29007 EventLogger D window [32.00, seekable=true, dynamic=false]
2023-02-05 02:40:22.470 29007-29007 EventLogger D ]
2023-02-05 02:40:22.546 29007-29007 EventLogger D timeline [eventTime=12.90, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.546 29007-29007 EventLogger D period [33.00]
2023-02-05 02:40:22.546 29007-29007 EventLogger D window [33.00, seekable=true, dynamic=false]
2023-02-05 02:40:22.546 29007-29007 EventLogger D ]
2023-02-05 02:40:22.591 29007-29007 EventLogger D timeline [eventTime=12.94, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.591 29007-29007 EventLogger D period [34.01]
2023-02-05 02:40:22.591 29007-29007 EventLogger D window [34.01, seekable=true, dynamic=false]
2023-02-05 02:40:22.591 29007-29007 EventLogger D ]
2023-02-05 02:40:22.634 29007-29007 EventLogger D timeline [eventTime=12.99, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.634 29007-29007 EventLogger D period [35.01]
2023-02-05 02:40:22.634 29007-29007 EventLogger D window [35.01, seekable=true, dynamic=false]
2023-02-05 02:40:22.634 29007-29007 EventLogger D ]
2023-02-05 02:40:22.699 29007-29007 EventLogger D timeline [eventTime=13.05, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.699 29007-29007 EventLogger D period [36.01]
2023-02-05 02:40:22.699 29007-29007 EventLogger D window [36.01, seekable=true, dynamic=false]
2023-02-05 02:40:22.699 29007-29007 EventLogger D ]
2023-02-05 02:40:22.755 29007-29007 EventLogger D timeline [eventTime=13.11, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.755 29007-29007 EventLogger D period [37.01]
2023-02-05 02:40:22.756 29007-29007 EventLogger D window [37.01, seekable=true, dynamic=false]
2023-02-05 02:40:22.756 29007-29007 EventLogger D ]
2023-02-05 02:40:22.791 29007-29007 EventLogger D timeline [eventTime=13.15, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.791 29007-29007 EventLogger D period [38.02]
2023-02-05 02:40:22.791 29007-29007 EventLogger D window [38.02, seekable=true, dynamic=false]
2023-02-05 02:40:22.791 29007-29007 EventLogger D ]
2023-02-05 02:40:22.827 29007-29007 EventLogger D timeline [eventTime=13.18, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.827 29007-29007 EventLogger D period [39.02]
2023-02-05 02:40:22.827 29007-29007 EventLogger D window [39.02, seekable=true, dynamic=false]
2023-02-05 02:40:22.827 29007-29007 EventLogger D ]
2023-02-05 02:40:22.856 29007-29007 EventLogger D timeline [eventTime=13.21, mediaPos=0.00, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:22.857 29007-29007 EventLogger D period [40.00]
2023-02-05 02:40:22.857 29007-29007 EventLogger D window [40.00, seekable=true, dynamic=false]
2023-02-05 02:40:22.857 29007-29007 EventLogger D ]
...
2023-02-05 02:40:27.077 29007-29007 EventLogger D timeline [eventTime=17.43, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.078 29007-29007 EventLogger D period [181.01]
2023-02-05 02:40:27.078 29007-29007 EventLogger D window [181.01, seekable=true, dynamic=false]
2023-02-05 02:40:27.078 29007-29007 EventLogger D ]
2023-02-05 02:40:27.106 29007-29007 EventLogger D timeline [eventTime=17.46, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.106 29007-29007 EventLogger D period [182.02]
2023-02-05 02:40:27.106 29007-29007 EventLogger D window [182.02, seekable=true, dynamic=false]
2023-02-05 02:40:27.106 29007-29007 EventLogger D ]
2023-02-05 02:40:27.198 29007-29007 EventLogger D timeline [eventTime=17.55, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.198 29007-29007 EventLogger D period [183.02]
2023-02-05 02:40:27.198 29007-29007 EventLogger D window [183.02, seekable=true, dynamic=false]
2023-02-05 02:40:27.198 29007-29007 EventLogger D ]
2023-02-05 02:40:27.252 29007-29007 EventLogger D timeline [eventTime=17.61, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.252 29007-29007 EventLogger D period [184.00]
2023-02-05 02:40:27.252 29007-29007 EventLogger D window [184.00, seekable=true, dynamic=false]
2023-02-05 02:40:27.252 29007-29007 EventLogger D ]
2023-02-05 02:40:27.313 29007-29007 EventLogger D timeline [eventTime=17.67, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.313 29007-29007 EventLogger D period [185.00]
2023-02-05 02:40:27.313 29007-29007 EventLogger D window [185.00, seekable=true, dynamic=false]
2023-02-05 02:40:27.313 29007-29007 EventLogger D ]
2023-02-05 02:40:27.370 29007-29007 EventLogger D timeline [eventTime=17.72, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.370 29007-29007 EventLogger D period [186.01]
2023-02-05 02:40:27.370 29007-29007 EventLogger D window [186.01, seekable=true, dynamic=false]
2023-02-05 02:40:27.370 29007-29007 EventLogger D ]
2023-02-05 02:40:27.435 29007-29007 EventLogger D timeline [eventTime=17.79, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.435 29007-29007 EventLogger D period [187.01]
2023-02-05 02:40:27.435 29007-29007 EventLogger D window [187.01, seekable=true, dynamic=false]
2023-02-05 02:40:27.435 29007-29007 EventLogger D ]
2023-02-05 02:40:27.466 29007-29007 EventLogger D timeline [eventTime=17.82, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.466 29007-29007 EventLogger D period [188.01]
2023-02-05 02:40:27.466 29007-29007 EventLogger D window [188.01, seekable=true, dynamic=false]
2023-02-05 02:40:27.466 29007-29007 EventLogger D ]
2023-02-05 02:40:27.521 29007-29007 EventLogger D timeline [eventTime=17.87, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.521 29007-29007 EventLogger D period [189.01]
2023-02-05 02:40:27.521 29007-29007 EventLogger D window [189.01, seekable=true, dynamic=false]
2023-02-05 02:40:27.521 29007-29007 EventLogger D ]
2023-02-05 02:40:27.552 29007-29007 EventLogger D timeline [eventTime=17.91, mediaPos=0.09, window=0, period=0, periodCount=1, windowCount=1, reason=SOURCE_UPDATE
2023-02-05 02:40:27.552 29007-29007 EventLogger D period [190.02]
2023-02-05 02:40:27.552 29007-29007 EventLogger D window [190.02, seekable=true, dynamic=false]
2023-02-05 02:40:27.552 29007-29007 EventLogger D ]
```
- Previous events were generated because of `extractorOutput.seekMap(parseSidx(...))` on every `sidx` frame in `FragmentedMp4Extractor#onLeafAtomRead`.
Log:
```
ChunkIndex(length=1, sizes=[32179], offsets=[793], timeUs=[0], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[33349], offsets=[33024], timeUs=[1002666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32581], offsets=[66425], timeUs=[2005333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32744], offsets=[99058], timeUs=[3008000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[33090], offsets=[131854], timeUs=[4010666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32217], offsets=[164996], timeUs=[5013333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[33071], offsets=[197265], timeUs=[6016000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[32502], offsets=[230388], timeUs=[7018666], durationsUs=[981334])
ChunkIndex(length=1, sizes=[32012], offsets=[262942], timeUs=[8000000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[33702], offsets=[295006], timeUs=[9002666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32580], offsets=[328760], timeUs=[10005333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32256], offsets=[361392], timeUs=[11008000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[33226], offsets=[393700], timeUs=[12010666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32406], offsets=[426978], timeUs=[13013333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[33037], offsets=[459436], timeUs=[14016000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[32585], offsets=[492525], timeUs=[15018666], durationsUs=[981334])
ChunkIndex(length=1, sizes=[31998], offsets=[525162], timeUs=[16000000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[32982], offsets=[557212], timeUs=[17002666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[33203], offsets=[590246], timeUs=[18005333], durationsUs=[1002667])
...
ChunkIndex(length=1, sizes=[32476], offsets=[1562542], timeUs=[48000000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[32649], offsets=[1595070], timeUs=[49002666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32527], offsets=[1627771], timeUs=[50005333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32471], offsets=[1660350], timeUs=[51008000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[32979], offsets=[1692873], timeUs=[52010666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32806], offsets=[1725904], timeUs=[53013333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[33041], offsets=[1758762], timeUs=[54016000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[31672], offsets=[1791855], timeUs=[55018666], durationsUs=[981334])
ChunkIndex(length=1, sizes=[32266], offsets=[1823579], timeUs=[56000000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[32511], offsets=[1855897], timeUs=[57002666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32148], offsets=[1888460], timeUs=[58005333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32166], offsets=[1920660], timeUs=[59008000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[33088], offsets=[1952878], timeUs=[60010666], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[33134], offsets=[1986018], timeUs=[61013333], durationsUs=[1002667])
ChunkIndex(length=1, sizes=[32524], offsets=[2019204], timeUs=[62016000], durationsUs=[1002666])
ChunkIndex(length=1, sizes=[32108], offsets=[2051780], timeUs=[63018666], durationsUs=[981334])
ChunkIndex(length=1, sizes=[32840], offsets=[2083940], timeUs=[64000000], durationsUs=[1002666])
```
- The only difference between timelines is the value of `Timeline.window.durationUs`.
I don't know, maybe my media is corrupted or it's exoplayer bug, but how I can avoid this events spam or at least throttle it?
Media is not under my control, so the only way is to fix the client side.
### Media
[media.zip](https://github.com/google/ExoPlayer/files/10610069/media.zip)
### Bug Report
- [ ] You will email the zip file produced by `adb bugreport` to dev.exoplayer@gmail.com after filing this issue.
Contributor guide
Assessment
This issue has not been assessed yet.