/**
*
*/
package video.serverProxy;
import java.net.InetSocketAddress;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import video.lib.RtpPacket;
/**
* @author yuezhu
*
*/
public class ServerRtpPacketHandler extends IoHandlerAdapter {
private static final Logger LOGGER = LoggerFactory.getLogger(ServerRtpPacketHandler.class);
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
IoBuffer buffer = (IoBuffer) message;
if (buffer.remaining() < 12) {
LOGGER.debug("Discard a RTP packet due to header size < 12 bytes");
return;
}
RtpPacket packet = new RtpPacket(buffer);
// LOGGER.debug("Received RTP packet: " + packet.getSequence());
ServerTrack serverTrack = ServerTrack.getByServerSsrc(packet.getSsrc());
if (serverTrack == null) {
serverTrack = ServerTrack.getByServerSocketAddress((InetSocketAddress) session.getRemoteAddress());
if (serverTrack == null) {
// drop packet
LOGGER.debug("Invalid SSRC identifier: " + packet.getSsrc().toHexString());
return;
} else {
// hot-wire the ssrc into the track
LOGGER.debug("Adding SSRC identifier: " + packet.getSsrc().toHexString());
serverTrack.setServerSsrc(packet.getSsrc());
}
}
serverTrack.setRtpServerSession(session);
serverTrack.forwardRtpToClient(packet);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
LOGGER.error(cause.toString());
cause.printStackTrace();
// CloseFuture future = session.close(false);
// future.awaitUninterruptibly();
// session.close(true);
// session.getService().dispose();
}
@Override
public void sessionCreated(IoSession session) throws Exception {
}
@Override
public void sessionClosed(IoSession session) {
/*
* Invoked when a connection is closed.
*/
LOGGER.debug("ServerRtpPacketHandler sessionClosed() is invoked.");
}
}