From 702376078280546f27d69c68b910b2e22782dfe5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 17 Aug 2015 18:40:25 -0700 Subject: [PATCH] Use monotonic system time for rendering timestamps. This is required now in Android 6.0 since these timestamps are propagated to the codec. --- app/libs/limelight-common.jar | Bin 1008810 -> 1009379 bytes .../video/AndroidCpuDecoderRenderer.java | 8 +++---- .../video/MediaCodecDecoderRenderer.java | 20 +++++++++--------- .../binding/video/MediaCodecHelper.java | 4 ++++ 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/app/libs/limelight-common.jar b/app/libs/limelight-common.jar index b97c16b5f0c24e3053acd4cc3b9385a1a989d869..86da8155b2e47c0b5fec809d95a20f7dfa4f2444 100644 GIT binary patch delta 20824 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 N@(c`BuKWxP3;;jFSj7MU diff --git a/app/src/main/java/com/limelight/binding/video/AndroidCpuDecoderRenderer.java b/app/src/main/java/com/limelight/binding/video/AndroidCpuDecoderRenderer.java index 62e1f78a..b682e233 100644 --- a/app/src/main/java/com/limelight/binding/video/AndroidCpuDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/AndroidCpuDecoderRenderer.java @@ -177,10 +177,10 @@ public class AndroidCpuDecoderRenderer extends EnhancedDecoderRenderer { rendererThread = new Thread() { @Override public void run() { - long nextFrameTime = System.currentTimeMillis(); + long nextFrameTime = MediaCodecHelper.getMonotonicMillis(); while (!isInterrupted()) { - long diff = nextFrameTime - System.currentTimeMillis(); + long diff = nextFrameTime - MediaCodecHelper.getMonotonicMillis(); if (diff > WAIT_CEILING_MS) { try { @@ -203,7 +203,7 @@ public class AndroidCpuDecoderRenderer extends EnhancedDecoderRenderer { } private long computePresentationTimeMs(int frameRate) { - return System.currentTimeMillis() + (1000 / frameRate); + return MediaCodecHelper.getMonotonicMillis() + (1000 / frameRate); } @Override @@ -251,7 +251,7 @@ public class AndroidCpuDecoderRenderer extends EnhancedDecoderRenderer { boolean success = (AvcDecoder.decode(data, 0, decodeUnit.getDataLength()) == 0); if (success) { - long timeAfterDecode = System.currentTimeMillis(); + long timeAfterDecode = MediaCodecHelper.getMonotonicMillis(); // Add delta time to the totals (excluding probable outliers) long delta = timeAfterDecode - decodeUnit.getReceiveTimestamp(); diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 6f555f7f..0d51caa5 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -169,7 +169,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { videoDecoder.releaseOutputBuffer(lastIndex, true); // Add delta time to the totals (excluding probable outliers) - long delta = System.currentTimeMillis() - (presentationTimeUs / 1000); + long delta = MediaCodecHelper.getMonotonicMillis() - (presentationTimeUs / 1000); if (delta >= 0 && delta < 1000) { decoderTimeMs += delta; totalTimeMs += delta; @@ -201,14 +201,14 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { int index; long startTime, queueTime; - startTime = System.currentTimeMillis(); + startTime = MediaCodecHelper.getMonotonicMillis(); index = videoDecoder.dequeueInputBuffer(wait ? (infiniteWait ? -1 : 3000) : 0); if (index < 0) { return index; } - queueTime = System.currentTimeMillis(); + queueTime = MediaCodecHelper.getMonotonicMillis(); if (queueTime - startTime >= 20) { LimeLog.warning("Queue input buffer ran long: " + (queueTime - startTime) + " ms"); @@ -236,7 +236,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { inputIndex = dequeueInputBuffer(false, false); du = depacketizer.pollNextDecodeUnit(); if (du != null) { - lastDuDequeueTime = System.currentTimeMillis(); + lastDuDequeueTime = MediaCodecHelper.getMonotonicMillis(); notifyDuReceived(du); } @@ -278,7 +278,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { if (du == null) { du = depacketizer.pollNextDecodeUnit(); if (du != null) { - lastDuDequeueTime = System.currentTimeMillis(); + lastDuDequeueTime = MediaCodecHelper.getMonotonicMillis(); notifyDuReceived(du); } } @@ -286,7 +286,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { // If we've got both a decode unit and an input buffer, we'll // submit now. Otherwise, we wait until we have one. if (du != null && inputIndex >= 0) { - long submissionTime = System.currentTimeMillis(); + long submissionTime = MediaCodecHelper.getMonotonicMillis(); if (submissionTime - lastDuDequeueTime >= 20) { LimeLog.warning("Receiving an input buffer took too long: "+(submissionTime - lastDuDequeueTime)+" ms"); } @@ -317,7 +317,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { videoDecoder.releaseOutputBuffer(lastIndex, true); // Add delta time to the totals (excluding probable outliers) - long delta = System.currentTimeMillis()-(presentationTimeUs/1000); + long delta = MediaCodecHelper.getMonotonicMillis()-(presentationTimeUs/1000); if (delta >= 0 && delta < 1000) { decoderTimeMs += delta; totalTimeMs += delta; @@ -435,7 +435,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { @SuppressWarnings("deprecation") private void submitDecodeUnit(DecodeUnit decodeUnit, int inputBufferIndex) { - long timestampUs = System.currentTimeMillis() * 1000; + long timestampUs = System.nanoTime() / 1000; if (timestampUs <= lastTimestampUs) { // We can't submit multiple buffers with the same timestamp // so bump it up by one before queuing @@ -608,7 +608,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { // Queue the new SPS queueInputBuffer(inputIndex, 0, inputBuffer.position(), - System.currentTimeMillis() * 1000, + System.nanoTime() / 1000, MediaCodec.BUFFER_FLAG_CODEC_CONFIG); LimeLog.info("SPS replay complete"); @@ -649,7 +649,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer { } private void notifyDuReceived(DecodeUnit du) { - long currentTime = System.currentTimeMillis(); + long currentTime = MediaCodecHelper.getMonotonicMillis(); long delta = currentTime-du.getReceiveTimestamp(); if (delta >= 0 && delta < 1000) { totalTimeMs += currentTime-du.getReceiveTimestamp(); diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java b/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java index 0b0b48e6..daba5c10 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java @@ -83,6 +83,10 @@ public class MediaCodecHelper { return false; } + + public static long getMonotonicMillis() { + return System.nanoTime() / 1000000L; + } @TargetApi(Build.VERSION_CODES.KITKAT) public static boolean decoderSupportsAdaptivePlayback(String decoderName, MediaCodecInfo decoderInfo) {