package org.mobicents.media.server.ctrl.rtsp;
import java.net.URI;
import java.util.Collection;
import java.util.concurrent.Callable;
import org.apache.log4j.Logger;
import org.jboss.netty.handler.codec.http.HttpHeaders;
import org.mobicents.media.server.spi.Connection;
import org.mobicents.media.server.spi.resource.AudioPlayer;
import org.mobicents.rtsp.DefaultRtspResponse;
import org.mobicents.rtsp.RtspHeaders;
import org.mobicents.rtsp.RtspRequest;
import org.mobicents.rtsp.RtspResponse;
import org.mobicents.rtsp.RtspResponseStatus;
import org.mobicents.rtsp.RtspVersion;
/**
*
* @author amit bhayani
*
*/
public class PlayAction implements Callable<RtspResponse> {
private static Logger logger = Logger.getLogger(PlayAction.class);
private RtspController rtspController = null;
private RtspRequest request = null;
public PlayAction(RtspController rtspController, RtspRequest request) {
this.rtspController = rtspController;
this.request = request;
}
public RtspResponse call() throws Exception {
RtspResponse response = null;
String sessionId = this.request.getHeader(RtspHeaders.Names.SESSION);
if (sessionId != null) {
Session session = this.rtspController.getSession(sessionId);
if (session != null) {
if (session.getState() == SessionState.READY) {
// As of now we support only READY Session State
String mediaDir = "file:" + this.rtspController.getMediaDir();
URI objUri = new URI(this.request.getUri());
mediaDir += objUri.getPath();
if (logger.isDebugEnabled()) {
logger.debug("Final path = " + mediaDir);
}
Collection<ConnectionActivity> connActivities = session.getActivities();
// TODO : As of now its only Audio
ConnectionActivity connActivity = connActivities.iterator().next();
Connection connection = connActivity.getMediaConnection();
AudioPlayer audioPlayer = (AudioPlayer) connection.getEndpoint().getComponent(
this.rtspController.getAudioPlayer());
if (audioPlayer == null) {
// May be its at Connection if its custom Endpoint
audioPlayer = (AudioPlayer) connection.getComponent(this.rtspController.getAudioPlayer(),
Connection.CHANNEL_TX);
}
audioPlayer.setURL(mediaDir);
audioPlayer.start();
response = new DefaultRtspResponse(RtspVersion.RTSP_1_0, RtspResponseStatus.OK);
response.setHeader(HttpHeaders.Names.SERVER, RtspController.SERVER);
response.setHeader(RtspHeaders.Names.CSEQ, this.request.getHeader(RtspHeaders.Names.CSEQ));
response.setHeader(RtspHeaders.Names.SESSION, session.getId());
session.setState(SessionState.PLAYING);
return response;
} else {
response = new DefaultRtspResponse(RtspVersion.RTSP_1_0, RtspResponseStatus.METHOD_NOT_VALID);
response.setHeader(HttpHeaders.Names.SERVER, RtspController.SERVER);
response.setHeader(RtspHeaders.Names.CSEQ, this.request.getHeader(RtspHeaders.Names.CSEQ));
return response;
}
} else {
response = new DefaultRtspResponse(RtspVersion.RTSP_1_0, RtspResponseStatus.SESSION_NOT_FOUND);
response.setHeader(HttpHeaders.Names.SERVER, RtspController.SERVER);
response.setHeader(RtspHeaders.Names.CSEQ, this.request.getHeader(RtspHeaders.Names.CSEQ));
response.setHeader(RtspHeaders.Names.SESSION, sessionId);
return response;
}
} else {
response = new DefaultRtspResponse(RtspVersion.RTSP_1_0, RtspResponseStatus.BAD_REQUEST);
response.setHeader(HttpHeaders.Names.SERVER, RtspController.SERVER);
response.setHeader(RtspHeaders.Names.CSEQ, this.request.getHeader(RtspHeaders.Names.CSEQ));
return response;
}
}
}