package org.red5.app.sip.stream; import local.net.RtpPacket; import local.net.RtpSocket; import java.io.IOException; import java.net.DatagramSocket; import java.net.SocketException; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import org.slf4j.Logger; import org.red5.logging.Red5LoggerFactory; public class RtpStreamReceiver { protected static Logger log = Red5LoggerFactory.getLogger(RtpStreamReceiver.class, "sip"); // Maximum blocking time, spent waiting for reading new bytes [milliseconds] private static final int SO_TIMEOUT = 200; private static int RTP_HEADER_SIZE = 12; private RtpSocket rtpSocket = null; private final Executor exec = Executors.newSingleThreadExecutor(); private Runnable rtpPacketReceiver; private volatile boolean receivePackets = false; private ReceivedRtpPacketProcessor packetProcessor; private RtpStreamReceiverListener listener; private final int payloadLength; public RtpStreamReceiver(ReceivedRtpPacketProcessor packetProcessor, DatagramSocket socket, int payloadLength) { this.packetProcessor = packetProcessor; this.payloadLength = payloadLength; rtpSocket = new RtpSocket(socket); } public void setRtpStreamReceiverListener(RtpStreamReceiverListener listener) { this.listener = listener; } private void initializeSocket() { try { rtpSocket.getDatagramSocket().setSoTimeout(SO_TIMEOUT); } catch (SocketException e1) { log.warn("SocketException while setting socket block time."); } } public void start() { receivePackets = true; rtpPacketReceiver = new Runnable() { public void run() { receiveRtpPackets(); } }; exec.execute(rtpPacketReceiver); } public void stop() { receivePackets = false; } public void receiveRtpPackets() { int packetReceivedCounter = 0; int internalBufferLength = payloadLength + RTP_HEADER_SIZE; while (receivePackets) { try { byte[] internalBuffer = new byte[internalBufferLength]; RtpPacket rtpPacket = new RtpPacket(internalBuffer, 0); rtpSocket.receive(rtpPacket); packetReceivedCounter++; processReceivedPacket(rtpPacket); } catch (IOException e) { log.error("IOException while receiving rtp packets."); receivePackets = false; } } closeSocket(); log.debug("Rtp Receiver stopped." ); log.debug("Packet Received = " + packetReceivedCounter + "." ); } private void processReceivedPacket(RtpPacket rtpPacket) { /* int headerOffset = 0; int payloadLength = 0; byte[] packetBuffer = rtpPacket.getPacket(); headerOffset = rtpPacket.getHeaderLength(); payloadLength = rtpPacket.getPayloadLength(); byte[] codedBuffer = new byte[payloadLength]; */ // System.out.println("pkt.length = " + rtpPacket.getPayloadLength() // + ", offset = " + rtpPacket.getHeaderLength() // + ", length = " + rtpPacket.getPayloadLength() + "." ); // System.arraycopy(packetBuffer, headerOffset, codedBuffer, 0, payloadLength); // transcoder.transcode(codedBuffer); // byte[] payload = rtpPacket.getPayload(); try { packetProcessor.process(rtpPacket); } catch (InterruptedException e) { log.error("InterruptedException while attempting to process received Rtp packet"); } } private void closeSocket() { rtpSocket.close(); if (listener != null) { listener.onStoppedReceiving(); } } }