25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.8KB

  1. #include "rtsp-server-internal.h"
  2. #include "rtsp-header-transport.h"
  3. #include "rtsp-header-session.h"
  4. #include "rfc822-datetime.h"
  5. static int rtsp_header_transport_ex(const char* value, struct rtsp_header_transport_t *transport, size_t *num)
  6. {
  7. size_t i;
  8. const char* p = value;
  9. for (i = 0; i < *num && p; i++)
  10. {
  11. if (0 != rtsp_header_transport(p, &transport[i]))
  12. return -1;
  13. p = strchr(p + 1, ',');
  14. }
  15. *num = i;
  16. return 0;
  17. }
  18. int rtsp_server_setup(struct rtsp_server_t* rtsp, const char* uri)
  19. {
  20. size_t n;
  21. const char *ptransport;
  22. struct rtsp_header_transport_t transport[16];
  23. memset(transport, 0, sizeof(transport));
  24. n = sizeof(transport) / sizeof(transport[0]);
  25. ptransport = http_get_header_by_name(rtsp->parser, "Transport");
  26. if (!ptransport || 0 != rtsp_header_transport_ex(ptransport, transport, &n) || 0 == n)
  27. {
  28. // 461 Unsupported Transport
  29. return rtsp_server_reply(rtsp, 461);
  30. }
  31. assert(n > 0);
  32. return rtsp->handler.onsetup(rtsp->param, rtsp, uri, rtsp->session.session[0] ? rtsp->session.session : NULL, transport, n);
  33. }
  34. int rtsp_server_reply_setup(struct rtsp_server_t *rtsp, int code, const char* sessionid, const char* transport)
  35. {
  36. int n;
  37. char header[1024];
  38. // save session-id
  39. n = snprintf(rtsp->session.session, sizeof(rtsp->session.session), "%s", sessionid ? sessionid : "");
  40. if (n < 0 || n >= sizeof(rtsp->session.session))
  41. {
  42. assert(0); // sessionid too long
  43. return -1;
  44. }
  45. // RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257
  46. n = snprintf(header, sizeof(header), "Transport: %s\r\n", transport ? transport : "");
  47. if (n < 0 || n >= sizeof(header))
  48. {
  49. assert(0); // transport or sessionid too long
  50. return -1;
  51. }
  52. return rtsp_server_reply2(rtsp, code, header, NULL, 0);
  53. }
  54. void rtsp_server_set_session_timeout(rtsp_server_t* rtsp, int timeout)
  55. {
  56. rtsp->session.timeout = timeout * 1000;
  57. }