From 00e81e87de1ddcae020c48bd1cb81bc5a7da74c5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 29 Jun 2014 11:38:27 -0700 Subject: [PATCH] Allow renderer initialization to indicate failure --- .../com/limelight/nvstream/NvConnection.java | 6 ++--- .../nvstream/av/audio/AudioRenderer.java | 2 +- .../nvstream/av/audio/AudioStream.java | 17 +++++++++---- .../av/video/VideoDecoderRenderer.java | 4 ++-- .../nvstream/av/video/VideoStream.java | 24 ++++++++++++++----- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/moonlight-common/src/com/limelight/nvstream/NvConnection.java b/moonlight-common/src/com/limelight/nvstream/NvConnection.java index c44d92b6..1dd5d4c6 100644 --- a/moonlight-common/src/com/limelight/nvstream/NvConnection.java +++ b/moonlight-common/src/com/limelight/nvstream/NvConnection.java @@ -234,15 +234,13 @@ public class NvConnection { private boolean startVideoStream() throws IOException { videoStream = new VideoStream(hostAddr, listener, controlStream, config); - videoStream.startVideoStream(videoDecoderRenderer, videoRenderTarget, drFlags); - return true; + return videoStream.startVideoStream(videoDecoderRenderer, videoRenderTarget, drFlags); } private boolean startAudioStream() throws IOException { audioStream = new AudioStream(hostAddr, listener, audioRenderer); - audioStream.startAudioStream(); - return true; + return audioStream.startAudioStream(); } private boolean startInputConnection() throws IOException diff --git a/moonlight-common/src/com/limelight/nvstream/av/audio/AudioRenderer.java b/moonlight-common/src/com/limelight/nvstream/av/audio/AudioRenderer.java index 48fb88af..a66c3902 100644 --- a/moonlight-common/src/com/limelight/nvstream/av/audio/AudioRenderer.java +++ b/moonlight-common/src/com/limelight/nvstream/av/audio/AudioRenderer.java @@ -6,7 +6,7 @@ public interface AudioRenderer { public int getCapabilities(); - public void streamInitialized(int channelCount, int sampleRate); + public boolean streamInitialized(int channelCount, int sampleRate); public void playDecodedAudio(byte[] audioData, int offset, int length); diff --git a/moonlight-common/src/com/limelight/nvstream/av/audio/AudioStream.java b/moonlight-common/src/com/limelight/nvstream/av/audio/AudioStream.java index 190ec4ab..1b73188c 100644 --- a/moonlight-common/src/com/limelight/nvstream/av/audio/AudioStream.java +++ b/moonlight-common/src/com/limelight/nvstream/av/audio/AudioStream.java @@ -67,11 +67,14 @@ public class AudioStream { threads.clear(); } - public void startAudioStream() throws SocketException + public boolean startAudioStream() throws SocketException { setupRtpSession(); - setupAudio(); + if (!setupAudio()) { + abort(); + return false; + } startReceiveThread(); @@ -80,6 +83,8 @@ public class AudioStream { } startUdpPingThread(); + + return true; } private void setupRtpSession() throws SocketException @@ -90,7 +95,7 @@ public class AudioStream { rtp.bind(new InetSocketAddress(RTP_PORT)); } - private void setupAudio() + private boolean setupAudio() { int err; @@ -99,7 +104,9 @@ public class AudioStream { throw new IllegalStateException("Opus decoder failed to initialize"); } - streamListener.streamInitialized(OpusDecoder.getChannelCount(), OpusDecoder.getSampleRate()); + if (!streamListener.streamInitialized(OpusDecoder.getChannelCount(), OpusDecoder.getSampleRate())) { + return false; + } if ((streamListener.getCapabilities() & AudioRenderer.CAPABILITY_DIRECT_SUBMIT) != 0) { depacketizer = new AudioDepacketizer(streamListener); @@ -107,6 +114,8 @@ public class AudioStream { else { depacketizer = new AudioDepacketizer(null); } + + return true; } private void startDecoderThread() diff --git a/moonlight-common/src/com/limelight/nvstream/av/video/VideoDecoderRenderer.java b/moonlight-common/src/com/limelight/nvstream/av/video/VideoDecoderRenderer.java index 48e5a6db..c3903a59 100644 --- a/moonlight-common/src/com/limelight/nvstream/av/video/VideoDecoderRenderer.java +++ b/moonlight-common/src/com/limelight/nvstream/av/video/VideoDecoderRenderer.java @@ -7,9 +7,9 @@ public interface VideoDecoderRenderer { public int getCapabilities(); - 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); - public void start(VideoDepacketizer depacketizer); + public boolean start(VideoDepacketizer depacketizer); public void stop(); diff --git a/moonlight-common/src/com/limelight/nvstream/av/video/VideoStream.java b/moonlight-common/src/com/limelight/nvstream/av/video/VideoStream.java index 90a16ec0..5b6b08c6 100644 --- a/moonlight-common/src/com/limelight/nvstream/av/video/VideoStream.java +++ b/moonlight-common/src/com/limelight/nvstream/av/video/VideoStream.java @@ -132,20 +132,27 @@ public class VideoStream { rtp.bind(new InetSocketAddress(RTP_PORT)); } - public void setupDecoderRenderer(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) { + public boolean setupDecoderRenderer(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) { this.decRend = decRend; if (decRend != null) { - decRend.setup(streamConfig.getWidth(), streamConfig.getHeight(), - 60, renderTarget, drFlags); + if (!decRend.setup(streamConfig.getWidth(), streamConfig.getHeight(), + 60, renderTarget, drFlags)) { + return false; + } depacketizer = new VideoDepacketizer(avConnListener, streamConfig.getMaxPacketSize()); } + + return true; } - public void startVideoStream(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) throws IOException + public boolean startVideoStream(VideoDecoderRenderer decRend, Object renderTarget, int drFlags) throws IOException { // Setup the decoder and renderer - setupDecoderRenderer(decRend, renderTarget, drFlags); + if (!setupDecoderRenderer(decRend, renderTarget, drFlags)) { + // Nothing to cleanup here + return false; + } // Open RTP sockets and start session setupRtpSession(); @@ -167,9 +174,14 @@ public class VideoStream { startReceiveThread(); // Start the renderer - decRend.start(depacketizer); + if (!decRend.start(depacketizer)) { + abort(); + return false; + } startedRendering = true; } + + return true; } private void startReceiveThread()