From 829532c57249f580f4a4b84158be39e56fa099f2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 5 Aug 2014 21:29:21 -0700 Subject: [PATCH] Some devices don't properly get interrupted while waiting for an input buffer, so wait 100 ms then check the interrupt flag --- .../video/MediaCodecDecoderRenderer.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 8a180362..288885d4 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -177,8 +177,14 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { { du = depacketizer.pollNextDecodeUnit(); if (du != null) { - submitDecodeUnit(du); + if (!submitDecodeUnit(du)) { + // Thread was interrupted depacketizer.freeDecodeUnit(du); + return; + } + else { + depacketizer.freeDecodeUnit(du); + } } int outIndex = videoDecoder.dequeueOutputBuffer(info, 0); @@ -250,9 +256,16 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } private boolean submitDecodeUnit(DecodeUnit decodeUnit) { - int inputIndex = videoDecoder.dequeueInputBuffer(-1); - if (inputIndex >= 0) - { + int inputIndex; + + do { + if (Thread.interrupted()) { + return false; + } + + inputIndex = videoDecoder.dequeueInputBuffer(100000); + } while (inputIndex < 0); + ByteBuffer buf = videoDecoderInputBuffers[inputIndex]; long currentTime = System.currentTimeMillis(); @@ -348,7 +361,6 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { videoDecoder.queueInputBuffer(inputIndex, 0, decodeUnit.getDataLength(), currentTime * 1000, codecFlags); - } return true; }