src/org/sipdroid/net/RtpPacket.java
author nikita@nikita-laptop
Sat, 23 Jan 2010 22:19:43 +0100
changeset 834 e8d6255306f8
child 835 4e40f3481f23
permissions -rw-r--r--
Sipdroid Basic
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     1
/*
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     2
 * Copyright (C) 2009 The Sipdroid Open Source Project
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     3
 * Copyright (C) 2005 Luca Veltri - University of Parma - Italy
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     4
 * 
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     5
 * This file is part of Sipdroid (http://www.sipdroid.org)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     6
 * 
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     7
 * Sipdroid is free software; you can redistribute it and/or modify
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     8
 * it under the terms of the GNU General Public License as published by
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
     9
 * the Free Software Foundation; either version 3 of the License, or
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    10
 * (at your option) any later version.
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    11
 * 
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    12
 * This source code is distributed in the hope that it will be useful,
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    15
 * GNU General Public License for more details.
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    16
 * 
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    18
 * along with this source code; if not, write to the Free Software
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    19
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    20
 */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    21
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    22
package src.org.sipdroid.net;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    23
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    24
import org.zoolu.tools.Random;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    25
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    26
/**
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    27
 * RtpPacket implements a RTP packet.
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    28
 */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    29
public class RtpPacket {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    30
	/* RTP packet buffer containing both the RTP header and payload */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    31
	byte[] packet;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    32
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    33
	/* RTP packet length */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    34
	int packet_len;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    35
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    36
	/* RTP header length */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    37
	// int header_len;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    38
	/** Gets the RTP packet */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    39
	public byte[] getPacket() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    40
		return packet;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    41
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    42
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    43
	/** Gets the RTP packet length */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    44
	public int getLength() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    45
		return packet_len;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    46
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    47
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    48
	/** Gets the RTP header length */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    49
	public int getHeaderLength() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    50
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    51
			return 12 + 4 * getCscrCount();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    52
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    53
			return packet_len; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    54
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    55
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    56
	/** Gets the RTP header length */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    57
	public int getPayloadLength() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    58
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    59
			return packet_len - getHeaderLength();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    60
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    61
			return 0; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    62
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    63
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    64
	/** Sets the RTP payload length */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    65
	public void setPayloadLength(int len) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    66
		packet_len = getHeaderLength() + len;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    67
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    68
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    69
	// version (V): 2 bits
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    70
	// padding (P): 1 bit
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    71
	// extension (X): 1 bit
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    72
	// CSRC count (CC): 4 bits
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    73
	// marker (M): 1 bit
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    74
	// payload type (PT): 7 bits
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    75
	// sequence number: 16 bits
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    76
	// timestamp: 32 bits
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    77
	// SSRC: 32 bits
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    78
	// CSRC list: 0 to 15 items, 32 bits each
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    79
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    80
	/** Gets the version (V) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    81
	public int getVersion() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    82
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    83
			return (packet[0] >> 6 & 0x03);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    84
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    85
			return 0; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    86
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    87
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    88
	/** Sets the version (V) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    89
	public void setVersion(int v) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    90
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    91
			packet[0] = (byte) ((packet[0] & 0x3F) | ((v & 0x03) << 6));
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    92
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    93
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    94
	/** Whether has padding (P) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    95
	public boolean hasPadding() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    96
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    97
			return getBit(packet[0], 5);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    98
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    99
			return false; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   100
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   101
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   102
	/** Set padding (P) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   103
	public void setPadding(boolean p) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   104
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   105
			packet[0] = setBit(p, packet[0], 5);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   106
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   107
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   108
	/** Whether has extension (X) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   109
	public boolean hasExtension() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   110
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   111
			return getBit(packet[0], 4);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   112
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   113
			return false; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   114
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   115
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   116
	/** Set extension (X) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   117
	public void setExtension(boolean x) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   118
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   119
			packet[0] = setBit(x, packet[0], 4);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   120
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   121
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   122
	/** Gets the CSCR count (CC) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   123
	public int getCscrCount() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   124
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   125
			return (packet[0] & 0x0F);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   126
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   127
			return 0; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   128
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   129
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   130
	/** Whether has marker (M) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   131
	public boolean hasMarker() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   132
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   133
			return getBit(packet[1], 7);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   134
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   135
			return false; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   136
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   137
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   138
	/** Set marker (M) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   139
	public void setMarker(boolean m) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   140
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   141
			packet[1] = setBit(m, packet[1], 7);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   142
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   143
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   144
	/** Gets the payload type (PT) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   145
	public int getPayloadType() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   146
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   147
			return (packet[1] & 0x7F);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   148
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   149
			return -1; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   150
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   151
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   152
	/** Sets the payload type (PT) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   153
	public void setPayloadType(int pt) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   154
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   155
			packet[1] = (byte) ((packet[1] & 0x80) | (pt & 0x7F));
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   156
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   157
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   158
	/** Gets the sequence number */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   159
	public int getSequenceNumber() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   160
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   161
			return getInt(packet, 2, 4);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   162
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   163
			return 0; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   164
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   165
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   166
	/** Sets the sequence number */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   167
	public void setSequenceNumber(int sn) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   168
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   169
			setInt(sn, packet, 2, 4);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   170
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   171
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   172
	/** Gets the timestamp */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   173
	public long getTimestamp() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   174
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   175
			return getLong(packet, 4, 8);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   176
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   177
			return 0; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   178
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   179
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   180
	/** Sets the timestamp */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   181
	public void setTimestamp(long timestamp) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   182
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   183
			setLong(timestamp, packet, 4, 8);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   184
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   185
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   186
	/** Gets the SSCR */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   187
	public long getSscr() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   188
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   189
			return getLong(packet, 8, 12);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   190
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   191
			return 0; // broken packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   192
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   193
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   194
	/** Sets the SSCR */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   195
	public void setSscr(long ssrc) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   196
		if (packet_len >= 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   197
			setLong(ssrc, packet, 8, 12);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   198
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   199
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   200
	/** Gets the CSCR list */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   201
	public long[] getCscrList() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   202
		int cc = getCscrCount();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   203
		long[] cscr = new long[cc];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   204
		for (int i = 0; i < cc; i++)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   205
			cscr[i] = getLong(packet, 12 + 4 * i, 16 + 4 * i);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   206
		return cscr;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   207
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   208
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   209
	/** Sets the CSCR list */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   210
	public void setCscrList(long[] cscr) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   211
		if (packet_len >= 12) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   212
			int cc = cscr.length;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   213
			if (cc > 15)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   214
				cc = 15;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   215
			packet[0] = (byte) (((packet[0] >> 4) << 4) + cc);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   216
			cscr = new long[cc];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   217
			for (int i = 0; i < cc; i++)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   218
				setLong(cscr[i], packet, 12 + 4 * i, 16 + 4 * i);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   219
			// header_len=12+4*cc;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   220
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   221
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   222
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   223
	/** Sets the payload */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   224
	public void setPayload(byte[] payload, int len) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   225
		if (packet_len >= 12) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   226
			int header_len = getHeaderLength();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   227
			for (int i = 0; i < len; i++)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   228
				packet[header_len + i] = payload[i];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   229
			packet_len = header_len + len;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   230
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   231
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   232
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   233
	/** Gets the payload */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   234
	public byte[] getPayload() {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   235
		int header_len = getHeaderLength();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   236
		int len = packet_len - header_len;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   237
		byte[] payload = new byte[len];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   238
		for (int i = 0; i < len; i++)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   239
			payload[i] = packet[header_len + i];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   240
		return payload;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   241
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   242
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   243
	/** Creates a new RTP packet */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   244
	public RtpPacket(byte[] buffer, int packet_length) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   245
		packet = buffer;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   246
		packet_len = packet_length;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   247
		if (packet_len < 12)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   248
			packet_len = 12;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   249
		init(0x0F);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   250
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   251
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   252
	/** init the RTP packet header (only PT) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   253
	public void init(int ptype) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   254
		init(ptype, Random.nextLong());
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   255
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   256
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   257
	/** init the RTP packet header (PT and SSCR) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   258
	public void init(int ptype, long sscr) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   259
		init(ptype, Random.nextInt(), Random.nextLong(), sscr);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   260
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   261
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   262
	/** init the RTP packet header (PT, SQN, TimeStamp, SSCR) */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   263
	public void init(int ptype, int seqn, long timestamp, long sscr) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   264
		setVersion(2);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   265
		setPayloadType(ptype);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   266
		setSequenceNumber(seqn);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   267
		setTimestamp(timestamp);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   268
		setSscr(sscr);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   269
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   270
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   271
	// *********************** Private and Static ***********************
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   272
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   273
	/** Gets int value */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   274
	private static int getInt(byte b) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   275
		return ((int) b + 256) % 256;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   276
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   277
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   278
	/** Gets long value */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   279
	private static long getLong(byte[] data, int begin, int end) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   280
		long n = 0;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   281
		for (; begin < end; begin++) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   282
			n <<= 8;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   283
			n += data[begin];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   284
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   285
		return n;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   286
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   287
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   288
	/** Sets long value */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   289
	private static void setLong(long n, byte[] data, int begin, int end) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   290
		for (end--; end >= begin; end--) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   291
			data[end] = (byte) (n % 256);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   292
			n >>= 8;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   293
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   294
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   295
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   296
	/** Gets Int value */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   297
	private static int getInt(byte[] data, int begin, int end) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   298
		return (int) getLong(data, begin, end);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   299
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   300
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   301
	/** Sets Int value */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   302
	private static void setInt(int n, byte[] data, int begin, int end) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   303
		setLong(n, data, begin, end);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   304
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   305
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   306
	/** Gets bit value */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   307
	private static boolean getBit(byte b, int bit) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   308
		return (b >> bit) == 1;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   309
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   310
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   311
	/** Sets bit value */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   312
	private static byte setBit(boolean value, byte b, int bit) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   313
		if (value)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   314
			return (byte) (b | (1 << bit));
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   315
		else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   316
			return (byte) ((b | (1 << bit)) ^ (1 << bit));
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   317
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   318
}