From c8df37e89ef7fb8096fe48911b138669b474faa1 Mon Sep 17 00:00:00 2001 From: ns6089 <61738816+ns6089@users.noreply.github.com> Date: Sun, 14 May 2023 11:33:51 +0300 Subject: [PATCH] Compensate for choreographer vsync offset --- .../binding/video/MediaCodecDecoderRenderer.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 74e47f50..035c9e70 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -20,6 +20,7 @@ import com.limelight.nvstream.jni.MoonBridge; import com.limelight.preferences.PreferenceConfiguration; import android.annotation.TargetApi; +import android.app.Activity; import android.content.Context; import android.media.MediaCodec; import android.media.MediaCodecInfo; @@ -57,6 +58,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C private ByteBuffer nextInputBuffer; private Context context; + private Activity activity; private MediaCodec videoDecoder; private Thread rendererThread; private boolean needsSpsBitstreamFixup, isExynos4; @@ -233,13 +235,14 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C this.renderTarget = renderTarget; } - public MediaCodecDecoderRenderer(Context context, PreferenceConfiguration prefs, + public MediaCodecDecoderRenderer(Activity activity, PreferenceConfiguration prefs, CrashListener crashListener, int consecutiveCrashCount, boolean meteredData, boolean requestedHdr, String glRenderer, PerfOverlayListener perfListener) { //dumpDecoders(); - this.context = context; + this.context = activity; + this.activity = activity; this.prefs = prefs; this.crashListener = crashListener; this.consecutiveCrashCount = consecutiveCrashCount; @@ -871,6 +874,10 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C return; } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + frameTimeNanos -= activity.getWindowManager().getDefaultDisplay().getAppVsyncOffsetNanos(); + } + // Don't render unless a new frame is due. This prevents microstutter when streaming // at a frame rate that doesn't match the display (such as 60 FPS on 120 Hz). long actualFrameTimeDeltaNs = frameTimeNanos - lastRenderedFrameTimeNanos;