- //class RTPpacket
-
- public class RTPpacket{
-
- //size of the RTP header:
- static int HEADER_SIZE = 12;
-
- //Fields that compose the RTP header
- public int Version;
- public int Padding;
- public int Extension;
- public int CC;
- public int Marker;
- public int PayloadType;
- public int SequenceNumber;
- public int TimeStamp;
- public int Ssrc;
-
- //Bitstream of the RTP header
- public byte[] header;
-
- //size of the RTP payload
- public int payload_size;
- //Bitstream of the RTP payload
- public byte[] payload;
-
-
-
- //--------------------------
- //Constructor of an RTPpacket object from header fields and payload bitstream
- //--------------------------
- public RTPpacket(int PType, int Framenb, int Time, byte[] data, int data_length){
- //fill by default header fields:
- Version = 2;
- Padding = 0;
- Extension = 0;
- CC = 0;
- Marker = 0;
- Ssrc = 0;
-
- //fill changing header fields:
- SequenceNumber = Framenb;
- TimeStamp = Time;
- PayloadType = PType;
-
- //build the header bistream:
- //--------------------------
- header = new byte[HEADER_SIZE];
-
- //.............
- //TO COMPLETE
- //.............
- //fill the header array of byte with RTP header fields
-
- //header[0] = ...
- // .....
-
-
- //fill the payload bitstream:
- //--------------------------
- payload_size = data_length;
- payload = new byte[data_length];
-
- //fill payload array of byte from data (given in parameter of the constructor)
- //......
-
- // ! Do not forget to uncomment method printheader() below !
-
- }
-
- //--------------------------
- //Constructor of an RTPpacket object from the packet bistream
- //--------------------------
- public RTPpacket(byte[] packet, int packet_size)
- {
- //fill default fields:
- Version = 2;
- Padding = 0;
- Extension = 0;
- CC = 0;
- Marker = 0;
- Ssrc = 0;
-
- //check if total packet size is lower than the header size
- if (packet_size >= HEADER_SIZE)
- {
- //get the header bitsream:
- header = new byte[HEADER_SIZE];
- for (int i=0; i < HEADER_SIZE; i++)
- header[i] = packet[i];
-
- //get the payload bitstream:
- payload_size = packet_size - HEADER_SIZE;
- payload = new byte[payload_size];
- for (int i=HEADER_SIZE; i < packet_size; i++)
- payload[i-HEADER_SIZE] = packet[i];
-
- //interpret the changing fields of the header:
- PayloadType = header[1] & 127;
- SequenceNumber = unsigned_int(header[3]) + 256*unsigned_int(header[2]);
- TimeStamp = unsigned_int(header[7]) + 256*unsigned_int(header[6]) + 65536*unsigned_int(header[5]) + 16777216*unsigned_int(header[4]);
- }
- }
-
- //--------------------------
- //getpayload: return the payload bistream of the RTPpacket and its size
- //--------------------------
- public int getpayload(byte[] data) {
-
- for (int i=0; i < payload_size; i++)
- data[i] = payload[i];
-
- return(payload_size);
- }
-
- //--------------------------
- //getpayload_length: return the length of the payload
- //--------------------------
- public int getpayload_length() {
- return(payload_size);
- }
-
- //--------------------------
- //getlength: return the total length of the RTP packet
- //--------------------------
- public int getlength() {
- return(payload_size + HEADER_SIZE);
- }
-
- //--------------------------
- //getpacket: returns the packet bitstream and its length
- //--------------------------
- public int getpacket(byte[] packet)
- {
- //construct the packet = header + payload
- for (int i=0; i < HEADER_SIZE; i++)
- packet[i] = header[i];
- for (int i=0; i < payload_size; i++)
- packet[i+HEADER_SIZE] = payload[i];
-
- //return total size of the packet
- return(payload_size + HEADER_SIZE);
- }
-
- //--------------------------
- //gettimestamp
- //--------------------------
-
- public int gettimestamp() {
- return(TimeStamp);
- }
-
- //--------------------------
- //getsequencenumber
- //--------------------------
- public int getsequencenumber() {
- return(SequenceNumber);
- }
-
- //--------------------------
- //getpayloadtype
- //--------------------------
- public int getpayloadtype() {
- return(PayloadType);
- }
-
-
- //--------------------------
- //print headers without the SSRC
- //--------------------------
- public void printheader()
- {
- //TO DO: uncomment
- /*
- for (int i=0; i < (HEADER_SIZE-4); i++)
- {
- for (int j = 7; j>=0 ; j--)
- if (((1<<j) & header[i] ) != 0)
- System.out.print("1");
- else
- System.out.print("0");
- System.out.print(" ");
- }
-
- System.out.println();
- */
- }
-
- //return the unsigned value of 8-bit integer nb
- static int unsigned_int(int nb) {
- if (nb >= 0)
- return(nb);
- else
- return(256+nb);
- }
-
- }