From c75c87f527fbef05a766f0495125580011dc6cff Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Wed, 6 May 2026 10:47:40 +0200 Subject: [PATCH] fix(android): sync mpv display fps override --- .../com/edde746/plezy/mpv/MpvPlayerCore.kt | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt b/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt index 8bc01226..a3189f80 100644 --- a/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt +++ b/android/app/src/main/kotlin/com/edde746/plezy/mpv/MpvPlayerCore.kt @@ -105,6 +105,29 @@ class MpvPlayerCore(private val activity: Activity) : SurfaceHolder.Callback { Log.d(TAG, "Created MPV placeholder surface") } + private fun currentDisplayFpsOverride(): String? { + val refreshRate = activity.display?.mode?.refreshRate ?: return null + if (refreshRate <= 0f) return null + return refreshRate.toString() + } + + private fun updateDisplayFpsOverride(p: MpvPlayer, reason: String) { + val fps = currentDisplayFpsOverride() + if (fps == null) { + Log.d(TAG, "Skipping display-fps-override update ($reason): no display rate") + return + } + + try { + runBlocking(Dispatchers.IO) { + p.setProperty("display-fps-override", fps) + } + Log.d(TAG, "Updated display-fps-override=$fps ($reason)") + } catch (e: Exception) { + Log.w(TAG, "Failed to update display-fps-override ($reason)", e) + } + } + fun initialize(onResult: (Boolean) -> Unit) { if (isInitialized) { Log.d(TAG, "Already initialized") @@ -207,12 +230,19 @@ class MpvPlayerCore(private val activity: Activity) : SurfaceHolder.Callback { onResult(false) return@launch } + val displayFpsOverride = currentDisplayFpsOverride() val p = MpvPlayer.create(activity.applicationContext) { setOption("vo", "gpu") setOption("gpu-context", "android") setOption("opengl-es", "yes") setOption("vd-lavc-film-grain", "cpu") setOption("ao", "audiotrack,opensles") + if (displayFpsOverride != null) { + setOption("display-fps-override", displayFpsOverride) + } + } + if (displayFpsOverride != null) { + Log.d(TAG, "Initial display-fps-override=$displayFpsOverride") } if (disposing) { @@ -747,7 +777,10 @@ class MpvPlayerCore(private val activity: Activity) : SurfaceHolder.Callback { onComplete(false) return } - mgr.setVideoFrameRate(fps, videoDurationMs, surfaceView?.holder?.surface, extraDelayMs, onComplete) + mgr.setVideoFrameRate(fps, videoDurationMs, surfaceView?.holder?.surface, extraDelayMs) { switched -> + player?.let { updateDisplayFpsOverride(it, "frame rate switch, switched=$switched") } + onComplete(switched) + } } fun clearVideoFrameRate() {