// RFC2326 10.6 PAUSE (p36) // 1. A PAUSE request discards all queued PLAY requests. However, the pause // point in the media stream MUST be maintained. A subsequent PLAY // request without Range header resumes from the pause point. static void rtsp_server_pause(struct rtsp_server_request_t *req, void* parser, const char* uri) { int64_t npt = -1L; const char *prange, *psession; struct rtsp_header_range_t range; struct rtsp_header_session_t session; struct rtsp_server_context_t* ctx = req->server; prange = rtsp_get_header_by_name(parser, "range"); psession = rtsp_get_header_by_name(parser, "Session"); if(!psession || 0 != rtsp_header_session(psession, &session)) { // 454 Session Not Found rtsp_server_reply(req, 454); return; } if(prange && 0 == rtsp_header_range(prange, &range)) { npt = range.from; // 10.6 The normal play time for the stream is set to the pause point. (p36) assert(range.type == RTSP_RANGE_NPT); // 3.6 Normal Play Time (p17) assert(range.to_value == RTSP_RANGE_TIME_NOVALUE); // 457 Invalid Range //rtsp_server_reply(req, 457); //return; } ctx->handler.pause(ctx->ptr, req, uri, session.session, -1L==npt?NULL:&npt); }
// RFC2326 10.6 PAUSE (p36) // 1. A PAUSE request discards all queued PLAY requests. However, the pause // point in the media stream MUST be maintained. A subsequent PLAY // request without Range header resumes from the pause point. int rtsp_server_pause(struct rtsp_server_t* rtsp, const char* uri) { int64_t npt = -1L; const char *prange, *psession; struct rtsp_header_range_t range; prange = rtsp_get_header_by_name(rtsp->parser, "range"); psession = rtsp_get_header_by_name(rtsp->parser, "Session"); rtsp->session.session[0] = 0; // clear session value if (!psession || 0 != rtsp_header_session(psession, &rtsp->session)) { // 454 Session Not Found return rtsp_server_reply(rtsp, 454); } if (prange && 0 == rtsp_header_range(prange, &range)) { npt = range.from; // 10.6 The normal play time for the stream is set to the pause point. (p36) assert(range.type == RTSP_RANGE_NPT); // 3.6 Normal Play Time (p17) assert(range.to_value == RTSP_RANGE_TIME_NOVALUE); // 457 Invalid Range //rtsp_server_reply(req, 457, NULL); //return; } return rtsp->handler.onpause(rtsp->param, rtsp, uri, rtsp->session.session, -1L == npt ? NULL : &npt); }
static void rtsp_server_play(struct rtsp_server_request_t *req, void* parser, const char* uri) { int64_t npt = -1L; double scale = 0.0f; const char *pscale, *prange, *psession; struct rtsp_header_range_t range; struct rtsp_header_session_t session; struct rtsp_server_context_t* ctx = req->server; pscale = rtsp_get_header_by_name(parser, "scale"); prange = rtsp_get_header_by_name(parser, "range"); psession = rtsp_get_header_by_name(parser, "Session"); if(!psession || 0 != rtsp_header_session(psession, &session)) { // 454 (Session Not Found) rtsp_server_reply(req, 454); return; } if(pscale) { scale = atof(pscale); } if(prange && 0 == rtsp_header_range(prange, &range)) { npt = range.from; } ctx->handler.play(ctx->ptr, req, uri, session.session, -1L==npt?NULL:&npt, pscale?&scale:NULL); }