/*
* RtpPacket.java
*
* Mobicents Media Gateway
*
* The source code contained in this file is in in the public domain.
* It can be used in any project or product without prior permission,
* license or royalty payments. There is NO WARRANTY OF ANY KIND,
* EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION,
* THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
* AND DATA ACCURACY. We do not warrant or make any representations
* regarding the use of the software or the results thereof, including
* but not limited to the correctness, accuracy, reliability or
* usefulness of the software.
*/
package org.mobicents.media.server.testsuite.general.rtp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.util.Date;
import org.mobicents.media.server.testsuite.general.AbstractTestCase;
/**
*
* @author Oleg Kulikov
*/
public class RtpPacket implements Serializable {
private int version = 2;
private boolean padding = false;
private boolean extensions = false;
private int cc = 0;
private boolean marker = false;
private int payloadType;
private int seqNumber;
private int timestamp;
private long ssrc;
private byte[] payload;
private int offset = 0;
private int length = 0;
private Date time;
private long callSequence;
public RtpPacket(ByteBuffer readerBuffer) {
int len = readerBuffer.limit();
int b = readerBuffer.get() & 0xff;
version = (b & 0x0C) >> 6;
padding = (b & 0x20) == 0x020;
extensions = (b & 0x10) == 0x10;
cc = b & 0x0F;
b = readerBuffer.get() & 0xff;
marker = (b & 0x80) == 0x80;
payloadType = b & 0x7F;
seqNumber = (readerBuffer.get() & 0xff) << 8;
seqNumber = seqNumber | (readerBuffer.get() & 0xff);
timestamp = readerBuffer.getInt();
ssrc = readerBuffer.getInt();
payload = new byte[len - 12];
readerBuffer.get(payload, 0, payload.length);
}
/** Creates a new instance of RtpPacket */
public RtpPacket(byte[] data) throws IOException {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(data));
int b = in.read() & 0xff;
version = (b & 0x0C) >> 6;
padding = (b & 0x20) == 0x020;
extensions = (b & 0x10) == 0x10;
cc = b & 0x0F;
b = in.read() & 0xff;
marker = (b & 0x80) == 0x80;
payloadType = b & 0x7F;
seqNumber = (in.read() & 0xff) << 8;
seqNumber = seqNumber | (in.read() & 0xff);
timestamp = in.readInt();
ssrc = in.readInt();
payload = new byte[160];
int numBytes = in.read(payload);
if (numBytes < 0) {
numBytes = 0;
}
byte[] realPayload = new byte[numBytes];
for (int q = 0; q < numBytes; q++) {
realPayload[q] = payload[q];
}
payload = realPayload;
}
public RtpPacket(byte payloadType, int seqNumber, int timestamp, long ssrc, byte[] payload) {
this.payloadType = payloadType;
this.payload = payload;
this.seqNumber = seqNumber;
this.timestamp = timestamp;
this.ssrc = ssrc;
}
public RtpPacket(byte payloadType, int seqNumber, int timestamp, long ssrc, byte[] payload, int offset, int length) {
this.payloadType = payloadType;
this.payload = payload;
this.seqNumber = seqNumber;
this.timestamp = timestamp;
this.ssrc = ssrc;
this.offset = offset;
this.length = length;
}
public RtpPacket() {
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public long getSSRC() {
return ssrc;
}
public int getPayloadType() {
return payloadType;
}
public int getSeqNumber() {
return this.seqNumber;
}
public byte[] getPayload() {
return payload;
}
public int getTimestamp() {
return timestamp;
}
/**
* @param sequence
*/
public void setCallSequence(long sequence) {
this.callSequence = sequence;
}
public long getCallSequence() {
return this.callSequence;
}
public byte[] toByteArray() {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
bout.write(0x80);
bout.write(payloadType);
bout.write((byte) ((seqNumber & 0xFF00) >> 8));
bout.write((byte) (seqNumber & 0x00FF));
bout.write((byte) ((timestamp & 0xFF000000) >> 24));
bout.write((byte) ((timestamp & 0x00FF0000) >> 16));
bout.write((byte) ((timestamp & 0x0000FF00) >> 8));
bout.write((byte) ((timestamp & 0x000000FF)));
bout.write((byte) ((ssrc & 0xFF000000) >> 24));
bout.write((byte) ((ssrc & 0x00FF0000) >> 16));
bout.write((byte) ((ssrc & 0x0000FF00) >> 8));
bout.write((byte) ((ssrc & 0x000000FF)));
// try {
bout.write(payload, offset, length);
// } catch (IOException e) {
// }
return bout.toByteArray();
}
@Override
public String toString() {
return "RTP Packet[seq=" + this.seqNumber + ", timestamp=" + timestamp + ", payload_size=" + payload.length + "]";
}
/**
*
*/
public void minimize() {
this.payload = null;
}
public String serializeToString() {
StringBuffer sb = new StringBuffer();
//private callSequence;
sb.append(this.callSequence);
// private Date time;
sb.append(":").append(this.time.getTime());
// private int seqNumber;
sb.append(":").append(seqNumber);
// private int payloadType;
sb.append(":").append(payloadType);
// private int timestamp;
sb.append(":").append(timestamp);
// private int offset = 0;
sb.append(":").append(offset);
// private long ssrc;
sb.append(":").append(ssrc);
// private int length = 0;
sb.append(":").append(length);
// private int version = 2;
sb.append(":").append(version);
// private boolean padding = false;
sb.append(":").append(padding);
// private boolean extensions = false;
sb.append(":").append(extensions);
// private int cc = 0;
sb.append(":").append(cc);
// private boolean marker = false;
sb.append(":").append(marker);
sb.append(AbstractTestCase._LINE_SEPARATOR);
return sb.toString();
}
public void deserializeFromString(String str) {
try {
String[] split = str.split(":");
//private callSequence;
this.callSequence = Long.parseLong(split[0]);
// private Date time;
this.time = new Date(Long.parseLong(split[1]));
// private int seqNumber;
this.seqNumber = Integer.parseInt(split[2]);
// private int payloadType;
this.payloadType = Integer.parseInt(split[3]);
// private int timestamp;
this.timestamp = Integer.parseInt(split[4]);
// private int offset = 0;
this.offset = Integer.parseInt(split[5]);
// private long ssrc;
this.ssrc = Long.parseLong(split[6]);
// private int length = 0;
this.length = Integer.parseInt(split[7]);
// private int version = 2;
this.version = Integer.parseInt(split[8]);
// private boolean padding = false;
this.padding = Boolean.parseBoolean(split[9]);
// private boolean extensions = false;
this.extensions = Boolean.parseBoolean(split[10]);
// private int cc = 0;
this.length = Integer.parseInt(split[11]);
// private boolean marker = false;
this.marker = Boolean.parseBoolean(split[12]);
} catch (Exception e) {
e.printStackTrace();
System.err.println("DATA: \""+str+"\"");
}
}
}