diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java index 238042ace72360e2ccdff1388e839f78d6c1e347..92ff5dc6600b1953db0a064d7e5d8c1d307e840c 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java @@ -2051,11 +2051,11 @@ else if (startedDirection == null) private void startReceiveStreams() { StreamRTPManager rtpManager = getRTPManager(); - List<ReceiveStream> receiveStreams; + Set<ReceiveStream> streamsToStart = new HashSet<ReceiveStream>(); try { - receiveStreams = rtpManager.getReceiveStreams(); + streamsToStart.addAll(rtpManager.getReceiveStreams()); } catch (Exception ex) { @@ -2066,40 +2066,36 @@ private void startReceiveStreams() */ if (logger.isTraceEnabled()) logger.trace("Failed to retrieve receive streams", ex); - receiveStreams = null; } - if (receiveStreams != null) - { - /* - * It turns out that the receiveStreams list of rtpManager can be - * empty. As a workaround, use the receiveStreams of this instance. - */ - if (receiveStreams.isEmpty()) - receiveStreams = getReceiveStreams(); + /* + * It has been observed that sometimes there are valid ReceiveStream-s + * in this.receiveStreams which are not returned by the RTP manager. + */ + streamsToStart.addAll(getReceiveStreams()); - for (ReceiveStream receiveStream : receiveStreams) + for (ReceiveStream receiveStream : streamsToStart) + { + try { - try - { - DataSource receiveStreamDataSource - = receiveStream.getDataSource(); + DataSource receiveStreamDataSource + = receiveStream.getDataSource(); - /* - * For an unknown reason, the stream DataSource can be null - * at the end of the Call after re-INVITEs have been - * handled. - */ - if (receiveStreamDataSource != null) - receiveStreamDataSource.start(); - } - catch (IOException ioex) - { - logger.warn( - "Failed to start receive stream " + receiveStream, - ioex); - } + /* + * For an unknown reason, the stream DataSource can be null + * at the end of the Call after re-INVITEs have been + * handled. + */ + if (receiveStreamDataSource != null) + receiveStreamDataSource.start(); } + catch (IOException ioex) + { + logger.warn( + "Failed to start receive stream " + receiveStream, + ioex); + } + } } @@ -2430,6 +2426,9 @@ public void update(ReceiveStreamEvent ev) { if (ev instanceof NewReceiveStreamEvent) { + //XXX we might consider not adding (or not starting) new receive + //streams unless the MediaStream's direction allows receiving. + ReceiveStream receiveStream = ev.getReceiveStream(); if (receiveStream != null)