src/jlibrtp/RTCPSenderThread.java
author nikita@nikita-rack
Thu, 09 Apr 2009 20:26:58 +0200
changeset 99 8de21ac527ce
parent 13 e684f11070d5
permissions -rw-r--r--
revert pour refaire un push propre
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     1
/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     2
 * Java RTP Library (jlibrtp)
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     3
 * Copyright (C) 2006 Arne Kepp
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     4
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     5
 * This library is free software; you can redistribute it and/or
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     7
 * License as published by the Free Software Foundation; either
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     8
 * version 2.1 of the License, or (at your option) any later version.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
     9
 *
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    10
 * This library is distributed in the hope that it will be useful,
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    13
 * Lesser General Public License for more details.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    14
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    16
 * License along with this library; if not, write to the Free Software
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    18
 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    19
package jlibrtp;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    20
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    21
import java.net.DatagramPacket;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    22
import java.net.InetSocketAddress;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    23
import java.util.*;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    24
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    25
/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    26
 * This thread sends scheduled RTCP packets 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    27
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    28
 * It also performs maintenance of various queues and the participant
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    29
 * database.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    30
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    31
 * @author Arne Kepp
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    32
 *
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    33
 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    34
public class RTCPSenderThread extends Thread {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    35
	/** Parent RTP Session */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    36
	private RTPSession rtpSession = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    37
	/** Parent RTCP Session */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    38
	private RTCPSession rtcpSession = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    39
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    40
	/** Whether we have sent byes for the last conflict */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    41
	private boolean byesSent = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    42
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    43
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    44
	 * Constructor for new thread
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    45
	 * @param rtcpSession parent RTCP session
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    46
	 * @param rtpSession parent RTP session
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    47
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    48
	protected RTCPSenderThread(RTCPSession rtcpSession, RTPSession rtpSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    49
		this.rtpSession = rtpSession;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    50
		this.rtcpSession = rtcpSession;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    51
		if(RTPSession.rtpDebugLevel > 1) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    52
			System.out.println("<-> RTCPSenderThread created");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    53
		} 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    54
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    55
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    56
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    57
	 * Send BYE messages to all the relevant participants
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    58
	 *
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    59
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    60
	protected void sendByes() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    61
		// Create the packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    62
		CompRtcpPkt compPkt = new CompRtcpPkt();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    63
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    64
		//Need a SR for validation
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    65
		RtcpPktSR srPkt = new RtcpPktSR(this.rtpSession.ssrc, 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    66
				this.rtpSession.sentPktCount, this.rtpSession.sentOctetCount, null);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    67
		compPkt.addPacket(srPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    68
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    69
		byte[] reasonBytes;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    70
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    71
		//Add the actualy BYE Pkt
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    72
		long[] ssrcArray = {this.rtpSession.ssrc};
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    73
		if(rtpSession.conflict) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    74
			reasonBytes = "SSRC collision".getBytes();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    75
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    76
			reasonBytes = "jlibrtp says bye bye!".getBytes();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    77
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    78
		RtcpPktBYE byePkt = new RtcpPktBYE( ssrcArray, reasonBytes);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    79
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    80
		compPkt.addPacket(byePkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    81
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    82
		// Send it off
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    83
		if(rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    84
			mcSendCompRtcpPkt(compPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    85
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    86
			Iterator<Participant> iter = rtpSession.partDb.getUnicastReceivers();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    87
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    88
			while(iter.hasNext()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    89
				Participant part = (Participant) iter.next();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    90
				if(part.rtcpAddress != null)
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    91
					sendCompRtcpPkt(compPkt, part.rtcpAddress);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    92
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    93
			//System.out.println("SENT BYE PACKETS!!!!!");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    94
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    95
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    96
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    97
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    98
	 * Multicast version of sending a Compound RTCP packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    99
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   100
	 * @param pkt the packet to best
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   101
	 * @return 0 is successful, -1 otherwise
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   102
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   103
	protected int mcSendCompRtcpPkt(CompRtcpPkt pkt) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   104
		byte[] pktBytes = pkt.encode();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   105
		DatagramPacket packet;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   106
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   107
		// Create datagram
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   108
		try {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   109
			packet = new DatagramPacket(pktBytes,pktBytes.length,rtpSession.mcGroup,rtcpSession.rtcpMCSock.getPort());
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   110
		} catch (Exception e) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   111
			System.out.println("RCTPSenderThread.MCSendCompRtcpPkt() packet creation failed.");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   112
			e.printStackTrace();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   113
			return -1;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   114
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   115
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   116
		// Send packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   117
		if(RTPSession.rtcpDebugLevel > 5) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   118
			System.out.println("<-> RTCPSenderThread.SendCompRtcpPkt() multicast");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   119
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   120
		try {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   121
			rtcpSession.rtcpMCSock.send(packet);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   122
			//Debug
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   123
			if(this.rtpSession.debugAppIntf != null) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   124
				this.rtpSession.debugAppIntf.packetSent(3, (InetSocketAddress) packet.getSocketAddress(), 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   125
						new String("Sent multicast RTCP packet of size " + packet.getLength() + 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   126
								" to " + packet.getSocketAddress().toString() + " via " 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   127
								+ this.rtcpSession.rtcpMCSock.getLocalSocketAddress().toString()));
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   128
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   129
		} catch (Exception e) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   130
			System.out.println("RCTPSenderThread.MCSendCompRtcpPkt() multicast failed.");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   131
			e.printStackTrace();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   132
			return -1;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   133
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   134
		return packet.getLength();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   135
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   136
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   137
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   138
	 * Unicast version of sending a Compound RTCP packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   139
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   140
	 * @param pkt the packet to best
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   141
	 * @param receiver the socket address of the recipient
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   142
	 * @return 0 is successful, -1 otherwise
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   143
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   144
	protected int sendCompRtcpPkt(CompRtcpPkt pkt, InetSocketAddress receiver) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   145
		byte[] pktBytes = pkt.encode();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   146
		DatagramPacket packet;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   147
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   148
		//Create datagram
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   149
		try {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   150
			//System.out.println("receiver: " + receiver);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   151
			packet = new DatagramPacket(pktBytes,pktBytes.length,receiver);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   152
		} catch (Exception e) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   153
			System.out.println("RCTPSenderThread.SendCompRtcpPkt() packet creation failed.");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   154
			e.printStackTrace();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   155
			return -1;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   156
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   157
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   158
		//Send packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   159
		if(RTPSession.rtcpDebugLevel > 5) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   160
			Iterator<RtcpPkt> iter = pkt.rtcpPkts.iterator();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   161
			String str = " ";
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   162
			while(iter.hasNext()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   163
				RtcpPkt aPkt = iter.next();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   164
				str += (aPkt.getClass().toString() + ":"+aPkt.itemCount+ ", ");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   165
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   166
			System.out.println("<-> RTCPSenderThread.SendCompRtcpPkt() unicast to " + receiver + str);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   167
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   168
		try {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   169
			rtcpSession.rtcpSock.send(packet);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   170
			//Debug
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   171
			if(this.rtpSession.debugAppIntf != null) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   172
				this.rtpSession.debugAppIntf.packetSent(2, (InetSocketAddress) packet.getSocketAddress(), 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   173
						new String("Sent unicast RTCP packet of size " + packet.getLength() + 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   174
								" to " + packet.getSocketAddress().toString() + " via " 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   175
								+ this.rtcpSession.rtcpSock.getLocalSocketAddress().toString()));
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   176
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   177
		} catch (Exception e) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   178
			System.out.println("RTCPSenderThread.SendCompRtcpPkt() unicast failed.");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   179
			e.printStackTrace();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   180
			return -1;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   181
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   182
		return packet.getLength();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   183
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   184
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   185
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   186
	 * Check whether we can send an immediate feedback packet to this person
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   187
	 * @param ssrc SSRC of participant
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   188
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   189
	protected void reconsiderTiming(long ssrc) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   190
		Participant part =  this.rtpSession.partDb.getParticipant(ssrc);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   191
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   192
		if( part != null && this.rtcpSession.fbSendImmediately()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   193
			CompRtcpPkt compPkt = preparePacket(part, false);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   194
			/*********** Send the packet ***********/
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   195
			// Keep track of sent packet length for average;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   196
			int datagramLength;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   197
			if(rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   198
				datagramLength = this.mcSendCompRtcpPkt(compPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   199
			} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   200
				//part.debugPrint();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   201
				datagramLength = this.sendCompRtcpPkt(compPkt, part.rtcpAddress);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   202
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   203
			/*********** Administrative tasks ***********/			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   204
			//Update average packet size
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   205
			if(datagramLength > 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   206
				rtcpSession.updateAvgPacket(datagramLength);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   207
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   208
		} else if(part != null 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   209
				&& this.rtcpSession.fbAllowEarly 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   210
				&& this.rtcpSession.fbSendEarly()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   211
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   212
			// Make sure we dont do it too often
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   213
			this.rtcpSession.fbAllowEarly = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   214
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   215
			CompRtcpPkt compPkt = preparePacket(part, true);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   216
			/*********** Send the packet ***********/
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   217
			// Keep track of sent packet length for average;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   218
			int datagramLength;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   219
			if(rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   220
				datagramLength = this.mcSendCompRtcpPkt(compPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   221
			} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   222
				//part.debugPrint();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   223
				datagramLength = this.sendCompRtcpPkt(compPkt, part.rtcpAddress);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   224
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   225
			/*********** Administrative tasks ***********/			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   226
			//Update average packet size
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   227
			if(datagramLength > 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   228
				rtcpSession.updateAvgPacket(datagramLength);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   229
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   230
			rtcpSession.calculateDelay();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   231
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   232
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   233
		//Out of luck, fb message will have to go with next regular packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   234
		//Sleep for the remaining time.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   235
		this.rtcpSession.nextDelay -= System.currentTimeMillis() - this.rtcpSession.prevTime;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   236
		if(this.rtcpSession.nextDelay < 0)
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   237
			this.rtcpSession.nextDelay = 0;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   238
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   239
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   240
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   241
	/** 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   242
	 * Prepare a packet. The output depends on the participant and how the
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   243
	 * packet is scheduled.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   244
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   245
	 * @param part the participant to report to
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   246
	 * @param regular whether this is a regularly, or early scheduled RTCP packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   247
	 * @return compound RTCP packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   248
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   249
	protected CompRtcpPkt preparePacket(Participant part, boolean regular) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   250
		/*********** Figure out what we are going to send ***********/
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   251
		// Check whether this person has sent RTP packets since the last RR.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   252
		boolean incRR = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   253
		if(part.secondLastRtcpRRPkt > part.lastRtcpRRPkt) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   254
			incRR = true;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   255
			part.secondLastRtcpRRPkt = part.lastRtcpRRPkt;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   256
			part.lastRtcpRRPkt = System.currentTimeMillis();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   257
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   258
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   259
		// Are we sending packets? -> add SR
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   260
		boolean incSR = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   261
		if(rtpSession.sentPktCount > 0 && regular) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   262
			incSR = true;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   263
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   264
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   265
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   266
		/*********** Actually create the packet ***********/
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   267
		// Create compound packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   268
		CompRtcpPkt compPkt = new CompRtcpPkt();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   269
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   270
		//If we're sending packets we'll use a SR for header
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   271
		if(incSR) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   272
			RtcpPktSR srPkt = new RtcpPktSR(this.rtpSession.ssrc, 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   273
					this.rtpSession.sentPktCount, this.rtpSession.sentOctetCount, null);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   274
			compPkt.addPacket(srPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   275
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   276
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   277
			if(part.ssrc > 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   278
				RtcpPkt[] ar = this.rtcpSession.getFromFbQueue(part.ssrc);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   279
				if(ar != null) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   280
					for(int i=0; i<ar.length; i++) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   281
						compPkt.addPacket(ar[i]);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   282
					}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   283
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   284
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   285
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   286
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   287
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   288
		//If we got anything from this participant since we sent the 2nd to last RtcpPkt
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   289
		if(incRR || !incSR) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   290
			Participant[] partArray = {part};
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   291
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   292
			if(part.receivedPkts < 1)
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   293
				partArray = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   294
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   295
			RtcpPktRR rrPkt = new RtcpPktRR(partArray, rtpSession.ssrc);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   296
			compPkt.addPacket(rrPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   297
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   298
			if( !incSR && part.ssrc > 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   299
				RtcpPkt[] ar = this.rtcpSession.getFromFbQueue(part.ssrc);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   300
				if(ar != null) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   301
					for(int i=0; i<ar.length; i++) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   302
						compPkt.addPacket(ar[i]);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   303
					}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   304
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   305
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   306
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   307
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   308
		// APP packets
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   309
		if(regular && part.ssrc > 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   310
			RtcpPkt[] ar = this.rtcpSession.getFromAppQueue(part.ssrc);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   311
			if(ar != null) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   312
				for(int i=0; i<ar.length; i++) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   313
					compPkt.addPacket(ar[i]);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   314
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   315
			} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   316
				//Nope
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   317
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   318
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   319
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   320
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   321
		// For now we'll stick the SDES on every time, and only for us
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   322
		//if(regular) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   323
			RtcpPktSDES sdesPkt = new RtcpPktSDES(true, this.rtpSession, null);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   324
			compPkt.addPacket(sdesPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   325
		//}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   326
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   327
		return compPkt;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   328
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   329
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   330
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   331
	 * Start the RTCP sender thread.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   332
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   333
	 * RFC 4585 is more complicated, but in general it will
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   334
	 * 1) Wait a precalculated amount of time
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   335
	 * 2) Determine the next RTCP recipient
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   336
	 * 3) Construct a compound packet with all the relevant information
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   337
	 * 4) Send the packet
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   338
	 * 5) Calculate next delay before going to sleep
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   339
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   340
	public void run() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   341
		if(RTPSession.rtcpDebugLevel > 1) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   342
			System.out.println("<-> RTCPSenderThread running");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   343
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   344
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   345
		// Give the application a chance to register some participants
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   346
		try { Thread.sleep(10); } 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   347
		catch (Exception e) { System.out.println("RTCPSenderThread didn't get any initial rest."); }
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   348
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   349
		// Set up an iterator for the member list
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   350
		Enumeration<Participant> enu = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   351
		Iterator<Participant> iter = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   352
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   353
		// TODO Change to rtcpReceivers
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   354
		if(rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   355
			enu = rtpSession.partDb.getParticipants();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   356
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   357
			iter = rtpSession.partDb.getUnicastReceivers();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   358
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   359
		while(! rtpSession.endSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   360
			if(RTPSession.rtcpDebugLevel > 5) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   361
				System.out.println("<-> RTCPSenderThread sleeping for " +rtcpSession.nextDelay+" ms");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   362
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   363
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   364
			try { Thread.sleep(rtcpSession.nextDelay); } 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   365
			catch (Exception e) { 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   366
				System.out.println("RTCPSenderThread Exception message:" + e.getMessage());
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   367
				// Is the party over?
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   368
				if(this.rtpSession.endSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   369
					continue;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   370
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   371
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   372
				if(rtcpSession.fbWaiting != -1) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   373
					reconsiderTiming(rtcpSession.fbWaiting);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   374
					continue;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   375
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   376
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   377
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   378
			/** Came here the regular way */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   379
			this.rtcpSession.fbAllowEarly = true;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   380
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   381
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   382
			if(RTPSession.rtcpDebugLevel > 5) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   383
				System.out.println("<-> RTCPSenderThread waking up");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   384
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   385
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   386
			// Regenerate nextDelay, before anything happens.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   387
			rtcpSession.calculateDelay();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   388
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   389
			// We'll wait here until a conflict (if any) has been resolved,
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   390
			// so that the bye packets for our current SSRC can be sent.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   391
			if(rtpSession.conflict) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   392
				if(! this.byesSent) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   393
					sendByes();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   394
					this.byesSent = true;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   395
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   396
				continue;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   397
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   398
			this.byesSent = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   399
						
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   400
			//Grab the next person
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   401
			Participant part = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   402
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   403
			//Multicast
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   404
			if(this.rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   405
				if(! enu.hasMoreElements())
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   406
					enu = rtpSession.partDb.getParticipants();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   407
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   408
				if( enu.hasMoreElements() ) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   409
					part = enu.nextElement();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   410
				} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   411
					continue;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   412
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   413
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   414
			//Unicast
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   415
			} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   416
				if(! iter.hasNext()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   417
					iter = rtpSession.partDb.getUnicastReceivers();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   418
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   419
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   420
				if(iter.hasNext() ) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   421
					while( iter.hasNext() && (part == null || part.rtcpAddress == null)) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   422
						part = iter.next();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   423
					}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   424
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   425
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   426
				if(part == null || part.rtcpAddress == null)
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   427
					continue;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   428
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   429
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   430
			CompRtcpPkt compPkt = preparePacket(part, true);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   431
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   432
			/*********** Send the packet ***********/
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   433
			// Keep track of sent packet length for average;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   434
			int datagramLength;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   435
			if(rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   436
				datagramLength = this.mcSendCompRtcpPkt(compPkt);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   437
			} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   438
				//part.debugPrint();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   439
				datagramLength = this.sendCompRtcpPkt(compPkt, part.rtcpAddress);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   440
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   441
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   442
			/*********** Administrative tasks ***********/			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   443
			//Update average packet size
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   444
			if(datagramLength > 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   445
				rtcpSession.updateAvgPacket(datagramLength);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   446
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   447
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   448
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   449
		// Be polite, say Bye to everone
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   450
		sendByes();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   451
		try { Thread.sleep(200);} catch(Exception e) {}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   452
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   453
		if(RTPSession.rtcpDebugLevel > 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   454
			System.out.println("<-> RTCPSenderThread terminating");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   455
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   456
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   457
}