src/org/sipdroid/net/RtpPacket.java
author Nikita Kozlov <nikita@elyzion.net>
Wed, 06 Jun 2012 23:24:12 +0200
changeset 1005 a2cad81f348b
parent 835 4e40f3481f23
permissions -rw-r--r--
fix some bugs + update jingle code in asmack
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
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    22
package org.sipdroid.net;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    23
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    24
import com.beem.project.beem.utils.Random;
834
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 {
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    30
    /* RTP packet buffer containing both the RTP header and payload */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    31
    byte[] packet;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    32
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    33
    /* RTP packet length */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    34
    int packet_len;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    35
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    36
    /* RTP header length */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    37
    // int header_len;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    38
    /** Gets the RTP packet */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    39
    public byte[] getPacket() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    40
	return packet;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    41
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    42
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    43
    /** Gets the RTP packet length */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    44
    public int getLength() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    45
	return packet_len;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    46
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    47
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    48
    /** Gets the RTP header length */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    49
    public int getHeaderLength() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    50
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    51
	    return 12 + 4 * getCscrCount();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    52
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    53
	    return packet_len; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    54
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    55
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    56
    /** Gets the RTP header length */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    57
    public int getPayloadLength() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    58
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    59
	    return packet_len - getHeaderLength();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    60
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    61
	    return 0; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    62
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    63
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    64
    /** Sets the RTP payload length */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    65
    public void setPayloadLength(int len) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    66
	packet_len = getHeaderLength() + len;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    67
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    68
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    69
    // version (V): 2 bits
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    70
    // padding (P): 1 bit
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    71
    // extension (X): 1 bit
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    72
    // CSRC count (CC): 4 bits
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    73
    // marker (M): 1 bit
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    74
    // payload type (PT): 7 bits
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    75
    // sequence number: 16 bits
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    76
    // timestamp: 32 bits
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    77
    // SSRC: 32 bits
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    78
    // CSRC list: 0 to 15 items, 32 bits each
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    79
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    80
    /** Gets the version (V) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    81
    public int getVersion() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    82
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    83
	    return (packet[0] >> 6 & 0x03);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    84
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    85
	    return 0; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    86
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    87
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    88
    /** Sets the version (V) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    89
    public void setVersion(int v) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    90
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    91
	    packet[0] = (byte) ((packet[0] & 0x3F) | ((v & 0x03) << 6));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    92
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
    93
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    94
    /** Whether has padding (P) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    95
    public boolean hasPadding() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    96
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    97
	    return getBit(packet[0], 5);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    98
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    99
	    return false; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   100
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   101
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   102
    /** Set padding (P) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   103
    public void setPadding(boolean p) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   104
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   105
	    packet[0] = setBit(p, packet[0], 5);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   106
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   107
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   108
    /** Whether has extension (X) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   109
    public boolean hasExtension() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   110
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   111
	    return getBit(packet[0], 4);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   112
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   113
	    return false; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   114
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   115
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   116
    /** Set extension (X) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   117
    public void setExtension(boolean x) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   118
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   119
	    packet[0] = setBit(x, packet[0], 4);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   120
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   121
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   122
    /** Gets the CSCR count (CC) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   123
    public int getCscrCount() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   124
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   125
	    return (packet[0] & 0x0F);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   126
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   127
	    return 0; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   128
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   129
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   130
    /** Whether has marker (M) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   131
    public boolean hasMarker() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   132
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   133
	    return getBit(packet[1], 7);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   134
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   135
	    return false; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   136
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   137
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   138
    /** Set marker (M) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   139
    public void setMarker(boolean m) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   140
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   141
	    packet[1] = setBit(m, packet[1], 7);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   142
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   143
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   144
    /** Gets the payload type (PT) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   145
    public int getPayloadType() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   146
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   147
	    return (packet[1] & 0x7F);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   148
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   149
	    return -1; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   150
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   151
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   152
    /** Sets the payload type (PT) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   153
    public void setPayloadType(int pt) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   154
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   155
	    packet[1] = (byte) ((packet[1] & 0x80) | (pt & 0x7F));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   156
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   157
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   158
    /** Gets the sequence number */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   159
    public int getSequenceNumber() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   160
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   161
	    return getInt(packet, 2, 4);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   162
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   163
	    return 0; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   164
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   165
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   166
    /** Sets the sequence number */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   167
    public void setSequenceNumber(int sn) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   168
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   169
	    setInt(sn, packet, 2, 4);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   170
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   171
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   172
    /** Gets the timestamp */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   173
    public long getTimestamp() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   174
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   175
	    return getLong(packet, 4, 8);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   176
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   177
	    return 0; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   178
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   179
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   180
    /** Sets the timestamp */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   181
    public void setTimestamp(long timestamp) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   182
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   183
	    setLong(timestamp, packet, 4, 8);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   184
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   185
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   186
    /** Gets the SSCR */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   187
    public long getSscr() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   188
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   189
	    return getLong(packet, 8, 12);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   190
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   191
	    return 0; // broken packet
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   192
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   193
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   194
    /** Sets the SSCR */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   195
    public void setSscr(long ssrc) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   196
	if (packet_len >= 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   197
	    setLong(ssrc, packet, 8, 12);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   198
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   199
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   200
    /** Gets the CSCR list */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   201
    public long[] getCscrList() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   202
	int cc = getCscrCount();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   203
	long[] cscr = new long[cc];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   204
	for (int i = 0; i < cc; i++)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   205
	    cscr[i] = getLong(packet, 12 + 4 * i, 16 + 4 * i);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   206
	return cscr;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   207
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   208
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   209
    /** Sets the CSCR list */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   210
    public void setCscrList(long[] cscr) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   211
	if (packet_len >= 12) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   212
	    int cc = cscr.length;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   213
	    if (cc > 15)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   214
		cc = 15;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   215
	    packet[0] = (byte) (((packet[0] >> 4) << 4) + cc);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   216
	    cscr = new long[cc];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   217
	    for (int i = 0; i < cc; i++)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   218
		setLong(cscr[i], packet, 12 + 4 * i, 16 + 4 * i);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   219
	    // header_len=12+4*cc;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   220
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   221
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   222
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   223
    /** Sets the payload */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   224
    public void setPayload(byte[] payload, int len) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   225
	if (packet_len >= 12) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   226
	    int header_len = getHeaderLength();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   227
	    for (int i = 0; i < len; i++)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   228
		packet[header_len + i] = payload[i];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   229
	    packet_len = header_len + len;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   230
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   231
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   232
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   233
    /** Gets the payload */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   234
    public byte[] getPayload() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   235
	int header_len = getHeaderLength();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   236
	int len = packet_len - header_len;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   237
	byte[] payload = new byte[len];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   238
	for (int i = 0; i < len; i++)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   239
	    payload[i] = packet[header_len + i];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   240
	return payload;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   241
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   242
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   243
    /** Creates a new RTP packet */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   244
    public RtpPacket(byte[] buffer, int packet_length) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   245
	packet = buffer;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   246
	packet_len = packet_length;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   247
	if (packet_len < 12)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   248
	    packet_len = 12;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   249
	init(0x0F);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   250
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   251
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   252
    /** init the RTP packet header (only PT) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   253
    public void init(int ptype) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   254
	init(ptype, Random.nextLong());
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   255
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   256
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   257
    /** init the RTP packet header (PT and SSCR) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   258
    public void init(int ptype, long sscr) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   259
	init(ptype, Random.nextInt(), Random.nextLong(), sscr);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   260
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   261
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   262
    /** init the RTP packet header (PT, SQN, TimeStamp, SSCR) */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   263
    public void init(int ptype, int seqn, long timestamp, long sscr) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   264
	setVersion(2);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   265
	setPayloadType(ptype);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   266
	setSequenceNumber(seqn);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   267
	setTimestamp(timestamp);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   268
	setSscr(sscr);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   269
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   270
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   271
    // *********************** Private and Static ***********************
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   272
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   273
    /** Gets int value */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   274
    private static int getInt(byte b) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   275
	return ((int) b + 256) % 256;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   276
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   277
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   278
    /** Gets long value */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   279
    private static long getLong(byte[] data, int begin, int end) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   280
	long n = 0;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   281
	for (; begin < end; begin++) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   282
	    n <<= 8;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   283
	    n += data[begin];
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   284
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   285
	return n;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   286
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   287
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   288
    /** Sets long value */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   289
    private static void setLong(long n, byte[] data, int begin, int end) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   290
	for (end--; end >= begin; end--) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   291
	    data[end] = (byte) (n % 256);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   292
	    n >>= 8;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   293
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   294
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   295
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   296
    /** Gets Int value */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   297
    private static int getInt(byte[] data, int begin, int end) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   298
	return (int) getLong(data, begin, end);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   299
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   300
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   301
    /** Sets Int value */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   302
    private static void setInt(int n, byte[] data, int begin, int end) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   303
	setLong(n, data, begin, end);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   304
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   305
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   306
    /** Gets bit value */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   307
    private static boolean getBit(byte b, int bit) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   308
	return (b >> bit) == 1;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   309
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   310
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   311
    /** Sets bit value */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   312
    private static byte setBit(boolean value, byte b, int bit) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   313
	if (value)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   314
	    return (byte) (b | (1 << bit));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   315
	else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   316
	    return (byte) ((b | (1 << bit)) ^ (1 << bit));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   317
    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents:
diff changeset
   318
}