If you think the Android project streamvid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
Java Source Code
/*
* Copyright (C) 2011-2014 GUIGUI Simon, fyhertz@gmail.com
* //fromwww.java2s.com
* This file is part of libstreaming (https://github.com/fyhertz/libstreaming)
*
* Spydroid is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This source code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this source code; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/package net.majorkernelpanic.streaming.rtcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.nio.channels.IllegalSelectorException;
import android.os.SystemClock;
import android.util.Log;
/**
* Implementation of Sender Report RTCP packets.
*/publicclass SenderReport {
publicstaticfinalint MTU = 1500;
private MulticastSocket usock;
private DatagramPacket upack;
privatebyte[] buffer = newbyte[MTU];
privateint ssrc, port = -1;
privateint octetCount = 0, packetCount = 0;
privatelong interval, delta, now, oldnow;
public SenderReport(int ssrc) throws IOException {
super();
this.ssrc = ssrc;
}
public SenderReport() {
/* Version(2) Padding(0) *//* ^ ^ PT = 0 *//* | | ^ *//* | -------- | *//* | |--------------------- *//* | || *//* | || */
buffer[0] = (byte) Integer.parseInt("10000000",2);
/* Packet Type PT */
buffer[1] = (byte) 200;
/* Byte 2,3 -> Length */
setLong(28/4-1, 2, 4);
/* Byte 4,5,6,7 -> SSRC *//* Byte 8,9,10,11 -> NTP timestamp hb *//* Byte 12,13,14,15 -> NTP timestamp lb *//* Byte 16,17,18,19 -> RTP timestamp *//* Byte 20,21,22,23 -> packet count *//* Byte 24,25,26,27 -> octet count */try {
usock = new MulticastSocket();
} catch (IOException e) {
thrownew RuntimeException(e.getMessage());
}
upack = new DatagramPacket(buffer, 1);
// By default we sent one report every 5 secconde
interval = 3000;
}
publicvoid close() {
usock.close();
}
/**
* Sets the temporal interval between two RTCP Sender Reports.
* Default interval is set to 5 secondes.
* Set 0 to disable RTCP.
* @param interval The interval in milliseconds
*/publicvoid setInterval(long interval) {
this.interval = interval;
}
/**
* Updates the number of packets sent, and the total amount of data sent.
* @param length The length of the packet
* @throws IOException
**/publicvoid update(int length, long ntpts, long rtpts) throws IOException {
packetCount += 1;
octetCount += length;
setLong(packetCount, 20, 24);
setLong(octetCount, 24, 28);
now = SystemClock.elapsedRealtime();
delta += oldnow != 0 ? now-oldnow : 0;
oldnow = now;
if (interval>0) {
if (delta>=interval) {
// We send a Sender Report
send(ntpts,rtpts);
delta = 0;
}
}
}
publicvoid setSSRC(int ssrc) {
this.ssrc = ssrc;
setLong(ssrc,4,8);
packetCount = 0;
octetCount = 0;
setLong(packetCount, 20, 24);
setLong(octetCount, 24, 28);
}
publicvoid setDestination(InetAddress dest, int dport) {
port = dport;
upack.setPort(dport);
upack.setAddress(dest);
}
publicint getPort() {
return port;
}
publicint getLocalPort() {
return usock.getLocalPort();
}
publicint getSSRC() {
return ssrc;
}
/**
* Resets the reports (total number of bytes sent, number of packets sent, etc.)
*/publicvoid reset() {
packetCount = 0;
octetCount = 0;
setLong(packetCount, 20, 24);
setLong(octetCount, 24, 28);
delta = now = oldnow = 0;
}
privatevoid setLong(long n, int begin, int end) {
for (end--; end >= begin; end--) {
buffer[end] = (byte) (n % 256);
n >>= 8;
}
}
/** Sends the RTCP packet over the network. */privatevoid send(long ntpts, long rtpts) throws IOException {
long hb = ntpts/1000000000;
long lb = ( ( ntpts - hb*1000000000 ) * 4294967296L )/1000000000;
setLong(hb, 8, 12);
setLong(lb, 12, 16);
setLong(rtpts, 16, 20);
upack.setLength(28);
usock.send(upack);
}
}