Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

94 рядки
2.3KB

  1. #include "rtsp-server-internal.h"
  2. int rtsp_server_handle(struct rtsp_server_t *rtsp)
  3. {
  4. int64_t v;
  5. char protocol[8];
  6. int major, minor;
  7. const char* uri;
  8. const char* method;
  9. const char* session;
  10. http_get_version(rtsp->parser, protocol, &major, &minor);
  11. if (1 != major && 0 != minor)
  12. {
  13. //505 RTSP Version Not Supported
  14. return rtsp_server_reply(rtsp, 505);
  15. }
  16. if (0 != http_get_header_by_name2(rtsp->parser, "CSeq", &v))
  17. {
  18. // 400 Bad Request
  19. return rtsp_server_reply(rtsp, 400);
  20. }
  21. // parse session
  22. rtsp->cseq = (unsigned int)v;
  23. rtsp->session.session[0] = 0; // clear session value
  24. rtsp->session.timeout = 60000; // default timeout 1m
  25. session = http_get_header_by_name(rtsp->parser, "Session");
  26. if (session)
  27. rtsp_header_session(session, &rtsp->session);
  28. uri = http_get_request_uri(rtsp->parser);
  29. method = http_get_request_method(rtsp->parser);
  30. switch (*method)
  31. {
  32. case 'o':
  33. case 'O':
  34. if (0 == strcasecmp("OPTIONS", method))
  35. return rtsp_server_options(rtsp, uri);
  36. break;
  37. case 'd':
  38. case 'D':
  39. if (0 == strcasecmp("DESCRIBE", method) && rtsp->handler.ondescribe)
  40. return rtsp_server_describe(rtsp, uri);
  41. break;
  42. case 'g':
  43. case 'G':
  44. if (0 == strcasecmp("GET_PARAMETER", method) && rtsp->handler.ongetparameter)
  45. return rtsp_server_get_parameter(rtsp, uri);
  46. break;
  47. case 's':
  48. case 'S':
  49. if (0 == strcasecmp("SETUP", method) && rtsp->handler.onsetup)
  50. return rtsp_server_setup(rtsp, uri);
  51. else if (0 == strcasecmp("SET_PARAMETER", method) && rtsp->handler.onsetparameter)
  52. return rtsp_server_set_parameter(rtsp, uri);
  53. break;
  54. case 'p':
  55. case 'P':
  56. if (0 == strcasecmp("PLAY", method) && rtsp->handler.onplay)
  57. return rtsp_server_play(rtsp, uri);
  58. else if (0 == strcasecmp("PAUSE", method) && rtsp->handler.onpause)
  59. return rtsp_server_pause(rtsp, uri);
  60. break;
  61. case 't':
  62. case 'T':
  63. if (0 == strcasecmp("TEARDOWN", method) && rtsp->handler.onteardown)
  64. return rtsp_server_teardown(rtsp, uri);
  65. break;
  66. case 'a':
  67. case 'A':
  68. if (0 == strcasecmp("ANNOUNCE", method) && rtsp->handler.onannounce)
  69. return rtsp_server_announce(rtsp, uri);
  70. break;
  71. case 'r':
  72. case 'R':
  73. if (0 == strcasecmp("RECORD", method) && rtsp->handler.onrecord)
  74. return rtsp_server_record(rtsp, uri);
  75. break;
  76. }
  77. // 501 Not implemented
  78. return rtsp_server_reply(rtsp, 501);
  79. }