src/jlibrtp/ParticipantDatabase.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.util.*;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    22
import java.util.concurrent.*;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    23
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    24
/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    25
 * The participant database maintains three hashtables with participants.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    26
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    27
 * The key issue is to be fast for operations that happen every time an
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    28
 * RTP packet is sent or received. We allow linear searching in cases 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    29
 * where we need to update participants with information.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    30
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    31
 * The keying is therefore usually the SSRC. In cases where we have the
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    32
 * cname, but no SSRC is known (no SDES packet has been received), a
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    33
 * simple hash i calculated based on the CNAME. The RTCP code should,
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    34
 * when receiving SDES packets, check whether the participant is known
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    35
 * and update the copy in this database with SSRC if needed.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    36
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    37
 * @author Arne Kepp
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    38
 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    39
public class ParticipantDatabase {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    40
	/** The parent RTP Session */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    41
	RTPSession rtpSession = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    42
	/** 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    43
	 * A linked list to hold participants explicitly added by the application
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    44
	 * In unicast mode this is the list used for RTP and RTCP transmission, 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    45
	 * in multicast it should not be in use. 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    46
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    47
	LinkedList<Participant> receivers = new LinkedList<Participant>();	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    48
	/** 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    49
	 * The hashtable holds participants added through received RTP and RTCP packets,
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    50
	 * as well as participants that have been linked to an SSRC by ip address (in unicast mode).
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    51
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    52
	ConcurrentHashMap<Long,Participant> ssrcTable = new ConcurrentHashMap<Long,Participant>();
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
	 * Simple constructor
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    56
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    57
	 * @param parent parent RTPSession
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    58
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    59
	protected ParticipantDatabase(RTPSession parent) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    60
		rtpSession = parent;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    61
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    62
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    63
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    64
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    65
	 * @param cameFrom 0: Application, 1: RTP packet, 2: RTCP
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    66
	 * @param p the participant
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    67
	 * @return 0 if okay, -1 if not 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    68
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    69
	protected int addParticipant(int cameFrom, Participant p) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    70
		//Multicast or not?
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    71
		if(this.rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    72
			return this.addParticipantMulticast(cameFrom, p);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    73
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    74
			return this.addParticipantUnicast(cameFrom, p);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    75
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    76
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    77
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    78
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    79
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    80
	 * Add a multicast participant to the database
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    81
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    82
	 * @param cameFrom 0: Application, 1,2: discovered through RTP or RTCP
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    83
	 * @param p the participant to add
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    84
	 * @return 0 if okay, -2 if redundant, -1 if adding participant to multicast
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    85
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    86
	private int addParticipantMulticast(int cameFrom, Participant p) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    87
		if( cameFrom == 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    88
			System.out.println("ParticipantDatabase.addParticipant() doesnt expect" 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    89
					+ " application to add participants to multicast session.");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    90
			return -1;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    91
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    92
			// Check this one is not redundant
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    93
			if(this.ssrcTable.contains(p.ssrc)) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    94
				System.out.println("ParticipantDatabase.addParticipant() SSRC "
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    95
						+"already known " + Long.toString(p.ssrc));
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    96
				return -2;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    97
			} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    98
				this.ssrcTable.put(p.ssrc, p);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    99
				return 0;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   100
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   101
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   102
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   103
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   104
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   105
	 * Add a unicast participant to the database
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   106
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   107
	 * Result will be reported back through tpSession.appIntf.userEvent
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   108
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   109
	 * @param cameFrom 0: Application, 1,2: discovered through RTP or RTCP
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   110
	 * @param p the participant to add
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   111
	 * @return 0 if new, 1 if 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   112
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   113
	private int addParticipantUnicast(int cameFrom, Participant p) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   114
		if(cameFrom == 0) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   115
			//Check whether there is a match in the ssrcTable
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   116
			boolean notDone = true;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   117
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   118
			Enumeration<Participant> enu = this.ssrcTable.elements();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   119
			while(notDone && enu.hasMoreElements()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   120
				Participant part = enu.nextElement();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   121
				if(part.unexpected && 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   122
						(part.rtcpReceivedFromAddress.equals(part.rtcpAddress.getAddress()) 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   123
						|| part.rtpReceivedFromAddress.equals(part.rtpAddress.getAddress()))) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   124
					
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   125
					part.rtpAddress = p.rtpAddress;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   126
					part.rtcpAddress = p.rtcpAddress;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   127
					part.unexpected = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   128
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   129
					//Report the match back to the application
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   130
					Participant[] partArray = {part};
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   131
					this.rtpSession.appIntf.userEvent(5, partArray);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   132
					
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   133
					notDone = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   134
					p = part;
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
			//Add to the table of people that we send packets to
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   139
			this.receivers.add(p);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   140
			return 0;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   141
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   142
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   143
			//Check whether there's a match in the receivers table
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   144
			boolean notDone = true;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   145
			//System.out.println("GOT " + p.cname);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   146
			Iterator<Participant> iter = this.receivers.iterator();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   147
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   148
			while(notDone && iter.hasNext()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   149
				Participant part = iter.next();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   150
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   151
				//System.out.println(part.rtpAddress.getAddress().toString()
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   152
				//		+ " " + part.rtcpAddress.getAddress().toString() 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   153
				//		+ " " + p.rtpReceivedFromAddress.getAddress().toString()
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   154
				//		+ " " + p.rtcpReceivedFromAddress.getAddress().toString());
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   155
				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   156
				//System.out.println(" HUUHHHH?  " + p.rtcpReceivedFromAddress.getAddress().equals(part.rtcpAddress.getAddress()));
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   157
				if((cameFrom == 1 && p.rtpReceivedFromAddress.getAddress().equals(part.rtpAddress.getAddress()))
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   158
					|| (cameFrom == 2 && p.rtcpReceivedFromAddress.getAddress().equals(part.rtcpAddress.getAddress()))) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   159
					
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   160
					part.rtpReceivedFromAddress = p.rtpReceivedFromAddress;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   161
					part.rtcpReceivedFromAddress = p.rtcpReceivedFromAddress;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   162
					
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   163
					// Move information
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   164
					part.ssrc = p.ssrc;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   165
					part.cname = p.cname;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   166
					part.name = p.name;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   167
					part.loc = p.loc;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   168
					part.phone = p.phone;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   169
					part.email = p.email;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   170
					part.note = p.note;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   171
					part.tool = p.tool;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   172
					part.priv = p.priv;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   173
					
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   174
					this.ssrcTable.put(part.ssrc, part);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   175
					
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   176
					//Report the match back to the application
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   177
					Participant[] partArray = {part};
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   178
					this.rtpSession.appIntf.userEvent(5, partArray);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   179
					return 0;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   180
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   181
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   182
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   183
			// No match? ok
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   184
			this.ssrcTable.put(p.ssrc, p);				
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   185
			return 0;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   186
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   187
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   188
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   189
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   190
	 * Remove a participant from all tables
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   191
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   192
	 * @param p the participant to be removed
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   193
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   194
	protected void removeParticipant(Participant p) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   195
		if(! this.rtpSession.mcSession)
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   196
			this.receivers.remove(p);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   197
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   198
		this.ssrcTable.remove(p.ssrc, p);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   199
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   200
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   201
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   202
	 * Find a participant based on the ssrc
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   203
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   204
	 * @param ssrc of the participant to be found
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   205
	 * @return the participant, null if unknonw
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   206
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   207
	protected Participant getParticipant(long ssrc) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   208
		Participant p = null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   209
		p = ssrcTable.get(ssrc);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   210
		return p; 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   211
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   212
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   213
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   214
	 * Iterator for all the unicast receivers.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   215
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   216
	 * This one is used by both RTP for sending packets, as well as RTCP.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   217
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   218
	 * @return iterator for unicast participants
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   219
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   220
	protected Iterator<Participant> getUnicastReceivers() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   221
		if(! this.rtpSession.mcSession) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   222
			return this.receivers.iterator();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   223
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   224
			System.out.println("Request for ParticipantDatabase.getUnicastReceivers in multicast session");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   225
			return null;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   226
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   227
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   228
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   229
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   230
	 * Enumeration of all the participants with known ssrcs.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   231
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   232
	 * This is primarily used for sending packets in multicast sessions.
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   233
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   234
	 * @return enumerator with all the participants with known SSRCs
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   235
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   236
	protected Enumeration<Participant> getParticipants() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   237
		return this.ssrcTable.elements();
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
	protected void debugPrint() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   241
		System.out.println("   ParticipantDatabase.debugPrint()");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   242
		Participant p;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   243
		Enumeration enu = ssrcTable.elements();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   244
		while(enu.hasMoreElements()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   245
			p = (Participant) enu.nextElement();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   246
			System.out.println("           ssrcTable ssrc:"+p.ssrc+" cname:"+p.cname
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   247
					+" loc:"+p.loc+" rtpAddress:"+p.rtpAddress+" rtcpAddress:"+p.rtcpAddress);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   248
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   249
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   250
		Iterator<Participant> iter = receivers.iterator();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   251
		while(iter.hasNext()) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   252
			p = iter.next();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   253
			System.out.println("           receivers: "+p.rtpAddress.toString());
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   254
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   255
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   256
}