Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

121 linhas
3.4KB

  1. // RFC-2326 10.6 PAUSE (p36)
  2. // 1. A PAUSE request discards all queued PLAY requests. However, the pause
  3. // point in the media stream MUST be maintained. A subsequent PLAY
  4. // request without Range header resumes from the pause point. (p36)
  5. // 2. The PAUSE request may contain a Range header specifying when the
  6. // stream or presentation is to be halted. (p36) (p45 for more)
  7. /*
  8. C->S:
  9. PAUSE rtsp://example.com/fizzle/foo RTSP/1.0
  10. CSeq: 834
  11. Session: 12345678
  12. S->C:
  13. RTSP/1.0 200 OK
  14. CSeq: 834
  15. Date: 23 Jan 1997 15:35:06 GMT
  16. */
  17. #include "rtsp-client.h"
  18. #include "rtsp-client-internal.h"
  19. static const char* sc_format =
  20. "PAUSE %s RTSP/1.0\r\n"
  21. "CSeq: %u\r\n"
  22. "Session: %s\r\n"
  23. "%s" // Authorization: Digest xxx
  24. "User-Agent: %s\r\n"
  25. "\r\n";
  26. static int rtsp_client_media_pause(struct rtsp_client_t *rtsp, int i)
  27. {
  28. int r;
  29. assert(0 == rtsp->aggregate);
  30. assert(i < rtsp->media_count);
  31. assert(RTSP_PAUSE == rtsp->state);
  32. if (i >= rtsp->media_count) return -1;
  33. assert(rtsp->media[i].uri[0] && rtsp->session[i].session[0]);
  34. r = rtsp_client_authenrization(rtsp, "PAUSE", rtsp->media[i].uri, NULL, 0, rtsp->authenrization, sizeof(rtsp->authenrization));
  35. r = snprintf(rtsp->req, sizeof(rtsp->req), sc_format, rtsp->media[i].uri, rtsp->cseq++, rtsp->session[i].session, rtsp->authenrization, USER_AGENT);
  36. return (r > 0 && r < sizeof(rtsp->req) && r == rtsp->handler.send(rtsp->param, rtsp->media[i].uri, rtsp->req, r)) ? 0 : -1;
  37. }
  38. int rtsp_client_pause(struct rtsp_client_t *rtsp)
  39. {
  40. int r;
  41. assert(RTSP_SETUP == rtsp->state || RTSP_PLAY == rtsp->state || RTSP_PAUSE == rtsp->state);
  42. rtsp->state = RTSP_PAUSE;
  43. rtsp->progress = 0;
  44. if(rtsp->aggregate)
  45. {
  46. assert(rtsp->media_count > 0);
  47. assert(rtsp->aggregate_uri[0]);
  48. r = rtsp_client_authenrization(rtsp, "PAUSE", rtsp->aggregate_uri, NULL, 0, rtsp->authenrization, sizeof(rtsp->authenrization));
  49. r = snprintf(rtsp->req, sizeof(rtsp->req), sc_format, rtsp->aggregate_uri, rtsp->cseq++, rtsp->session[0].session, rtsp->authenrization, USER_AGENT);
  50. return (r > 0 && r < sizeof(rtsp->req) && r == rtsp->handler.send(rtsp->param, rtsp->aggregate_uri, rtsp->req, r)) ? 0 : -1;
  51. }
  52. else
  53. {
  54. return rtsp_client_media_pause(rtsp, rtsp->progress);
  55. }
  56. }
  57. static int rtsp_client_media_pause_onreply(struct rtsp_client_t* rtsp, void* parser)
  58. {
  59. int code;
  60. assert(0 == rtsp->aggregate);
  61. assert(rtsp->progress < rtsp->media_count);
  62. code = http_get_status_code(parser);
  63. assert(460 != code); // 460 Only aggregate operation allowed (p26)
  64. if (200 == code)
  65. {
  66. if (rtsp->media_count == ++rtsp->progress)
  67. {
  68. return rtsp->handler.onpause(rtsp->param);
  69. }
  70. else
  71. {
  72. return rtsp_client_media_pause(rtsp, rtsp->progress);
  73. }
  74. }
  75. else
  76. {
  77. return -1;
  78. }
  79. }
  80. // aggregate control reply
  81. static int rtsp_client_aggregate_pause_onreply(struct rtsp_client_t* rtsp, void* parser)
  82. {
  83. int code;
  84. assert(rtsp->aggregate);
  85. code = http_get_status_code(parser);
  86. if (459 == code) // 459 Aggregate operation not allowed (p26)
  87. {
  88. rtsp->aggregate = 0;
  89. return rtsp_client_media_pause(rtsp, rtsp->progress);
  90. }
  91. else if(200 == code)
  92. {
  93. return rtsp->handler.onpause(rtsp->param);
  94. }
  95. return -1;
  96. }
  97. int rtsp_client_pause_onreply(struct rtsp_client_t* rtsp, void* parser)
  98. {
  99. assert(RTSP_PAUSE == rtsp->state);
  100. assert(rtsp->progress < rtsp->media_count);
  101. if (rtsp->aggregate)
  102. return rtsp_client_aggregate_pause_onreply(rtsp, parser);
  103. else
  104. return rtsp_client_media_pause_onreply(rtsp, parser);
  105. }