From 314d199066c65b1c9e54c7c0c97ac464edfcd769 Mon Sep 17 00:00:00 2001 From: Emil Ivov Date: Fri, 27 Nov 2009 00:18:35 +0000 Subject: [PATCH] Changes storage of SSRC id-s to long rather than String to optimize their insertion in RTP packets as well as garbage collection --- .../impl/neomedia/MediaStreamImpl.java | 35 ++++++++++--------- .../device/AudioMixerMediaDevice.java | 8 ++--- .../neomedia/device/MediaDeviceSession.java | 26 +++++++------- .../transform/csrc/CsrcTransformEngine.java | 21 ++++++++--- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/src/net/java/sip/communicator/impl/neomedia/MediaStreamImpl.java b/src/net/java/sip/communicator/impl/neomedia/MediaStreamImpl.java index 2d02d5bed..0388febba 100644 --- a/src/net/java/sip/communicator/impl/neomedia/MediaStreamImpl.java +++ b/src/net/java/sip/communicator/impl/neomedia/MediaStreamImpl.java @@ -1360,30 +1360,29 @@ private void setRemoteSourceID(long ssrc) * return an empty List in case this stream is not part of a mixed * conference call. * - * @return a List of CSRC IDs for parties that are currently known - * to contribute to the media that this stream is currently streaming or - * an empty List in case this MediaStream is not part of - * a conference call. + * @return a List array of CSRC IDs stored as Long + * instances and representing parties that are currently known to contribute + * to the media that this stream or an empty List in case this + * MediaStream is not part of a conference call. */ - public List getLocalContributingSourceIDs() + public List getLocalContributingSourceIDs() { - List csrcList = new ArrayList(); + if( this.deviceSession == null) + return null; MediaDeviceSession deviceSession = getDeviceSession(); - if( this.deviceSession != null) - csrcList.addAll( deviceSession.getRemoteSSRCList() ); - Iterator csrcIter = csrcList.iterator(); + long[] ssrcArray = deviceSession.getRemoteSSRCList(); + + List csrcList = new ArrayList(ssrcArray.length); //in case of a conf call the mixer would return all SSRC IDs that are //currently contributing including this stream's counterpart. This //method is about - while(csrcIter.hasNext()) + for(long csrc : ssrcArray) { - String csrc = csrcIter.next(); - - if (csrc.equals(getRemoteSourceID())) - csrcIter.remove(); + if (csrc != this.getRemoteSourceID()) + csrcList.add(csrc); } return csrcList; @@ -1398,10 +1397,12 @@ public List getLocalContributingSourceIDs() * contributing to the stream that we are receiving from this * MediaStream's remote party. */ - public List getRemoteContributingSourceIDs() + public long[] getRemoteContributingSourceIDs() { - List csrcList = new ArrayList(); + long[] remoteSsrcList = getDeviceSession().getRemoteSSRCList(); - return csrcList; + //todo -implement + + return remoteSsrcList; } } diff --git a/src/net/java/sip/communicator/impl/neomedia/device/AudioMixerMediaDevice.java b/src/net/java/sip/communicator/impl/neomedia/device/AudioMixerMediaDevice.java index e69787a30..041075987 100644 --- a/src/net/java/sip/communicator/impl/neomedia/device/AudioMixerMediaDevice.java +++ b/src/net/java/sip/communicator/impl/neomedia/device/AudioMixerMediaDevice.java @@ -449,12 +449,12 @@ public void removeReceiveStream(ReceiveStream receiveStream) * a pseudo device we would simply be delegating the call to the * corresponding method of the master mixer device session. * - * @return a List of SSRC identifiers (in a hexadecimal - * String form) that are currently contributing to the mixer - * encapsulated by this device session. + * @return a long[] array of SSRC identifiers that are + * currently contributing to the mixer encapsulated by this device + * session. */ @Override - public List getRemoteSSRCList() + public long[] getRemoteSSRCList() { return audioMixerMediaDeviceSession.getRemoteSSRCList(); } diff --git a/src/net/java/sip/communicator/impl/neomedia/device/MediaDeviceSession.java b/src/net/java/sip/communicator/impl/neomedia/device/MediaDeviceSession.java index 53412dfb4..9d967cbef 100644 --- a/src/net/java/sip/communicator/impl/neomedia/device/MediaDeviceSession.java +++ b/src/net/java/sip/communicator/impl/neomedia/device/MediaDeviceSession.java @@ -224,8 +224,7 @@ protected void addReceiveStream( receiveStreams.put(receiveStream, receiveStreamDataSource); if (logger.isTraceEnabled()) - logger - .trace( + logger.trace( "Added ReceiveStream with ssrc " + receiveStream.getSSRC()); synchronized (players) @@ -250,15 +249,13 @@ protected void addReceiveStream( } if (exception != null) - logger - .error( + logger.error( "Failed to create player" + " for ReceiveStream with ssrc " + receiveStream.getSSRC(), exception); else if (!waitForState(player, Processor.Configured)) - logger - .error( + logger.error( "Failed to configure player" + " for ReceiveStream with ssrc " + receiveStream.getSSRC()); @@ -1373,18 +1370,19 @@ private static boolean waitForState(Processor processor, int state) * to query a device session operating over a mixer in which case we would * have the SSRC IDs of all parties currently contributing to the mixing. * - * @return a List of SSRC identifiers (in a hexadecimal - * String form) that this device session is. - * handling streams from. + * @return a long[] array of SSRC identifiers that this device + * session is handling streams from. */ - public List getRemoteSSRCList() + public long[] getRemoteSSRCList() { - Set streams = this.receiveStreams.keySet(); - List ssrcIDList = new ArrayList(); + List streams + = new LinkedList(this.receiveStreams.keySet()); + long[] ssrcIDList = new long[streams.size()]; - for ( ReceiveStream stream : streams) + for ( int i = 0; i < ssrcIDList.length; i++) { - ssrcIDList.add(Long.toHexString(stream.getSSRC())); + ReceiveStream stream = streams.get(i); + ssrcIDList[i] = stream.getSSRC(); } return ssrcIDList; diff --git a/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java b/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java index d478c78b1..518de2b63 100644 --- a/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java +++ b/src/net/java/sip/communicator/impl/neomedia/transform/csrc/CsrcTransformEngine.java @@ -10,24 +10,35 @@ import net.java.sip.communicator.impl.neomedia.transform.*; /** + * We use this engine to add the list of CSRC identifiers in RTP packets that + * we send to conference participants during calls where we are the mixer. + * * @author Emil Ivov */ public class CsrcTransformEngine implements TransformEngine, PacketTransformer { + /** + * The MediaStreamImpl that this transform engine was created to + * transform packets fro. + */ + private final MediaStreamImpl mediaStream; - /* (non-Javadoc) - * @see net.java.sip.communicator.impl.neomedia.transform.TransformEngine#getRTCPTransformer() + /** + * Creates + * @param stream */ + public CsrcTransformEngine(MediaStreamImpl stream) + { + this.mediaStream = stream; + } + public PacketTransformer getRTCPTransformer() { return null; } - /* (non-Javadoc) - * @see net.java.sip.communicator.impl.neomedia.transform.TransformEngine#getRTPTransformer() - */ public PacketTransformer getRTPTransformer() { return this;