Use a less power intensive way of keeping the DVFS state friendly

This commit is contained in:
Cameron Gutman 2017-05-29 20:11:39 -07:00
parent 49e51f5f6f
commit 08bcd97594

View File

@ -31,7 +31,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
private MediaCodecInfo hevcDecoder; private MediaCodecInfo hevcDecoder;
private MediaCodec videoDecoder; private MediaCodec videoDecoder;
private Thread rendererThread, spinnerThread; private Thread rendererThread;
private Thread[] spinnerThreads;
private boolean needsSpsBitstreamFixup, isExynos4; private boolean needsSpsBitstreamFixup, isExynos4;
private boolean adaptivePlayback, directSubmit; private boolean adaptivePlayback, directSubmit;
private boolean constrainedHighProfile; private boolean constrainedHighProfile;
@ -97,6 +98,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
public MediaCodecDecoderRenderer(int videoFormat) { public MediaCodecDecoderRenderer(int videoFormat) {
//dumpDecoders(); //dumpDecoders();
spinnerThreads = new Thread[Runtime.getRuntime().availableProcessors()];
avcDecoder = findAvcDecoder(); avcDecoder = findAvcDecoder();
if (avcDecoder != null) { if (avcDecoder != null) {
LimeLog.info("Selected AVC decoder: "+avcDecoder.getName()); LimeLog.info("Selected AVC decoder: "+avcDecoder.getName());
@ -346,19 +349,26 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
rendererThread.start(); rendererThread.start();
} }
private void startSpinnerThread() { private void startSpinnerThreads() {
spinnerThread = new Thread() { LimeLog.info("Using "+spinnerThreads.length+" spinner threads");
@Override for (int i = 0; i < spinnerThreads.length; i++) {
public void run() { spinnerThreads[i] = new Thread() {
// This thread exists to keep the CPU at a higher DVFS state on devices @Override
// where the governor scales clock speed sporadically, causing dropped frames. public void run() {
while (!isInterrupted()) { // This thread exists to keep the CPU at a higher DVFS state on devices
Thread.yield(); // where the governor scales clock speed sporadically, causing dropped frames.
while (!isInterrupted()) {
try {
Thread.sleep(0, 1);
} catch (InterruptedException e) {
break;
}
}
} }
} };
}; spinnerThreads[i].setPriority(Thread.MIN_PRIORITY);
spinnerThread.setPriority(Thread.MIN_PRIORITY); spinnerThreads[i].start();
spinnerThread.start(); }
} }
private int dequeueInputBuffer() { private int dequeueInputBuffer() {
@ -392,7 +402,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
@Override @Override
public void start() { public void start() {
startRendererThread(); startRendererThread();
startSpinnerThread(); startSpinnerThreads();
} }
@Override @Override
@ -405,11 +415,15 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer {
rendererThread.join(); rendererThread.join();
} catch (InterruptedException ignored) { } } catch (InterruptedException ignored) { }
// Halt the spinner thread // Halt the spinner threads
spinnerThread.interrupt(); for (Thread t : spinnerThreads) {
try { t.interrupt();
spinnerThread.join(); }
} catch (InterruptedException ignored) { } for (Thread t : spinnerThreads) {
try {
t.join();
} catch (InterruptedException ignored) { }
}
} }
@Override @Override