src/jlibrtp/RtcpPktRTPFB.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
/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    22
 * RTCP packets for RTP Feedback Messages 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    23
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    24
 * In line with RFC 4585, this packet currently only supports NACKs
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    25
 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    26
 * @author Arne Kepp
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    27
 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    28
public class RtcpPktRTPFB extends RtcpPkt {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    29
	/** If this packet was for a different SSRC */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    30
	protected boolean notRelevant = false;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    31
	/** SSRC we are sending feeback to */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    32
	protected long ssrcMediaSource = -1;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    33
	/** RTP sequence numbers of lost packets */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    34
	protected int PID[];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    35
	/** bitmask of following lost packets, shared index with PID */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    36
	protected int BLP[];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    37
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    38
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    39
	 * Constructor for RTP Feedback Message
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    40
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    41
	 * @param ssrcPacketSender SSRC of sender, taken from RTPSession
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    42
	 * @param ssrcMediaSource SSRC of recipient of this message
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    43
	 * @param FMT the Feedback Message Subtype
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    44
	 * @param PID RTP sequence numbers of lost packets
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    45
	 * @param BLP bitmask of following lost packets, shared index with PID 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    46
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    47
	protected RtcpPktRTPFB(long ssrcPacketSender, long ssrcMediaSource, int FMT, int[] PID, int[] BLP) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    48
		super.packetType = 205; //RTPFB
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    49
		super.itemCount = FMT; 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    50
		this.PID = PID;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    51
		this.BLP = BLP;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    52
	}
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
	 * Constructor that parses a raw packet to retrieve information
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    56
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    57
	 * @param aRawPkt the raw packet to be parsed
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    58
	 * @param start the start of the packet, in bytes
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    59
	 * @param rtpSession the session on which the callback interface resides
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    60
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    61
	protected RtcpPktRTPFB(byte[] aRawPkt, int start, RTPSession rtpSession) {		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    62
		if(RTPSession.rtpDebugLevel > 8) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    63
			System.out.println("  -> RtcpPktRTPFB(byte[], int start)");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    64
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    65
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    66
		rawPkt = aRawPkt;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    67
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    68
		if(! super.parseHeaders(start) || packetType != 205 || super.length < 2) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    69
			if(RTPSession.rtpDebugLevel > 2) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    70
				System.out.println(" <-> RtcpPktRTPFB.parseHeaders() etc. problem");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    71
			}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    72
			super.problem = -205;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    73
		} else {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    74
			//FMT = super.itemCount;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    75
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    76
			ssrcMediaSource = StaticProcs.bytesToUIntLong(aRawPkt,8+start);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    77
			
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    78
			if(ssrcMediaSource == rtpSession.ssrc) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    79
				super.ssrc = StaticProcs.bytesToUIntLong(aRawPkt,4+start);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    80
				int loopStop = super.length - 2;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    81
				PID = new int[loopStop];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    82
				BLP = new int[loopStop];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    83
				int curStart = 12;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    84
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    85
				// Loop over Feedback Control Information (FCI) fields
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    86
				for(int i=0; i< loopStop; i++) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    87
					PID[i] = StaticProcs.bytesToUIntInt(aRawPkt, curStart);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    88
					BLP[i] = StaticProcs.bytesToUIntInt(aRawPkt, curStart + 2);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    89
					curStart += 4;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    90
				}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    91
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    92
				rtpSession.rtcpAVPFIntf.RTPFBPktReceived(
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    93
						super.ssrc, super.itemCount, PID, BLP);
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
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
    99
		if(RTPSession.rtpDebugLevel > 8) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   100
			System.out.println("  <- RtcpPktRTPFB()");
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
	 * Encode the packet into a byte[], saved in .rawPkt
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   106
	 * 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   107
	 * CompRtcpPkt will call this automatically
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   108
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   109
	protected void encode() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   110
		super.rawPkt = new byte[12 + this.PID.length*4];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   111
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   112
		byte[] someBytes = StaticProcs.uIntLongToByteWord(super.ssrc);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   113
		System.arraycopy(someBytes, 0, super.rawPkt, 4, 4);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   114
		someBytes = StaticProcs.uIntLongToByteWord(this.ssrcMediaSource);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   115
		System.arraycopy(someBytes, 0, super.rawPkt, 8, 4);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   116
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   117
		// Loop over Feedback Control Information (FCI) fields
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   118
		int curStart = 12;
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   119
		for(int i=0; i < this.PID.length; i++ ) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   120
			someBytes = StaticProcs.uIntIntToByteWord(PID[i]);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   121
			super.rawPkt[curStart++] = someBytes[0];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   122
			super.rawPkt[curStart++] = someBytes[1];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   123
			someBytes = StaticProcs.uIntIntToByteWord(BLP[i]);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   124
			super.rawPkt[curStart++] = someBytes[0];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   125
			super.rawPkt[curStart++] = someBytes[1];
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   126
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   127
		writeHeaders();
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   128
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   129
	
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   130
	/** 
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   131
	 * Get the FMT (Feedback Message Type)
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   132
	 * @return value stored in .itemcount, same field
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   133
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   134
	protected int getFMT() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   135
		return this.itemCount;
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
	/**
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   139
	 * Debug purposes only
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   140
	 */
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   141
	protected void debugPrint() {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   142
		System.out.println("->RtcpPktRTPFB.debugPrint() ");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   143
		System.out.println("  ssrcPacketSender: " + super.ssrc + "  ssrcMediaSource: " + ssrcMediaSource);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   144
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   145
		if(this.PID != null && this.PID.length < 1) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   146
			System.out.println("  No Feedback Control Information (FCI) fields");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   147
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   148
		
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   149
		for(int i=0; i < this.PID.length; i++ ) {
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   150
			System.out.println("  FCI -> PID: " + PID[i] + "  BLP: " + BLP[i]);
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   151
		}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   152
		System.out.println("<-RtcpPktRTPFB.debugPrint() ");
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   153
	}
e684f11070d5 ajout de jlibrtp
nikita@nikita-rack
parents:
diff changeset
   154
}