From a8e690df79cb330530659ffd0773ab06b7daf239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20L=C3=BCdeke?= Date: Mon, 27 Jan 2025 22:30:29 +0100 Subject: [PATCH] request IDR immediately --- .../genymobile/scrcpy/video/CaptureIdr.java | 21 +++++++++++++++++++ .../scrcpy/video/SurfaceEncoder.java | 13 +++--------- 2 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 server/src/main/java/com/genymobile/scrcpy/video/CaptureIdr.java diff --git a/server/src/main/java/com/genymobile/scrcpy/video/CaptureIdr.java b/server/src/main/java/com/genymobile/scrcpy/video/CaptureIdr.java new file mode 100644 index 00000000..de140dd3 --- /dev/null +++ b/server/src/main/java/com/genymobile/scrcpy/video/CaptureIdr.java @@ -0,0 +1,21 @@ +package com.genymobile.scrcpy.video; + +import android.media.MediaCodec; +import android.os.Bundle; + +public class CaptureIdr { + + // Current instance of MediaCodec to "interrupt" on reset + private MediaCodec runningMediaCodec; + + public synchronized void requestIdr() { + Bundle bundle = new Bundle(); + bundle.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); + this.runningMediaCodec.setParameters(bundle); + } + + public synchronized void setRunningMediaCodec(MediaCodec runningMediaCodec) { + this.runningMediaCodec = runningMediaCodec; + } + +} diff --git a/server/src/main/java/com/genymobile/scrcpy/video/SurfaceEncoder.java b/server/src/main/java/com/genymobile/scrcpy/video/SurfaceEncoder.java index 4d01f688..e36320b1 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/SurfaceEncoder.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/SurfaceEncoder.java @@ -52,8 +52,7 @@ public class SurfaceEncoder implements AsyncProcessor { private final AtomicBoolean stopped = new AtomicBoolean(); private final CaptureReset reset = new CaptureReset(); - - private final AtomicBoolean idrRequested = new AtomicBoolean(); + private final CaptureIdr requestIdr = new CaptureIdr(); public SurfaceEncoder(SurfaceCapture capture, Streamer streamer, Options options) { this.capture = capture; @@ -71,6 +70,7 @@ public class SurfaceEncoder implements AsyncProcessor { MediaFormat format = createFormat(codec.getMimeType(), videoBitRate, maxFps, codecOptions); capture.init(reset); + requestIdr.setRunningMediaCodec(mediaCodec); try { boolean alive; @@ -202,13 +202,6 @@ public class SurfaceEncoder implements AsyncProcessor { boolean eos; do { - if (idrRequested.get()) { - Bundle bundle = new Bundle(); - bundle.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); - codec.setParameters(bundle); - idrRequested.set(false); - } - int outputBufferId = codec.dequeueOutputBuffer(bufferInfo, -1); try { eos = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; @@ -335,6 +328,6 @@ public class SurfaceEncoder implements AsyncProcessor { } public void requestIdr() { - idrRequested.set(true); + requestIdr.requestIdr(); } }