Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

111 строки
2.9KB

  1. #include "rtsp-server.h"
  2. #include "rtsp-reason.h"
  3. #include "rfc822-datetime.h"
  4. #include "rtsp-server-internal.h"
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <assert.h>
  8. struct rtsp_server_t* rtsp_server_create(const char ip[65], unsigned short port, struct rtsp_handler_t* handler, void* ptr, void* ptr2)
  9. {
  10. struct rtsp_server_t* rtsp;
  11. rtsp = (struct rtsp_server_t *)calloc(1, sizeof(struct rtsp_server_t));
  12. if (NULL == rtsp) return NULL;
  13. snprintf(rtsp->ip, sizeof(rtsp->ip), "%s", ip);
  14. rtsp->port = port;
  15. rtsp->param = ptr;
  16. rtsp->sendparam = ptr2;
  17. memcpy(&rtsp->handler, handler, sizeof(rtsp->handler));
  18. rtsp->parser = http_parser_create(HTTP_PARSER_REQUEST, NULL, NULL);
  19. return rtsp;
  20. }
  21. int rtsp_server_destroy(struct rtsp_server_t* rtsp)
  22. {
  23. if (rtsp->handler.close)
  24. rtsp->handler.close(rtsp->sendparam);
  25. if (rtsp->parser)
  26. {
  27. http_parser_destroy(rtsp->parser);
  28. rtsp->parser = NULL;
  29. }
  30. free(rtsp);
  31. return 0;
  32. }
  33. int rtsp_server_input(struct rtsp_server_t* rtsp, const void* data, size_t* bytes)
  34. {
  35. int r;
  36. r = http_parser_input(rtsp->parser, data, bytes);
  37. assert(r <= 2); // 1-need more data
  38. if (0 == r)
  39. {
  40. r = rtsp_server_handle(rtsp);
  41. http_parser_clear(rtsp->parser); // reset parser
  42. }
  43. return r;
  44. }
  45. const char* rtsp_server_get_header(struct rtsp_server_t *rtsp, const char* name)
  46. {
  47. return http_get_header_by_name(rtsp->parser, name);
  48. }
  49. const char* rtsp_server_get_client(rtsp_server_t* rtsp, unsigned short* port)
  50. {
  51. if (port) *port = rtsp->port;
  52. return rtsp->ip;
  53. }
  54. int rtsp_server_reply(struct rtsp_server_t *rtsp, int code)
  55. {
  56. return rtsp_server_reply2(rtsp, code, NULL, NULL, 0);
  57. }
  58. int rtsp_server_reply2(struct rtsp_server_t *rtsp, int code, const char* header, const void* data, int bytes)
  59. {
  60. int len;
  61. rfc822_datetime_t datetime;
  62. rfc822_datetime_format(time(NULL), datetime);
  63. // smpte=0:10:22-;time=19970123T153600Z
  64. len = snprintf(rtsp->reply, sizeof(rtsp->reply),
  65. "RTSP/1.0 %d %s\r\n"
  66. "CSeq: %u\r\n"
  67. "Date: %s\r\n"
  68. "User-Agent: %s\r\n",
  69. code, rtsp_reason_phrase(code), rtsp->cseq, datetime, USER_AGENT);
  70. // session header
  71. if (len > 0 && rtsp->session.session[0])
  72. {
  73. len += snprintf(rtsp->reply + len, sizeof(rtsp->reply) - len, "Session: %s;timeout=%d\r\n", rtsp->session.session, rtsp->session.timeout/1000);
  74. }
  75. // other headers
  76. if(len > 0 && header && *header)
  77. {
  78. len += snprintf(rtsp->reply + len, sizeof(rtsp->reply) - len, "%s", header);
  79. }
  80. // Last: Add Content-Length
  81. if (len > 0)
  82. {
  83. len += snprintf(rtsp->reply + len, sizeof(rtsp->reply) - len, "Content-Length: %d\r\n\r\n", bytes);
  84. }
  85. if (len < 0 || bytes < 0 || len + bytes >= sizeof(rtsp->reply))
  86. return rtsp_server_reply(rtsp, 513 /*Message Too Large*/);
  87. memcpy(rtsp->reply + len, data, bytes);
  88. return rtsp->handler.send(rtsp->sendparam, rtsp->reply, len + bytes);
  89. }
  90. int rtsp_server_send_interleaved_data(rtsp_server_t* rtsp, const void* data, size_t bytes)
  91. {
  92. return rtsp->handler.send(rtsp->sendparam, data, bytes);
  93. }