package org.mobicents.media.server.ctrl.rtsp; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; import org.jboss.netty.channel.Channel; import org.jboss.netty.handler.codec.http.HttpHeaders; import org.mobicents.media.server.spi.NamingService; import org.mobicents.rtsp.DefaultRtspResponse; import org.mobicents.rtsp.RtspHeaders; import org.mobicents.rtsp.RtspListener; import org.mobicents.rtsp.RtspMethod; import org.mobicents.rtsp.RtspRequest; import org.mobicents.rtsp.RtspResponse; import org.mobicents.rtsp.RtspResponseStatus; import org.mobicents.rtsp.RtspServerStackImpl; import org.mobicents.rtsp.RtspVersion; /** * * @author amit bhayani * */ public class RtspController implements RtspListener { private static final Logger logger = Logger.getLogger(RtspController.class); public static final String SERVER = "Mobicents Media Server"; private RtspServerStackImpl serverStack = null; private String bindAddress = "127.0.0.1"; private int port = 554; private NamingService namingService; private String mediaDir = null; private String audioPlayer = null; private ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<String, Session>(); public String getBindAddress() { return this.bindAddress; } public void setBindAddress(String bindAddress) throws UnknownHostException { this.bindAddress = bindAddress; } public int getPort() { return this.port; } public void setPort(int port) { this.port = port; } public String getMediaDir() { return mediaDir; } public void setMediaDir(String mediaDir) { this.mediaDir = mediaDir; } public NamingService getNamingService() { return namingService; } public void setNamingService(NamingService namingService) { this.namingService = namingService; } public void create() { logger.info("Starting RTSP Controller module for MMS"); } public void start() throws Exception { this.serverStack = new RtspServerStackImpl(this.bindAddress, this.port); this.serverStack.setRtspListener(this); this.serverStack.start(); logger .info("Started RTSP Controller module for MMS. Bound at IP " + this.bindAddress + " at port " + this.port); } public void stop() { logger.info("Stoping RTSP Controller module for MMS. Listening at IP " + this.bindAddress + " port " + this.port); this.serverStack.stop(); } public void destroy() { logger.info("Stopped RTSP Controller module for MMS"); } public void onRtspRequest(RtspRequest request, Channel channel) { Callable<RtspResponse> action = null; RtspResponse response = null; try { if (request.getMethod().equals(RtspMethod.OPTIONS)) { action = new OptionsAction(this, request); response = action.call(); } else if (request.getMethod().equals(RtspMethod.DESCRIBE)) { action = new DescribeAction(this, request); response = action.call(); } else if (request.getMethod().equals(RtspMethod.SETUP)) { InetSocketAddress inetSocketAddress = (InetSocketAddress) channel.getRemoteAddress(); String remoteIp = inetSocketAddress.getAddress().getHostAddress(); action = new SetupAction(this, request, remoteIp); response = action.call(); } else if (request.getMethod().equals(RtspMethod.PLAY)) { action = new PlayAction(this, request); response = action.call(); } else if (request.getMethod().equals(RtspMethod.TEARDOWN)) { action = new TeardownAction(this, request); response = action.call(); } else { response = new DefaultRtspResponse(RtspVersion.RTSP_1_0, RtspResponseStatus.METHOD_NOT_ALLOWED); response.setHeader(HttpHeaders.Names.SERVER, RtspController.SERVER); response.setHeader(RtspHeaders.Names.CSEQ, request.getHeader(RtspHeaders.Names.CSEQ)); response.setHeader(RtspHeaders.Names.ALLOW, OptionsAction.OPTIONS); } } catch (Exception e) { logger.error("Unexpected error during processing,Caused by ", e); response = new DefaultRtspResponse(RtspVersion.RTSP_1_0, RtspResponseStatus.INTERNAL_SERVER_ERROR); response.setHeader(HttpHeaders.Names.SERVER, RtspController.SERVER); response.setHeader(RtspHeaders.Names.CSEQ, request.getHeader(RtspHeaders.Names.CSEQ)); } logger.info("Sending Response " + response.toString()+ " For Request "+ request.toString()); channel.write(response); } public void onRtspResponse(RtspResponse arg0) { // TODO Auto-generated method stub } public String getAudioPlayer() { return audioPlayer; } public void setAudioPlayer(String audioPlayer) { this.audioPlayer = audioPlayer; } protected Session getSession(String sessionId) { return this.sessions.get(sessionId); } protected void addSession(Session session) { this.sessions.put(session.getId(), session); } protected void removeSession(String sessionId) { this.sessions.remove(sessionId); } }