private bool HandleRTSPResponse200Setup(RtspProtocol rtspProtocol, Variant requestHeaders, ref string requestContent, Variant responseHeaders, ref string responseContent)
{
if (rtspProtocol.CustomParameters["connectionType"] == "pull")
{
if (responseHeaders[RTSP_FIRST_LINE, RTSP_STATUS_CODE] != 200)
{
FATAL("request {0} failed with response {1}",
(requestHeaders.ToString()),
(responseHeaders.ToString()));
return false;
}
if (rtspProtocol.CustomParameters["pendingTracks"].ArrayLength != 0)
return SendSetupTrackMessages(rtspProtocol);
//2. Do the play command
var uri = rtspProtocol.CustomParameters["uri", "fullUri"];
//3. prepare the play command
rtspProtocol.PushRequestFirstLine(RTSP_METHOD_PLAY, uri, RTSP_VERSION_1_0);
return rtspProtocol.SendRequestMessage();
}
else
{
if (responseHeaders[RTSP_HEADERS, RTSP_HEADERS_TRANSPORT] == null)
{
FATAL("RTSP {0} request doesn't have {1} header line",
RTSP_METHOD_SETUP,
RTSP_HEADERS_TRANSPORT);
return false;
}
//3. get the transport header line
var raw = responseHeaders[RTSP_HEADERS, RTSP_HEADERS_TRANSPORT];
var transport = Variant.Get();
if (!SDP.ParseTransportLine(raw, transport))
{
FATAL("Unable to parse transport line {0}", (raw));
return false;
}
bool forceTcp;
if (transport["server_port"] != null &&
(transport["rtp/avp/udp"] != null || transport["rtp/avp"] != null))
{
forceTcp = false;
}else if (transport["interleaved"] != null && transport["rtp/avp/tcp"] != null)
{
forceTcp = true;
}
else
{
FATAL("Invalid transport line: {0}", (transport.ToString()));
return false;
}
if (forceTcp != (bool)rtspProtocol.CustomParameters["forceTcp"])
{
FATAL("Invalid transport line: {0}", (transport.ToString()));
return false;
}
var pConnectivity = GetOutboundConnectivity(rtspProtocol, forceTcp);
if (pConnectivity == null)
{
FATAL("Unable to get outbound connectivity");
return false;
}
var param = rtspProtocol.CustomParameters;
param[param["lastSetup"] == "audio" ? "audioTransport" : "videoTransport"] = transport;
var variantUri = param["uri"];
string trackId = "";
bool isAudio = false;
if (param["audioTrackId"] != null)
{
trackId = param["audioTrackId"];
param["audioTrackId"] = null;
param["lastSetup"] = "audio";
isAudio = true;
pConnectivity.HasAudio = true;
}
else
{
if (param["videoTrackId"] != null)
{
trackId = param["videoTrackId"];
param["videoTrackId"] = null;
param["lastSetup"] = "video";
pConnectivity.HasVideo = true;
}
}
if (trackId != "")
{
var uri = variantUri["fullUri"] + "/trackID=" + trackId;
rtspProtocol.PushRequestFirstLine(RTSP_METHOD_SETUP, uri, RTSP_VERSION_1_0);
transport = forceTcp ? $"RTP/AVP/TCP;unicast;interleaved={(isAudio ? pConnectivity.AudioChannels : pConnectivity.VideoChannels)};mode=record" : $"RTP/AVP;unicast;client_port={(isAudio ? pConnectivity.AudioChannels : pConnectivity.VideoChannels)};mode=record";
rtspProtocol.PushRequestHeader(RTSP_HEADERS_TRANSPORT, transport);
return rtspProtocol.SendRequestMessage();
}
else
{
rtspProtocol.PushRequestFirstLine(RTSP_METHOD_RECORD,variantUri["fullUri"],RTSP_VERSION_1_0);
return rtspProtocol.SendRequestMessage();
}
}
}