Skip to content
Snippets Groups Projects
Commit c64d7019 authored by Boris Grozev's avatar Boris Grozev
Browse files

Adds an RTCPFeedbackMessageSender to RTPTranslator.

parent 462a810c
Branches
Tags
No related merge requests found
/*
* Jitsi Videobridge, OpenSource video conferencing.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jitsi.impl.neomedia.rtp.translator;
import java.util.*;
import org.jitsi.impl.neomedia.*;
import org.jitsi.impl.neomedia.rtp.*;
import org.jitsi.impl.neomedia.rtp.translator.*;
import org.jitsi.service.neomedia.*;
import org.jitsi.service.neomedia.event.*;
/**
*
* @author Boris Grozev
* @author Lyubomir Marinov
*/
public class RTCPFeedbackMessageSender
{
private final RTPTranslatorImpl rtpTranslator;
private Map<Long,Integer> sequenceNumbers
= new LinkedHashMap<Long,Integer>();
public RTCPFeedbackMessageSender(RTPTranslatorImpl rtpTranslator)
{
this.rtpTranslator = rtpTranslator;
}
private int getNextSequenceNumber(int sourceSSRC, int targetSSRC)
{
synchronized (sequenceNumbers)
{
Long key
= Long.valueOf(
((sourceSSRC & 0xffffffffl) << 32)
| (targetSSRC & 0xffffffffl));
Integer value = sequenceNumbers.get(key);
int seqNr = (value == null) ? 0 : value.intValue();
sequenceNumbers.put(key, Integer.valueOf(seqNr + 1));
return seqNr;
}
}
private long getSenderSSRC()
{
long ssrc = rtpTranslator.getLocalSSRC(null);
return (ssrc == Long.MAX_VALUE) ? -1 : (ssrc & 0xffffffffl);
}
public boolean sendFIR(MediaStream destination, int mediaSenderSSRC)
{
long senderSSRC = getSenderSSRC();
if (senderSSRC == -1)
return false;
RTCPFeedbackMessagePacket fir
= new RTCPFeedbackMessagePacket(
RTCPFeedbackMessageEvent.FMT_FIR,
RTCPFeedbackMessageEvent.PT_PS,
senderSSRC,
0xffffffffl & mediaSenderSSRC);
fir.setSequenceNumber(
getNextSequenceNumber((int) senderSSRC, mediaSenderSSRC));
return rtpTranslator.writeRTCPFeedbackMessage(fir, destination);
}
public boolean sendFIR(MediaStream destination, int[] mediaSenderSSRCs)
{
boolean sentFIR = false;
for (int mediaSenderSSRC : mediaSenderSSRCs)
{
if (sendFIR(destination, mediaSenderSSRC))
sentFIR = true;
}
return sentFIR;
}
public boolean sendFIR(int mediaSenderSSRC)
{
boolean sentFIR = false;
for (StreamRTPManager streamRTPManager
: rtpTranslator.getStreamRTPManagers())
{
MediaStream stream = streamRTPManager.getMediaStream();
for (long streamSSRC : stream.getRemoteSourceIDs())
{
if (streamSSRC == (0xffffffffL & mediaSenderSSRC))
{
sentFIR |= sendFIR(stream, mediaSenderSSRC);
break;
}
}
}
return sentFIR;
}
}
......@@ -83,6 +83,14 @@ public class RTPTranslatorImpl
private final List<StreamRTPManagerDesc> streamRTPManagers
= new ArrayList<StreamRTPManagerDesc>();
/**
* An instance which can be used to send RTCP Feedback Messages, using
* as 'packet sender SSRC' the SSRC of (the <tt>RTPManager</tt> of) this
* <tt>RTPTranslator</tt>.
*/
private final RTCPFeedbackMessageSender rtcpFeedbackMessageSender
= new RTCPFeedbackMessageSender(this);
/**
* Initializes a new <tt>RTPTranslatorImpl</tt> instance.
*/
......@@ -1066,4 +1074,33 @@ public void setSSRCFactory(SSRCFactory ssrcFactory)
.setSSRCFactory(ssrcFactory);
}
}
/**
* Returns a list of <tt>StreamRTPManager</tt>s currently attached to
* this <tt>RTPTranslator</tt>.
* @return a list of <tt>StreamRTPManager</tt>s currently attached to
* this <tt>RTPTranslator</tt>.
*/
List<StreamRTPManager> getStreamRTPManagers()
{
List<StreamRTPManager> ret
= new ArrayList<StreamRTPManager>(streamRTPManagers.size());
for (StreamRTPManagerDesc streamRTPManagerDesc : streamRTPManagers)
{
ret.add(streamRTPManagerDesc.streamRTPManager);
}
return ret;
}
/**
* Gets the <tt>RTCPFeedbackMessageSender</tt> which should be used for
* sending RTCP Feedback Messages from this <tt>RTPTranslator</tt>.
* @return the <tt>RTCPFeedbackMessageSender</tt> which should be used for
* sending RTCP Feedback Messages from this <tt>RTPTranslator</tt>.
*/
public RTCPFeedbackMessageSender getRtcpFeedbackMessageSender()
{
return rtcpFeedbackMessageSender;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment