stream-deploy/ZLM/3rdpart/media-server/librtsp/source/server/rtsp-server-setup.c

71 lines
1.8 KiB
C++

#include "rtsp-server-internal.h"
#include "rtsp-header-transport.h"
#include "rtsp-header-session.h"
#include "rfc822-datetime.h"
static int rtsp_header_transport_ex(const char* value, struct rtsp_header_transport_t *transport, size_t *num)
{
size_t i;
const char* p = value;
for (i = 0; i < *num && p; i++)
{
if (0 != rtsp_header_transport(p, &transport[i]))
return -1;
p = strchr(p + 1, ',');
}
*num = i;
return 0;
}
int rtsp_server_setup(struct rtsp_server_t* rtsp, const char* uri)
{
size_t n;
const char *ptransport;
struct rtsp_header_transport_t transport[16];
memset(transport, 0, sizeof(transport));
n = sizeof(transport) / sizeof(transport[0]);
ptransport = http_get_header_by_name(rtsp->parser, "Transport");
if (!ptransport || 0 != rtsp_header_transport_ex(ptransport, transport, &n) || 0 == n)
{
// 461 Unsupported Transport
return rtsp_server_reply(rtsp, 461);
}
assert(n > 0);
return rtsp->handler.onsetup(rtsp->param, rtsp, uri, rtsp->session.session[0] ? rtsp->session.session : NULL, transport, n);
}
int rtsp_server_reply_setup(struct rtsp_server_t *rtsp, int code, const char* sessionid, const char* transport)
{
int n;
char header[1024];
// save session-id
n = snprintf(rtsp->session.session, sizeof(rtsp->session.session), "%s", sessionid ? sessionid : "");
if (n < 0 || n >= sizeof(rtsp->session.session))
{
assert(0); // sessionid too long
return -1;
}
// RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257
n = snprintf(header, sizeof(header), "Transport: %s\r\n", transport ? transport : "");
if (n < 0 || n >= sizeof(header))
{
assert(0); // transport or sessionid too long
return -1;
}
return rtsp_server_reply2(rtsp, code, header, NULL, 0);
}
void rtsp_server_set_session_timeout(rtsp_server_t* rtsp, int timeout)
{
rtsp->session.timeout = timeout * 1000;
}