RTPpacket.java :  » UnTagged » mynpr » com » webeclubbin » mynpr » Android Open Source

Android Open Source » UnTagged » mynpr 
mynpr » com » webeclubbin » mynpr » RTPpacket.java
package com.webeclubbin.mynpr;

import android.util.Log;

//class RTPpacket
// http://www.csee.umbc.edu/~pmundur/courses/CMSC691C/lab5-kurose-ross.html

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];

    //fill the header array of byte with RTP header fields

    //header[0] = ...
    // .....
    header[0] = (byte)(Version << 6);
    header[0] = (byte)(header[0] | Padding << 5);
    header[0] = (byte)(header[0] | Extension << 4);
    header[0] = (byte)(header[0] | CC);
    header[1] = (byte)(header[1] | Marker << 7);
    header[1] = (byte)(header[1] | PayloadType);
    header[2] = (byte)(SequenceNumber >> 8);
    header[3] = (byte)(SequenceNumber & 0xFF);
    header[4] = (byte)(TimeStamp >> 24);
    header[5] = (byte)(TimeStamp >> 16);
    header[6] = (byte)(TimeStamp >> 8);
    header[7] = (byte)(TimeStamp & 0xFF);
    header[8] = (byte)(Ssrc >> 24);
    header[9] = (byte)(Ssrc >> 16);
    header[10] = (byte)(Ssrc >> 8);
    header[11] = (byte)(Ssrc & 0xFF); 

    //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)
    for (int i = 0; i < data_length; i++){
        payload[i] = data[i];
    }

  }
    
  //--------------------------
  //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() { 
  final String TAG = "printheader";

    for (int i=0; i < (HEADER_SIZE-4); i++) {

      for (int j = 7; j>=0 ; j--) {
        if (((1 << j) & header[i]) != 0) {
          Log.v(TAG,"1");
        } else {
          Log.v(TAG,"0");
        }
      }
    }
     
} 

  //return the unsigned value of 8-bit integer nb
  private static int unsigned_int(int nb) {

    if (nb >= 0) {
      return(nb);
    } else {
      return(256+nb);
    }
  } 

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.