Decouple direct submit producer and polling consumer

This commit is contained in:
Cameron Gutman 2017-05-21 13:48:02 -07:00
parent ac640a6842
commit ad1c11bba5
2 changed files with 30 additions and 6 deletions

View File

@ -31,7 +31,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
private MediaCodecInfo hevcDecoder; private MediaCodecInfo hevcDecoder;
private MediaCodec videoDecoder; private MediaCodec videoDecoder;
private Thread rendererThread; private Thread rendererThread, spinnerThread;
private boolean needsSpsBitstreamFixup, isExynos4; private boolean needsSpsBitstreamFixup, isExynos4;
private boolean adaptivePlayback, directSubmit; private boolean adaptivePlayback, directSubmit;
private boolean constrainedHighProfile; private boolean constrainedHighProfile;
@ -299,8 +299,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
while (!isInterrupted()) { while (!isInterrupted()) {
try { try {
// Try to output a frame // Try to output a frame
int outIndex = videoDecoder.dequeueOutputBuffer(info, int outIndex = videoDecoder.dequeueOutputBuffer(info, 50000);
directSubmit ? 50000 : 0);
if (outIndex >= 0) { if (outIndex >= 0) {
long presentationTimeUs = info.presentationTimeUs; long presentationTimeUs = info.presentationTimeUs;
int lastIndex = outIndex; int lastIndex = outIndex;
@ -327,9 +326,6 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
} else { } else {
switch (outIndex) { switch (outIndex) {
case MediaCodec.INFO_TRY_AGAIN_LATER: case MediaCodec.INFO_TRY_AGAIN_LATER:
if (!directSubmit) {
Thread.yield();
}
break; break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
LimeLog.info("Output format changed"); LimeLog.info("Output format changed");
@ -350,6 +346,21 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
rendererThread.start(); rendererThread.start();
} }
private void startSpinnerThread() {
spinnerThread = new Thread() {
@Override
public void run() {
// This thread exists to keep the CPU at a higher DVFS state on devices
// where the governor scales clock speed sporadically, causing dropped frames.
while (!isInterrupted()) {
Thread.yield();
}
}
};
spinnerThread.setPriority(Thread.MIN_PRIORITY);
spinnerThread.start();
}
private int dequeueInputBuffer() { private int dequeueInputBuffer() {
int index = -1; int index = -1;
long startTime, queueTime; long startTime, queueTime;
@ -381,6 +392,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
@Override @Override
public void start() { public void start() {
startRendererThread(); startRendererThread();
startSpinnerThread();
} }
@Override @Override
@ -392,6 +404,12 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
try { try {
rendererThread.join(); rendererThread.join();
} catch (InterruptedException ignored) { } } catch (InterruptedException ignored) { }
// Halt the spinner thread
spinnerThread.interrupt();
try {
spinnerThread.join();
} catch (InterruptedException ignored) { }
} }
@Override @Override
@ -697,6 +715,11 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
capabilities |= MoonBridge.CAPABILITY_REFERENCE_FRAME_INVALIDATION_HEVC; capabilities |= MoonBridge.CAPABILITY_REFERENCE_FRAME_INVALIDATION_HEVC;
} }
// Enable direct submit on supported hardware
if (directSubmit) {
capabilities |= MoonBridge.CAPABILITY_DIRECT_SUBMIT;
}
return capabilities; return capabilities;
} }

View File

@ -47,6 +47,7 @@ public class MediaCodecHelper {
directSubmitPrefixes.add("omx.brcm"); directSubmitPrefixes.add("omx.brcm");
directSubmitPrefixes.add("omx.TI"); directSubmitPrefixes.add("omx.TI");
directSubmitPrefixes.add("omx.arc"); directSubmitPrefixes.add("omx.arc");
directSubmitPrefixes.add("omx.nvidia");
} }
static { static {