request IDR immediately

This commit is contained in:
Andreas Lüdeke 2025-01-27 22:30:29 +01:00
parent 48b780e95b
commit a8e690df79
No known key found for this signature in database
GPG key ID: 8904863CEE2E3CA0
2 changed files with 24 additions and 10 deletions

View file

@ -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;
}
}

View file

@ -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();
}
}