diff --git a/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java b/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java index f7d8802c..dadd9d12 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java +++ b/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java @@ -9,6 +9,7 @@ import android.media.MediaCodecList; import android.media.MediaFormat; import android.os.Build; import android.os.IBinder; +import android.os.SystemClock; import android.view.Surface; import java.io.FileDescriptor; @@ -106,6 +107,17 @@ public class ScreenEncoder implements Device.RotationListener { alive = encode(codec, fd); // do not call stop() on exception, it would trigger an IllegalStateException codec.stop(); + } catch (MediaCodec.CodecException e) { + Ln.e("Codec error: " + e.getMessage()); + // + // For simplicity, handle isTransient() like isRecoverable() + if (e.isRecoverable() || e.isTransient()) { + // Avoid busy-loop if too many errors are generated + SystemClock.sleep(50); + } else if (!prepareDownsizeRetry(device, screenInfo)) { + throw e; + } + alive = true; } catch (IllegalStateException | IllegalArgumentException e) { Ln.e("Encoding error: " + e.getClass().getName() + ": " + e.getMessage()); if (!prepareDownsizeRetry(device, screenInfo)) {