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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

!Y 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

jJ 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 O4g`c4@U4*o;{O55r+A+L diff --git a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java index 1949449d..7fbafb1a 100644 --- a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java +++ b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java @@ -13,6 +13,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 com.limelight.nvstream.av.video.cpu.AvcDecoder; public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { @@ -141,22 +142,23 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { } @Override - public void start() { + public void start(final VideoDepacketizer depacketizer) { rendererThread = new Thread() { @Override public void run() { long nextFrameTime = System.currentTimeMillis(); - + DecodeUnit du; while (!isInterrupted()) { + du = depacketizer.pollNextDecodeUnit(); + if (du != null) { + submitDecodeUnit(du); + } + long diff = nextFrameTime - System.currentTimeMillis(); if (diff > 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; } /**