From 869cbe2e81341f14e91f8ea425e2d9fe8989210b Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 19 Jun 2014 19:13:16 -0700 Subject: [PATCH] Frame latency and jitter improvements --- libs/limelight-common.jar | Bin 208613 -> 207441 bytes .../video/AndroidCpuDecoderRenderer.java | 20 ++-- .../video/ConfigurableDecoderRenderer.java | 11 +- .../video/MediaCodecDecoderRenderer.java | 104 ++++++------------ 4 files changed, 47 insertions(+), 88 deletions(-) diff --git a/libs/limelight-common.jar b/libs/limelight-common.jar index f6fc5913528d81ee92f3b72183bc53f38d0eaa41..1e8b23c88472f5b688c3b457dcfbc9adf8b26b12 100644 GIT binary patch delta 10916 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 delta 12096 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 WAIT_CEILING_MS) { - try { - Thread.sleep(diff); - } catch (InterruptedException e) { - return; - } + continue; } nextFrameTime = computePresentationTimeMs(targetFps); @@ -165,6 +167,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { } }; rendererThread.setName("Video - Renderer (CPU)"); + rendererThread.setPriority(Thread.MAX_PRIORITY); rendererThread.start(); } @@ -186,8 +189,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { AvcDecoder.destroy(); } - @Override - public boolean submitDecodeUnit(DecodeUnit decodeUnit) { + private boolean submitDecodeUnit(DecodeUnit decodeUnit) { byte[] data; // Use the reserved decoder buffer if this decode unit will fit diff --git a/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java b/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java index ed27435e..40baf794 100644 --- a/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java +++ b/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java @@ -1,7 +1,7 @@ package com.limelight.binding.video; -import com.limelight.nvstream.av.DecodeUnit; import com.limelight.nvstream.av.video.VideoDecoderRenderer; +import com.limelight.nvstream.av.video.VideoDepacketizer; public class ConfigurableDecoderRenderer implements VideoDecoderRenderer { @@ -26,8 +26,8 @@ public class ConfigurableDecoderRenderer implements VideoDecoderRenderer { } @Override - public void start() { - decoderRenderer.start(); + public void start(VideoDepacketizer depacketizer) { + decoderRenderer.start(depacketizer); } @Override @@ -35,11 +35,6 @@ public class ConfigurableDecoderRenderer implements VideoDecoderRenderer { decoderRenderer.stop(); } - @Override - public boolean submitDecodeUnit(DecodeUnit du) { - return decoderRenderer.submitDecodeUnit(du); - } - @Override public int getCapabilities() { return decoderRenderer.getCapabilities(); diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index d9150527..8b7fd3ed 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -8,6 +8,7 @@ import com.limelight.LimeLog; import com.limelight.nvstream.av.ByteBufferDescriptor; import com.limelight.nvstream.av.DecodeUnit; import com.limelight.nvstream.av.video.VideoDecoderRenderer; +import com.limelight.nvstream.av.video.VideoDepacketizer; import android.media.MediaCodec; import android.media.MediaCodecInfo; @@ -23,15 +24,13 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { private ByteBuffer[] videoDecoderInputBuffers; private MediaCodec videoDecoder; private Thread rendererThread; - private int redrawRate; private boolean needsSpsBitstreamFixup; private boolean needsSpsNumRefFixup; - private boolean fastInputQueueing; + private VideoDepacketizer depacketizer; public static final List blacklistedDecoderPrefixes; public static final List spsFixupBitsreamFixupDecoderPrefixes; public static final List spsFixupNumRefFixupDecoderPrefixes; - public static final List fastInputQueueingPrefixes; static { blacklistedDecoderPrefixes = new LinkedList(); @@ -46,11 +45,6 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { spsFixupNumRefFixupDecoderPrefixes = new LinkedList(); spsFixupNumRefFixupDecoderPrefixes.add("omx.TI"); } - - static { - fastInputQueueingPrefixes = new LinkedList(); - fastInputQueueingPrefixes.add("omx.nvidia"); - } private static boolean isDecoderInList(List decoderList, String decoderName) { for (String badPrefix : decoderList) { @@ -124,9 +118,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } @Override - public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { - this.redrawRate = redrawRate; - + public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { //dumpDecoders(); MediaCodecInfo safeDecoder = findSafeDecoder(); @@ -140,16 +132,11 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { if (needsSpsNumRefFixup) { LimeLog.info("Decoder "+safeDecoder.getName()+" needs SPS ref num fixup"); } - fastInputQueueing = isDecoderInList(fastInputQueueingPrefixes, safeDecoder.getName()); - if (fastInputQueueing) { - LimeLog.info("Decoder "+safeDecoder.getName()+" supports fast input queueing"); - } } else { videoDecoder = MediaCodec.createDecoderByType("video/avc"); needsSpsBitstreamFixup = false; needsSpsNumRefFixup = false; - fastInputQueueing = false; } MediaFormat videoFormat = MediaFormat.createVideoFormat("video/avc", width, height); @@ -167,59 +154,51 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { rendererThread = new Thread() { @Override public void run() { - long nextFrameTimeUs = 0; BufferInfo info = new BufferInfo(); + DecodeUnit du; while (!isInterrupted()) { - // Block for a maximum of 100 ms - int outIndex = videoDecoder.dequeueOutputBuffer(info, 100000); - switch (outIndex) { - case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: - LimeLog.info("Output buffers changed"); - break; - case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: - LimeLog.info("Output format changed"); - LimeLog.info("New output Format: " + videoDecoder.getOutputFormat()); - break; - default: - break; - } - + du = depacketizer.pollNextDecodeUnit(); + if (du != null) { + submitDecodeUnit(du); + } + + int outIndex = videoDecoder.dequeueOutputBuffer(info, 0); if (outIndex >= 0) { int lastIndex = outIndex; - boolean render = false; - - if (currentTimeUs() >= nextFrameTimeUs) { - render = true; - nextFrameTimeUs = computePresentationTime(redrawRate); - } - + // Get the last output buffer in the queue while ((outIndex = videoDecoder.dequeueOutputBuffer(info, 0)) >= 0) { videoDecoder.releaseOutputBuffer(lastIndex, false); lastIndex = outIndex; } - - // Render that buffer if it's time for the next frame - videoDecoder.releaseOutputBuffer(lastIndex, render); + + // Render the last buffer + videoDecoder.releaseOutputBuffer(lastIndex, true); + } else { + switch (outIndex) { + case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: + LimeLog.info("Output buffers changed"); + break; + case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: + LimeLog.info("Output format changed"); + LimeLog.info("New output Format: " + videoDecoder.getOutputFormat()); + break; + default: + break; + } } } } }; rendererThread.setName("Video - Renderer (MediaCodec)"); + rendererThread.setPriority(Thread.MAX_PRIORITY); rendererThread.start(); } - - private static long currentTimeUs() { - return System.nanoTime() / 1000; - } - - private long computePresentationTime(int frameRate) { - return currentTimeUs() + (1000000 / frameRate); - } @Override - public void start() { + public void start(VideoDepacketizer depacketizer) { + this.depacketizer = depacketizer; startRendererThread(); } @@ -239,24 +218,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } } - @Override - public boolean submitDecodeUnit(DecodeUnit decodeUnit) { - if (decodeUnit.getType() != DecodeUnit.TYPE_H264) { - System.err.println("Unknown decode unit type"); - return false; - } - - int mcFlags = 0; - - if ((decodeUnit.getFlags() & DecodeUnit.DU_FLAG_CODEC_CONFIG) != 0) { - LimeLog.info("Codec config"); - mcFlags |= MediaCodec.BUFFER_FLAG_CODEC_CONFIG; - } - if ((decodeUnit.getFlags() & DecodeUnit.DU_FLAG_SYNC_FRAME) != 0) { - LimeLog.info("Sync frame"); - mcFlags |= MediaCodec.BUFFER_FLAG_SYNC_FRAME; - } - + private boolean submitDecodeUnit(DecodeUnit decodeUnit) { int inputIndex = videoDecoder.dequeueInputBuffer(-1); if (inputIndex >= 0) { @@ -312,7 +274,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { videoDecoder.queueInputBuffer(inputIndex, 0, spsLength, - 0, mcFlags); + 0, 0); return true; } } @@ -325,7 +287,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { videoDecoder.queueInputBuffer(inputIndex, 0, decodeUnit.getDataLength(), - 0, mcFlags); + 0, 0); } return true; @@ -333,7 +295,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { @Override public int getCapabilities() { - return fastInputQueueing ? VideoDecoderRenderer.CAPABILITY_DIRECT_SUBMIT : 0; + return 0; } /**