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
{
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

View File

@ -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);

View File

@ -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()

View File

@ -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();

View File

@ -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()