diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index bb55bdbf..dcf124c8 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -141,8 +141,8 @@ dependencies { // FFmpeg audio decoder for unsupported codecs (ALAC, DTS, TrueHD, etc.) implementation("org.jellyfin.media3:media3-ffmpeg-decoder:1.9.0+1") - // libass-android for ASS/SSA subtitle rendering (fork with font buffering fix) - implementation(files("libs/ass-media.aar")) + // libass-android for ASS/SSA subtitle rendering + implementation("io.github.peerless2012:ass-media:0.4.0") // ass-kt core library (needed for AssRender.setFontScale) - implementation("io.github.peerless2012:ass-kt:0.4.0-beta01") + implementation("io.github.peerless2012:ass-kt:0.4.0") } diff --git a/android/app/libs/ass-media.aar b/android/app/libs/ass-media.aar deleted file mode 100644 index 321642cc..00000000 Binary files a/android/app/libs/ass-media.aar and /dev/null differ diff --git a/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt b/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt index 6bc5aac5..dab961af 100644 --- a/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt +++ b/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt @@ -95,6 +95,8 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener { // Codec capability caches — codec support doesn't change at runtime private val hwAudioDecoderCache = HashMap() private val tunneledPlaybackCache = HashMap() + + private var assGlCrashHandlerInstalled = false } private var surfaceView: SurfaceView? = null @@ -446,6 +448,23 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener { // Initialize handler (registers as Player.Listener, creates Handler) handler.init(exoPlayer!!) + // Suppress ass-media GL thread crash when EGL init partially fails (e.g. Tegra). + // AssRender.onSurfaceDestroyed() accesses uninitialized glProgram lateinit property + // during error cleanup, which is a bug in the library. The render thread dying only + // affects ASS subtitle GPU rendering; non-ASS subtitles are unaffected. + if (!assGlCrashHandlerInstalled) { + assGlCrashHandlerInstalled = true + val previousHandler = Thread.getDefaultUncaughtExceptionHandler() + Thread.setDefaultUncaughtExceptionHandler { thread, throwable -> + if (thread.name.contains("AssTexRenderThread") && + throwable is UninitializedPropertyAccessException) { + Log.e(TAG, "ASS GL thread crash suppressed (EGL init failure)", throwable) + } else { + previousHandler?.uncaughtException(thread, throwable) + } + } + } + exoPlayer!!.addListener(this) exoPlayer!!.addAnalyticsListener(decoderHangListener) surfaceView?.let { exoPlayer!!.setVideoSurfaceView(it) }