mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-21 12:03:02 +00:00
Add the frame skipping code back for certain decoders (Qualcomm) that are slow when rendering all frames and stall the whole decoder pipeline
This commit is contained in:
parent
4b2552ed64
commit
c7f26a179d
@ -20,6 +20,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
private ByteBuffer[] videoDecoderInputBuffers;
|
private ByteBuffer[] videoDecoderInputBuffers;
|
||||||
private MediaCodec videoDecoder;
|
private MediaCodec videoDecoder;
|
||||||
private Thread rendererThread;
|
private Thread rendererThread;
|
||||||
|
private int redrawRate;
|
||||||
private boolean needsSpsFixup;
|
private boolean needsSpsFixup;
|
||||||
private boolean fastInputQueueing;
|
private boolean fastInputQueueing;
|
||||||
|
|
||||||
@ -97,6 +98,8 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) {
|
public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) {
|
||||||
|
this.redrawRate = redrawRate;
|
||||||
|
|
||||||
MediaCodecInfo safeDecoder = findSafeDecoder();
|
MediaCodecInfo safeDecoder = findSafeDecoder();
|
||||||
if (safeDecoder != null) {
|
if (safeDecoder != null) {
|
||||||
videoDecoder = MediaCodec.createByCodecName(safeDecoder.getName());
|
videoDecoder = MediaCodec.createByCodecName(safeDecoder.getName());
|
||||||
@ -130,6 +133,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
rendererThread = new Thread() {
|
rendererThread = new Thread() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
long nextFrameTimeUs = 0;
|
||||||
BufferInfo info = new BufferInfo();
|
BufferInfo info = new BufferInfo();
|
||||||
while (!isInterrupted())
|
while (!isInterrupted())
|
||||||
{
|
{
|
||||||
@ -149,6 +153,12 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
|
|
||||||
if (outIndex >= 0) {
|
if (outIndex >= 0) {
|
||||||
int lastIndex = outIndex;
|
int lastIndex = outIndex;
|
||||||
|
boolean render = false;
|
||||||
|
|
||||||
|
if (currentTimeUs() >= nextFrameTimeUs) {
|
||||||
|
render = true;
|
||||||
|
nextFrameTimeUs = computePresentationTime(redrawRate);
|
||||||
|
}
|
||||||
|
|
||||||
// Get the last output buffer in the queue
|
// Get the last output buffer in the queue
|
||||||
while ((outIndex = videoDecoder.dequeueOutputBuffer(info, 0)) >= 0) {
|
while ((outIndex = videoDecoder.dequeueOutputBuffer(info, 0)) >= 0) {
|
||||||
@ -156,8 +166,8 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
lastIndex = outIndex;
|
lastIndex = outIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render that buffer
|
// Render that buffer if it's time for the next frame
|
||||||
videoDecoder.releaseOutputBuffer(lastIndex, true);
|
videoDecoder.releaseOutputBuffer(lastIndex, render);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,6 +176,14 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
rendererThread.start();
|
rendererThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static long currentTimeUs() {
|
||||||
|
return System.nanoTime() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long computePresentationTime(int frameRate) {
|
||||||
|
return currentTimeUs() + (1000000 / frameRate);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start() {
|
public void start() {
|
||||||
startRendererThread();
|
startRendererThread();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user