All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.fmj.media.rtp.RTCPSenderInfo Maven / Gradle / Ivy

There is a newer version: 1.0.2-jitsi
Show newest version
/*
 * @(#)RTCPSenderInfo.java
 * Created: 2005-04-21
 * Version: 2-0-alpha
 * Copyright (c) 2005-2006, University of Manchester All rights reserved.
 * Andrew G D Rowley
 * Christian Vincenot 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer. Redistributions in binary
 * form must reproduce the above copyright notice, this list of conditions and
 * the following disclaimer in the documentation and/or other materials
 * provided with the distribution. Neither the name of the University of
 * Manchester nor the names of its contributors may be used to endorse or
 * promote products derived from this software without specific prior written
 * permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

package net.sf.fmj.media.rtp;

import java.io.*;

/**
 * Represents the sender info part of the RTCP SR Packet
 *
 * @author Andrew G D Rowley
 * @author Christian Vincenot
 * @version 1-1-alpha
 */
public class RTCPSenderInfo
{
    /**
     * The size of the sender info
     */
    public static final int SIZE = 20;

    // baseline NTP time if bit-0=0 -> 7-Feb-2036 @ 06:28:16 UTC
    private static final long MSB_0_BASE_TIME = 2085978496000L;

    // baseline NTP time if bit-0=1 -> 1-Jan-1900 @ 01:00:00 UTC
    public static final long MSB_1_BASE_TIME = -2208988800000L;

    // The Most Significant word of the timestamp
    private long ntpTimestampMSW = 0;

    // The Least Significant word of the timestamp
    private long ntpTimestampLSW = 0;

    // The RTP timestamp
    private long rtpTimestamp = 0;

    // The packet count
    private long packetCount = 0;

    // The octet count
    private long octetCount = 0;

    /**
     * Parses an RTCP Sender Report (SR) packet
     *
     * @param offset
     *            offset after which the RTCP SR starts
     * @param length
     *            length of the packet
     * @param rtcpPacket
     *            The data of the RTCP packet
     * @throws IOException
     *             I/O Exception
     */
    public RTCPSenderInfo(byte[] rtcpPacket, int offset, int length)
            throws IOException
    {
        DataInputStream stream = new DataInputStream(new ByteArrayInputStream(
                rtcpPacket, offset, length));
        ntpTimestampMSW = stream.readInt() & RTPHeader.UINT_TO_LONG_CONVERT;
        ntpTimestampLSW = stream.readInt() & RTPHeader.UINT_TO_LONG_CONVERT;
        rtpTimestamp = stream.readInt() & RTPHeader.UINT_TO_LONG_CONVERT;
        packetCount = stream.readInt() & RTPHeader.UINT_TO_LONG_CONVERT;
        octetCount = stream.readInt() & RTPHeader.UINT_TO_LONG_CONVERT;
    }

    /**
     * Returns the timestamp least significant word
     *
     * @return the timestamp's least significant word
     */
    public long getNtpTimestampLSW()
    {
        return ntpTimestampLSW;
    }

    /**
     * Returns the timestamp most significant word
     *
     * @return the timestamp's most significant word
     */
    public long getNtpTimestampMSW()
    {
        return ntpTimestampMSW;
    }

    /**
     * Returns the timestamp value in seconds
     *
     * @return timestamp in seconds
     */
    public double getNtpTimestampSecs()
    {
        return (double) getTimestamp() / 1000;
    }

    /**
     * Returns the octet (cumulative) count. The total number of payload octets
     * (i.e., not including header or padding) transmitted in RTP data packets
     * by the sender since starting transmission up until the time this SR
     * packet was generated. This field can be used to estimate the average
     * payload data rate.
     *
     * @return the number of bytes sent until now
     */
    public long getOctetCount()
    {
        return octetCount;
    }

    /**
     * Returns the packet (cumulative) count. The total number of RTP data
     * packets transmitted by the sender since starting transmission up until
     * the time this SR packet was generated.
     *
     * @return the number of packets sent until now
     */
    public long getPacketCount()
    {
        return packetCount;
    }

    /**
     * Returns the RTP timestamp of this SR packet
     *
     * @return the timestamp of this RTCP packet
     */
    public long getRtpTimestamp()
    {
        return rtpTimestamp;
    }

    /**
     * Returns the timestamp of the information
     *
     * @return timestamp of this information
     */
    public long getTimestamp()
    {
        long seconds = ntpTimestampMSW;
        long fraction = ntpTimestampLSW;

        // Use round-off on fractional part to preserve going to lower precision
        fraction = Math.round(1000D * fraction / 0x100000000L);

        /*
         * If the most significant bit (MSB) on the seconds field is set we use
         * a different time base. The following text is a quote from RFC-2030
         * (SNTP v4):
         *
         * If bit 0 is set, the UTC time is in the range 1968-2036 and UTC time
         * is reckoned from 0h 0m 0s UTC on 1 January 1900. If bit 0 is not set,
         * the time is in the range 2036-2104 and UTC time is reckoned from 6h
         * 28m 16s UTC on 7 February 2036.
         */
        long msb = seconds & 0x80000000L;
        if (msb == 0)
        {
            // use base: 7-Feb-2036 @ 06:28:16 UTC
            return MSB_0_BASE_TIME + (seconds * 1000) + fraction;
        }
        // use base: 1-Jan-1900 @ 01:00:00 UTC
        return MSB_1_BASE_TIME + (seconds * 1000) + fraction;
    }

    /**
     * Returns a String reprensenting the information about the RTCP sender
     *
     * @return a String representing this object
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString()
    {
        String buf = "";
        buf += "ntp_ts=" + getNtpTimestampMSW();
        buf += " " + getNtpTimestampLSW();
        buf += " rtp_ts=" + getRtpTimestamp();
        buf += " packet_ct=" + getPacketCount();
        buf += " octect_ct=" + getOctetCount();
        return buf;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy