From 7142db3fac6bb067d767fa859e7362909d2614df Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 29 Jun 2014 11:49:42 -0700 Subject: [PATCH] Fixes for Android L and some weird codec exceptions --- libs/limelight-common.jar | Bin 207842 -> 207922 bytes .../binding/audio/AndroidAudioRenderer.java | 6 ++- .../video/AndroidCpuDecoderRenderer.java | 7 ++- .../video/ConfigurableDecoderRenderer.java | 8 ++-- .../video/MediaCodecDecoderRenderer.java | 42 +++++++++++------- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/libs/limelight-common.jar b/libs/limelight-common.jar index e62ea43cea931b882ff2d6dc39ee0b1c813201c4..e7b1b4461555d8e7155977d95b2c825d051196fb 100644 GIT binary patch delta 23486 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 BG-hPCob*m!)I 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 TbVqc$pboP%+X69W1_lNIZkou) diff --git a/src/com/limelight/binding/audio/AndroidAudioRenderer.java b/src/com/limelight/binding/audio/AndroidAudioRenderer.java index 0c2f5da4..28578e98 100644 --- a/src/com/limelight/binding/audio/AndroidAudioRenderer.java +++ b/src/com/limelight/binding/audio/AndroidAudioRenderer.java @@ -14,7 +14,7 @@ public class AndroidAudioRenderer implements AudioRenderer { private AudioTrack track; @Override - public void streamInitialized(int channelCount, int sampleRate) { + public boolean streamInitialized(int channelCount, int sampleRate) { int channelConfig; int bufferSize; @@ -27,7 +27,8 @@ public class AndroidAudioRenderer implements AudioRenderer { channelConfig = AudioFormat.CHANNEL_OUT_STEREO; break; default: - throw new IllegalArgumentException("Decoder returned unhandled channel count"); + LimeLog.severe("Decoder returned unhandled channel count"); + return false; } bufferSize = Math.max(AudioTrack.getMinBufferSize(sampleRate, @@ -47,6 +48,7 @@ public class AndroidAudioRenderer implements AudioRenderer { AudioTrack.MODE_STREAM); track.play(); + return true; } @Override diff --git a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java index 7fbafb1a..aa54f5d5 100644 --- a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java +++ b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java @@ -81,7 +81,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { } @Override - public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { + public boolean setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { this.targetFps = redrawRate; int perfLevel = findOptimalPerformanceLevel(); @@ -139,10 +139,12 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { decoderBuffer = ByteBuffer.allocate(DECODER_BUFFER_SIZE + AvcDecoder.getInputPaddingSize()); LimeLog.info("Using software decoding (performance level: "+perfLevel+")"); + + return true; } @Override - public void start(final VideoDepacketizer depacketizer) { + public boolean start(final VideoDepacketizer depacketizer) { rendererThread = new Thread() { @Override public void run() { @@ -169,6 +171,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { rendererThread.setName("Video - Renderer (CPU)"); rendererThread.setPriority(Thread.MAX_PRIORITY); rendererThread.start(); + return true; } private long computePresentationTimeMs(int frameRate) { diff --git a/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java b/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java index 40baf794..6cca9c9a 100644 --- a/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java +++ b/src/com/limelight/binding/video/ConfigurableDecoderRenderer.java @@ -13,7 +13,7 @@ public class ConfigurableDecoderRenderer implements VideoDecoderRenderer { } @Override - public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { + public boolean setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { if ((drFlags & VideoDecoderRenderer.FLAG_FORCE_HARDWARE_DECODING) != 0 || ((drFlags & VideoDecoderRenderer.FLAG_FORCE_SOFTWARE_DECODING) == 0 && MediaCodecDecoderRenderer.findSafeDecoder() != null)) { @@ -22,12 +22,12 @@ public class ConfigurableDecoderRenderer implements VideoDecoderRenderer { else { decoderRenderer = new AndroidCpuDecoderRenderer(); } - decoderRenderer.setup(width, height, redrawRate, renderTarget, drFlags); + return decoderRenderer.setup(width, height, redrawRate, renderTarget, drFlags); } @Override - public void start(VideoDepacketizer depacketizer) { - decoderRenderer.start(depacketizer); + public boolean start(VideoDepacketizer depacketizer) { + return decoderRenderer.start(depacketizer); } @Override diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 9e4c1770..a852a18e 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -119,25 +119,32 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } @Override - public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { + public boolean setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { //dumpDecoders(); - MediaCodecInfo safeDecoder = findSafeDecoder(); - if (safeDecoder != null) { - videoDecoder = MediaCodec.createByCodecName(safeDecoder.getName()); - needsSpsBitstreamFixup = isDecoderInList(spsFixupBitsreamFixupDecoderPrefixes, safeDecoder.getName()); - needsSpsNumRefFixup = isDecoderInList(spsFixupNumRefFixupDecoderPrefixes, safeDecoder.getName()); - if (needsSpsBitstreamFixup) { - LimeLog.info("Decoder "+safeDecoder.getName()+" needs SPS bitstream restrictions fixup"); + // It's nasty to put all this in a try-catch block, + // but codecs have been known to throw all sorts of crazy runtime exceptions + // due to implementation problems + try { + MediaCodecInfo safeDecoder = findSafeDecoder(); + if (safeDecoder != null) { + videoDecoder = MediaCodec.createByCodecName(safeDecoder.getName()); + needsSpsBitstreamFixup = isDecoderInList(spsFixupBitsreamFixupDecoderPrefixes, safeDecoder.getName()); + needsSpsNumRefFixup = isDecoderInList(spsFixupNumRefFixupDecoderPrefixes, safeDecoder.getName()); + if (needsSpsBitstreamFixup) { + LimeLog.info("Decoder "+safeDecoder.getName()+" needs SPS bitstream restrictions fixup"); + } + if (needsSpsNumRefFixup) { + LimeLog.info("Decoder "+safeDecoder.getName()+" needs SPS ref num fixup"); + } } - if (needsSpsNumRefFixup) { - LimeLog.info("Decoder "+safeDecoder.getName()+" needs SPS ref num fixup"); + else { + videoDecoder = MediaCodec.createDecoderByType("video/avc"); + needsSpsBitstreamFixup = false; + needsSpsNumRefFixup = false; } - } - else { - videoDecoder = MediaCodec.createDecoderByType("video/avc"); - needsSpsBitstreamFixup = false; - needsSpsNumRefFixup = false; + } catch (Exception e) { + return false; } MediaFormat videoFormat = MediaFormat.createVideoFormat("video/avc", width, height); @@ -148,6 +155,8 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { videoDecoderInputBuffers = videoDecoder.getInputBuffers(); LimeLog.info("Using hardware decoding"); + + return true; } private void startRendererThread() @@ -198,9 +207,10 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } @Override - public void start(VideoDepacketizer depacketizer) { + public boolean start(VideoDepacketizer depacketizer) { this.depacketizer = depacketizer; startRendererThread(); + return true; } @Override