Limit the number of codec recovery attempts

This commit is contained in:
Cameron Gutman
2022-09-16 03:27:22 -05:00
parent be25a7d594
commit f216834df7
@@ -72,6 +72,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
private PerfOverlayListener perfListener; private PerfOverlayListener perfListener;
private static final int CR_TIMEOUT_MS = 5000; private static final int CR_TIMEOUT_MS = 5000;
private static final int CR_MAX_TRIES = 10;
private volatile boolean needsRestart; private volatile boolean needsRestart;
private volatile boolean needsReset; private volatile boolean needsReset;
private final Object codecRecoveryMonitor = new Object(); private final Object codecRecoveryMonitor = new Object();
@@ -83,6 +84,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
private static final int CR_FLAG_CHOREOGRAPHER = 0x4; private static final int CR_FLAG_CHOREOGRAPHER = 0x4;
private static final int CR_FLAG_ALL = CR_FLAG_INPUT_THREAD | CR_FLAG_RENDER_THREAD | CR_FLAG_CHOREOGRAPHER; private static final int CR_FLAG_ALL = CR_FLAG_INPUT_THREAD | CR_FLAG_RENDER_THREAD | CR_FLAG_CHOREOGRAPHER;
private int codecRecoveryThreadQuiescedFlags = 0; private int codecRecoveryThreadQuiescedFlags = 0;
private int codecRecoveryAttempts = 0;
private MediaFormat inputFormat; private MediaFormat inputFormat;
private MediaFormat outputFormat; private MediaFormat outputFormat;
@@ -520,6 +522,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
if (codecRecoveryThreadQuiescedFlags == CR_FLAG_ALL) { if (codecRecoveryThreadQuiescedFlags == CR_FLAG_ALL) {
// This is the final thread to quiesce, so let's perform the codec recovery now. // This is the final thread to quiesce, so let's perform the codec recovery now.
codecRecoveryAttempts++;
// Input and output buffers are invalidated by stop() and reset(). // Input and output buffers are invalidated by stop() and reset().
nextInputBuffer = null; nextInputBuffer = null;
@@ -577,6 +580,9 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
// Returns true if the exception is transient // Returns true if the exception is transient
private boolean handleDecoderException(RuntimeException e, ByteBuffer buf, int codecFlags) { private boolean handleDecoderException(RuntimeException e, ByteBuffer buf, int codecFlags) {
// Print the stack trace for debugging purposes
e.printStackTrace();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (e instanceof CodecException) { if (e instanceof CodecException) {
CodecException codecExc = (CodecException) e; CodecException codecExc = (CodecException) e;
@@ -590,15 +596,17 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
LimeLog.severe(codecExc.getDiagnosticInfo()); LimeLog.severe(codecExc.getDiagnosticInfo());
// We can attempt a recovery or reset at this stage to try to start decoding again // We can attempt a recovery or reset at this stage to try to start decoding again
if (codecExc.isRecoverable()) { if (codecRecoveryAttempts < CR_MAX_TRIES) {
needsRestart = true; if (codecExc.isRecoverable()) {
} needsRestart = true;
else { }
needsReset = true; else {
} needsReset = true;
}
// The recovery will take place when all threads reach doCodecRecoveryIfRequired(). // The recovery will take place when all threads reach doCodecRecoveryIfRequired().
return false; return false;
}
} }
} }