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

io.pkts.streams.impl.DefaultRtpStream Maven / Gradle / Ivy

The newest version!
/**
 * 
 */
package io.pkts.streams.impl;

import io.pkts.frame.PcapGlobalHeader;
import io.pkts.packet.rtp.RtpPacket;
import io.pkts.streams.RtpStream;
import io.pkts.streams.StreamId;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.NavigableSet;
import java.util.TreeSet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author [email protected]
 * 
 */
public final class DefaultRtpStream implements RtpStream {

    private static final Logger logger = LoggerFactory.getLogger(DefaultRtpStream.class);

    private final PcapGlobalHeader globalHeader;

    private final LongStreamId ssrc;

    private final NavigableSet packets;

    /**
     * 
     */
    public DefaultRtpStream(final PcapGlobalHeader globalHeader, final long ssrc) {
        this.globalHeader = globalHeader;
        this.ssrc = new LongStreamId(ssrc);
        this.packets = new TreeSet(new PacketComparator());
    }

    public void onPacket(final RtpPacket msg) {

        if (msg == null) {
            return;
        }

        final RtpPacket previousMsg = this.packets.isEmpty() ? null : this.packets.last();
        this.packets.add(msg);

        if (previousMsg != null && msg.getArrivalTime() < previousMsg.getArrivalTime()) {
            redrive();
            return;
        }

    }

    /**
     * If we merge multiple pcaps we may get packets "arriving" out-of-order. For now, this is a
     * very simple approach where we just redrive everything, which won't be the most efficient if
     * you merge a large pcap that was captured before the pcap you already loaded but the merge
     * command should take care of that and make sure that we merge things in the correct order so
     * therefore we dont care here...
     */
    private void redrive() {
        // TODO
        if (logger.isInfoEnabled()) {
            logger.info("Out-of-sequence event detected. Redriving all traffic.");
        }

    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List getPackets() {
        return new ArrayList(this.packets);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public long getDuration() {
        // TODO Auto-generated method stub
        return 0;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public long getTimeOfFirstPacket() {
        if (this.packets.isEmpty()) {
            return -1;
        }

        return this.packets.first().getArrivalTime();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public long getTimeOfLastPacket() {
        if (this.packets.isEmpty()) {
            return -1;
        }

        return this.packets.last().getArrivalTime();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public StreamId getStreamIdentifier() {
        return this.ssrc;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void write(final OutputStream out) throws IOException {
        // TODO Auto-generated method stub

    }

    @Override
    public long getMaxJitter() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long getMeanJitter() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long getMaxDelta() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long getLostPackets() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long getSequenceErrors() {
        // TODO Auto-generated method stub
        return 0;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy