Allow renderer initialization to indicate failure

This commit is contained in:
Cameron Gutman 2014-06-29 11:38:27 -07:00
parent 2f082b9f85
commit 00e81e87de
5 changed files with 36 additions and 17 deletions

View File

@ -234,15 +234,13 @@ public class NvConnection {
private boolean startVideoStream() throws IOException private boolean startVideoStream() throws IOException
{ {
videoStream = new VideoStream(hostAddr, listener, controlStream, config); videoStream = new VideoStream(hostAddr, listener, controlStream, config);
videoStream.startVideoStream(videoDecoderRenderer, videoRenderTarget, drFlags); return videoStream.startVideoStream(videoDecoderRenderer, videoRenderTarget, drFlags);
return true;
} }
private boolean startAudioStream() throws IOException private boolean startAudioStream() throws IOException
{ {
audioStream = new AudioStream(hostAddr, listener, audioRenderer); audioStream = new AudioStream(hostAddr, listener, audioRenderer);
audioStream.startAudioStream(); return audioStream.startAudioStream();
return true;
} }
private boolean startInputConnection() throws IOException private boolean startInputConnection() throws IOException

View File

@ -6,7 +6,7 @@ public interface AudioRenderer {
public int getCapabilities(); 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); public void playDecodedAudio(byte[] audioData, int offset, int length);

View File

@ -67,11 +67,14 @@ public class AudioStream {
threads.clear(); threads.clear();
} }
public void startAudioStream() throws SocketException public boolean startAudioStream() throws SocketException
{ {
setupRtpSession(); setupRtpSession();
setupAudio(); if (!setupAudio()) {
abort();
return false;
}
startReceiveThread(); startReceiveThread();
@ -80,6 +83,8 @@ public class AudioStream {
} }
startUdpPingThread(); startUdpPingThread();
return true;
} }
private void setupRtpSession() throws SocketException private void setupRtpSession() throws SocketException
@ -90,7 +95,7 @@ public class AudioStream {
rtp.bind(new InetSocketAddress(RTP_PORT)); rtp.bind(new InetSocketAddress(RTP_PORT));
} }
private void setupAudio() private boolean setupAudio()
{ {
int err; int err;
@ -99,7 +104,9 @@ public class AudioStream {
throw new IllegalStateException("Opus decoder failed to initialize"); 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) { if ((streamListener.getCapabilities() & AudioRenderer.CAPABILITY_DIRECT_SUBMIT) != 0) {
depacketizer = new AudioDepacketizer(streamListener); depacketizer = new AudioDepacketizer(streamListener);
@ -107,6 +114,8 @@ public class AudioStream {
else { else {
depacketizer = new AudioDepacketizer(null); depacketizer = new AudioDepacketizer(null);
} }
return true;
} }
private void startDecoderThread() private void startDecoderThread()

View File

@ -7,9 +7,9 @@ public interface VideoDecoderRenderer {
public int getCapabilities(); 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(); public void stop();

View File

@ -132,20 +132,27 @@ public class VideoStream {
rtp.bind(new InetSocketAddress(RTP_PORT)); 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; this.decRend = decRend;
if (decRend != null) { if (decRend != null) {
decRend.setup(streamConfig.getWidth(), streamConfig.getHeight(), if (!decRend.setup(streamConfig.getWidth(), streamConfig.getHeight(),
60, renderTarget, drFlags); 60, renderTarget, drFlags)) {
return false;
}
depacketizer = new VideoDepacketizer(avConnListener, streamConfig.getMaxPacketSize()); 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 // 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 // Open RTP sockets and start session
setupRtpSession(); setupRtpSession();
@ -167,9 +174,14 @@ public class VideoStream {
startReceiveThread(); startReceiveThread();
// Start the renderer // Start the renderer
decRend.start(depacketizer); if (!decRend.start(depacketizer)) {
abort();
return false;
}
startedRendering = true; startedRendering = true;
} }
return true;
} }
private void startReceiveThread() private void startReceiveThread()