private bool HandleRTSPRequestPlay(RtspProtocol pFrom, Variant requestHeaders, string requestContent)
{
//1. Get the outbound connectivity
bool forceTcp = pFrom.CustomParameters["forceTcp"];
var pOutboundConnectivity = GetOutboundConnectivity(pFrom, true);
if (pOutboundConnectivity == null)
{
FATAL("Unable to get the outbound connectivity");
return false;
}
if (forceTcp)
{
//3. Get the audio/video client ports
byte videoDataChannelNumber = 0xff;
byte videoRtcpChannelNumber = 0xff;
byte audioDataChannelNumber = 0xff;
byte audioRtcpChannelNumber = 0xff;
if (pFrom.CustomParameters["audioDataChannelNumber"]!=null)
{
audioDataChannelNumber = pFrom.CustomParameters["audioDataChannelNumber"];
audioRtcpChannelNumber = pFrom.CustomParameters["audioRtcpChannelNumber"];
}
if (pFrom.CustomParameters["videoDataChannelNumber"] != null)
{
videoDataChannelNumber = pFrom.CustomParameters["videoDataChannelNumber"];
videoRtcpChannelNumber = pFrom.CustomParameters["videoRtcpChannelNumber"];
}
//4.register the video
if (videoDataChannelNumber != 0xff)
{
if (!pOutboundConnectivity.RegisterTCPVideoClient(pFrom.Id,
videoDataChannelNumber, videoRtcpChannelNumber))
{
FATAL("Unable to register video stream");
return false;
}
}
//5. Register the audio
if (audioDataChannelNumber != 0xff)
{
if (!pOutboundConnectivity.RegisterTCPAudioClient(pFrom.Id,
audioDataChannelNumber, audioRtcpChannelNumber))
{
FATAL("Unable to register audio stream");
return false;
}
}
}
else
{
//3. Get the audio/video client ports
ushort videoDataPortNumber = 0;
ushort videoRtcpPortNumber = 0;
ushort audioDataPortNumber = 0;
ushort audioRtcpPortNumber = 0;
if (pFrom.CustomParameters["audioDataPortNumber"] != null)
{
audioDataPortNumber = pFrom.CustomParameters["audioDataPortNumber"];
audioRtcpPortNumber = pFrom.CustomParameters["audioRtcpPortNumber"];
}
if (pFrom.CustomParameters["videoDataPortNumber"] != null)
{
videoDataPortNumber = pFrom.CustomParameters["videoDataPortNumber"];
videoRtcpPortNumber = pFrom.CustomParameters["videoRtcpPortNumber"];
}
//4.register the video
if (videoDataPortNumber != 0)
{
var videoDataAddress = ((TCPCarrier)pFrom.IOHandler).FarInfo;
videoDataAddress.Port = videoDataPortNumber;
var videoRtcpAddress = ((TCPCarrier)pFrom.IOHandler).FarInfo;
videoRtcpAddress.Port = videoRtcpPortNumber;
if (!pOutboundConnectivity.RegisterUDPVideoClient(pFrom.Id,
videoDataAddress, videoRtcpAddress))
{
FATAL("Unable to register video stream");
return false;
}
}
//5. Register the audio
if (audioDataPortNumber != 0)
{
var audioDataAddress = ((TCPCarrier)pFrom.IOHandler).FarInfo;
audioDataAddress.Port = audioDataPortNumber;
var audioRtcpAddress = ((TCPCarrier)pFrom.IOHandler).FarInfo;
audioRtcpAddress.Port = audioRtcpPortNumber;
if (!pOutboundConnectivity.RegisterUDPAudioClient(pFrom.Id,audioDataAddress, audioRtcpAddress))
{
FATAL("Unable to register audio stream");
return false;
}
}
}
//6. prepare the response
pFrom.PushResponseFirstLine(RTSP_VERSION_1_0, 200, "OK");
//7. Done
return pFrom.SendResponseMessage();
}