diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java index a9c8ded75051c9a3e0e264519c396a133f0917fc..d89cb71a9e4ce3af5886b34edbed1774c6279d44 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java @@ -1292,7 +1292,7 @@ public StreamRTPManager getRTPManager() if (rtpConnector == null) throw new IllegalStateException("rtpConnector"); - rtpManager = new StreamRTPManager(rtpTranslator); + rtpManager = new StreamRTPManager(this, rtpTranslator); registerCustomCodecFormats(rtpManager); diff --git a/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java b/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java index 8655f4cc5b982a8ccee19876dfda9f89d8430acf..0efc456b86b81a5b439ad3007b13f6884218b7eb 100644 --- a/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java +++ b/src/org/jitsi/impl/neomedia/RTPTranslatorImpl.java @@ -130,8 +130,8 @@ public synchronized void addFormat( * @param streamRTPManager the <tt>StreamRTPManager</tt> which specifies * the neomedia <tt>MediaStream</tt> with which the * <tt>ReceiveStreamEvent</tt>s delivered to the specified <tt>listener</tt> - * are to be related. In other words, a <tt>ReceiveStremEvent</tt> received - * by <tt>RTPTranslatorImpl</tt> is first examined to determine with which + * are to be related. In other words, a <tt>ReceiveStreamEvent</tt> received + * by <tt>RTPTranslatorImpl</tt> is first examined to determine which * <tt>StreamRTPManager</tt> it is related to and then it is delivered to * the <tt>ReceiveStreamListener</tt>s which have been added to this * <tt>RTPTranslatorImpl</tt> by that <tt>StreamRTPManager</tt>. @@ -748,6 +748,14 @@ private synchronized int read( = streamDesc.connectorDesc.streamRTPManagerDesc; Format format = null; + /** + * Ignore packets coming from peers whose MediaStream's direction + * does not allow receiving. + */ + if (!streamRTPManagerDesc.streamRTPManager.getMediaStream() + .getDirection().allowsReceiving()) + return read; + if (data) { /* @@ -1015,7 +1023,13 @@ private synchronized int doWrite( StreamRTPManagerDesc streamRTPManagerDesc = streamDesc.connectorDesc.streamRTPManagerDesc; - if (streamRTPManagerDesc != exclusion) + /* + * Only write to OutputDataStream-s for which the associated + * MediaStream allows sending. + */ + if (streamRTPManagerDesc != exclusion + && streamRTPManagerDesc.streamRTPManager + .getMediaStream().getDirection().allowsSending()) { if (data) { @@ -1215,6 +1229,9 @@ private static class PushSourceStreamDesc { public final RTPConnectorDesc connectorDesc; + /** + * <tt>true</tt> if this instance represents a data (RTP) stream. + */ public final boolean data; public final PushSourceStream stream; diff --git a/src/org/jitsi/impl/neomedia/StreamRTPManager.java b/src/org/jitsi/impl/neomedia/StreamRTPManager.java index 46737f1e803eaef0ecd56399dd9a65b9e9938b65..7339fe941525531b86bea5dffd5122e8b3763589 100644 --- a/src/org/jitsi/impl/neomedia/StreamRTPManager.java +++ b/src/org/jitsi/impl/neomedia/StreamRTPManager.java @@ -26,6 +26,11 @@ */ public class StreamRTPManager { + /** + * The <tt>MediaStream</tt> that uses this <tt>StreamRTPManager</tt> + */ + private final MediaStream stream; + /** * The <tt>RTPManager</tt> this instance is to delegate to when it is not * attached to an <tt>RTPTranslator</tt>. @@ -45,12 +50,15 @@ public class StreamRTPManager * forward the RTP and RTCP flows of the associated <tt>MediaStream</tt> to * other <tt>MediaStream</tt>s. * + * @param stream the <tt>MediaStream</tt> that created this + * <tt>StreamRTPManager</tt>. * @param translator the <tt>RTPTranslator</tt> to attach the new instance * to or <tt>null</tt> if the new instance is to not be attached to any * <tt>RTPTranslator</tt> */ - public StreamRTPManager(RTPTranslator translator) + public StreamRTPManager(MediaStream stream, RTPTranslator translator) { + this.stream = stream; this.translator = (RTPTranslatorImpl) translator; manager = (this.translator == null) ? RTPManager.newInstance() : null; @@ -171,6 +179,15 @@ public long getLocalSSRC() return translator.getLocalSSRC(this); } + /** + * Returns the <tt>MediaStream</tt> that uses this <tt>StreamRTPManager</tt> + * @return the <tt>MediaStream</tt> that uses this <tt>StreamRTPManager</tt> + */ + public MediaStream getMediaStream() + { + return stream; + } + @SuppressWarnings("rawtypes") public Vector getReceiveStreams() {