fix: harden playback and discover state

This commit is contained in:
edde746
2026-06-14 09:44:04 +02:00
parent 849e62df7e
commit edd0618e64
9 changed files with 252 additions and 105 deletions
@@ -112,8 +112,8 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
private var assGlCrashHandlerInstalled = false
private var cronetEngine: CronetEngine? = null
private var cronetUnavailable = false
@Volatile private var cronetEngine: CronetEngine? = null
@Volatile private var cronetUnavailable = false
private fun getCronetEngine(context: Context): CronetEngine? {
cronetEngine?.let { return it }
if (cronetUnavailable) return null
@@ -2836,6 +2836,10 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
} else {
positionMs.coerceAtLeast(0L)
}
// A user seek is authoritative. Do not let a pending start-position restore
// from open/reload recovery re-seek back over an early seek near zero once
// ExoPlayer reports STATE_READY.
pendingStartPositionMs = 0L
player.seekTo(clampedPositionMs)
lastPosition = clampedPositionMs
delegate?.onPropertyChange("time-pos", clampedPositionMs / 1000.0)
@@ -115,12 +115,25 @@ class AssHandler(
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
super.onMediaItemTransition(mediaItem, reason)
Log.i("AssHandler", "onMediaItemTransition: item = $mediaItem, reason = $reason")
resetMediaState(releaseNative = true)
}
private fun resetMediaState(releaseNative: Boolean) {
val oldRender = render
val oldTracks = availableTracks.values.toList()
render = null
track = null
format = null
availableTracks.clear()
pendingFonts.clear()
videoSize = Size.ZERO
renderCallback?.invoke(null)
if (releaseNative) {
oldRender?.release()
oldTracks.forEach { it.release() }
}
}
/**
@@ -359,12 +372,7 @@ class AssHandler(
videoFrameCallback = null
player?.clearVideoFrameMetadataListener(videoFrameMetadataListener)
player = null
render?.release()
render = null
availableTracks.values.forEach { it.release() }
availableTracks.clear()
track = null
pendingFonts.clear()
resetMediaState(releaseNative = true)
if (assDelegate.isInitialized()) {
ass.release()
}