/** * */ 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.RtcpPacket; /** * @author yuezhu * */ public class ServerRtcpPacketHandler extends IoHandlerAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(ServerRtcpPacketHandler.class); @Override public void messageReceived(IoSession session, Object buffer) throws Exception { RtcpPacket packet = new RtcpPacket((IoBuffer) buffer); // LOGGER.debug( "Receive RTCP packet: " + packet.getType() ); 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.setRtcpServerSession(session); serverTrack.forwardRtcpToClient(packet); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { LOGGER.debug("Exception: " + cause); // 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) { LOGGER.debug("ServerRtcpPacketHandler sessionClosed() is invoked."); } }