src/jlibrtp/ParticipantDatabase.java
author Da Risk <darisk972@gmail.com>
Tue, 14 Apr 2009 16:56:20 +0200
changeset 105 c6e4728ac9f7
parent 13 e684f11070d5
permissions -rw-r--r--
Passage sous cupcake :) Peu de modification de code, il faut juste creer des fichier aidl pour les classes parcelables. Sinon les fichier de build.xml ont ete completement modifiés, j'ai remplacé par les nouveaux. (il doit y avoir un manque de precision dans le fichier build.properties)
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
}