|
- #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;
- }
|