/* * 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.impl.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; /** * * @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; 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 int getPayloadType() { return payloadType; } public int getSeqNumber() { return this.seqNumber; } public byte[] getPayload() { return payload; } public int getTimestamp() { return timestamp; } 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))); bout.write(payload, offset, length); return bout.toByteArray(); } @Override public String toString() { return "RTP Packet[seq=" + this.seqNumber + ", timestamp=" + timestamp + ", payload_size=" + payload.length + "]"; } }