正在显示
3 个修改的文件
包含
48 行增加
和
3 行删除
| @@ -68,7 +68,7 @@ SrsRtspConn::SrsRtspConn(SrsRtspCaster* c, st_netfd_t fd, std::string o) | @@ -68,7 +68,7 @@ SrsRtspConn::SrsRtspConn(SrsRtspCaster* c, st_netfd_t fd, std::string o) | ||
| 68 | { | 68 | { |
| 69 | output = o; | 69 | output = o; |
| 70 | 70 | ||
| 71 | - session = "O9EaZ4bf"; // TODO: FIXME: generate session id. | 71 | + session = ""; |
| 72 | video_rtp = NULL; | 72 | video_rtp = NULL; |
| 73 | audio_rtp = NULL; | 73 | audio_rtp = NULL; |
| 74 | 74 | ||
| @@ -118,7 +118,9 @@ int SrsRtspConn::do_cycle() | @@ -118,7 +118,9 @@ int SrsRtspConn::do_cycle() | ||
| 118 | srs_info("rtsp: got rtsp request"); | 118 | srs_info("rtsp: got rtsp request"); |
| 119 | 119 | ||
| 120 | if (req->is_options()) { | 120 | if (req->is_options()) { |
| 121 | - if ((ret = rtsp->send_message(new SrsRtspOptionsResponse(req->seq))) != ERROR_SUCCESS) { | 121 | + SrsRtspOptionsResponse* res = new SrsRtspOptionsResponse(req->seq); |
| 122 | + res->session = session; | ||
| 123 | + if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) { | ||
| 122 | if (!srs_is_client_gracefully_close(ret)) { | 124 | if (!srs_is_client_gracefully_close(ret)) { |
| 123 | srs_error("rtsp: send OPTIONS response failed. ret=%d", ret); | 125 | srs_error("rtsp: send OPTIONS response failed. ret=%d", ret); |
| 124 | } | 126 | } |
| @@ -136,7 +138,10 @@ int SrsRtspConn::do_cycle() | @@ -136,7 +138,10 @@ int SrsRtspConn::do_cycle() | ||
| 136 | req->sdp->audio_stream_id.c_str(), req->sdp->audio_codec.c_str(), | 138 | req->sdp->audio_stream_id.c_str(), req->sdp->audio_codec.c_str(), |
| 137 | req->sdp->audio_sample_rate.c_str(), req->sdp->audio_channel.c_str() | 139 | req->sdp->audio_sample_rate.c_str(), req->sdp->audio_channel.c_str() |
| 138 | ); | 140 | ); |
| 139 | - if ((ret = rtsp->send_message(new SrsRtspResponse(req->seq))) != ERROR_SUCCESS) { | 141 | + |
| 142 | + SrsRtspResponse* res = new SrsRtspResponse(req->seq); | ||
| 143 | + res->session = session; | ||
| 144 | + if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) { | ||
| 140 | if (!srs_is_client_gracefully_close(ret)) { | 145 | if (!srs_is_client_gracefully_close(ret)) { |
| 141 | srs_error("rtsp: send ANNOUNCE response failed. ret=%d", ret); | 146 | srs_error("rtsp: send ANNOUNCE response failed. ret=%d", ret); |
| 142 | } | 147 | } |
| @@ -164,6 +169,11 @@ int SrsRtspConn::do_cycle() | @@ -164,6 +169,11 @@ int SrsRtspConn::do_cycle() | ||
| 164 | } | 169 | } |
| 165 | srs_trace("rtsp: rtp listen at port=%d ok.", lpm); | 170 | srs_trace("rtsp: rtp listen at port=%d ok.", lpm); |
| 166 | 171 | ||
| 172 | + // create session. | ||
| 173 | + if (session.empty()) { | ||
| 174 | + session = "O9EaZ4bf"; // TODO: FIXME: generate session id. | ||
| 175 | + } | ||
| 176 | + | ||
| 167 | SrsRtspSetupResponse* res = new SrsRtspSetupResponse(req->seq); | 177 | SrsRtspSetupResponse* res = new SrsRtspSetupResponse(req->seq); |
| 168 | res->client_port_min = req->transport->client_port_min; | 178 | res->client_port_min = req->transport->client_port_min; |
| 169 | res->client_port_max = req->transport->client_port_max; | 179 | res->client_port_max = req->transport->client_port_max; |
| @@ -176,6 +186,15 @@ int SrsRtspConn::do_cycle() | @@ -176,6 +186,15 @@ int SrsRtspConn::do_cycle() | ||
| 176 | } | 186 | } |
| 177 | return ret; | 187 | return ret; |
| 178 | } | 188 | } |
| 189 | + } else if (req->is_record()) { | ||
| 190 | + SrsRtspResponse* res = new SrsRtspResponse(req->seq); | ||
| 191 | + res->session = session; | ||
| 192 | + if ((ret = rtsp->send_message(res)) != ERROR_SUCCESS) { | ||
| 193 | + if (!srs_is_client_gracefully_close(ret)) { | ||
| 194 | + srs_error("rtsp: send SETUP response failed. ret=%d", ret); | ||
| 195 | + } | ||
| 196 | + return ret; | ||
| 197 | + } | ||
| 179 | } | 198 | } |
| 180 | } | 199 | } |
| 181 | 200 |
| @@ -486,6 +486,11 @@ bool SrsRtspRequest::is_setup() | @@ -486,6 +486,11 @@ bool SrsRtspRequest::is_setup() | ||
| 486 | return method == __SRS_METHOD_SETUP; | 486 | return method == __SRS_METHOD_SETUP; |
| 487 | } | 487 | } |
| 488 | 488 | ||
| 489 | +bool SrsRtspRequest::is_record() | ||
| 490 | +{ | ||
| 491 | + return method == __SRS_METHOD_RECORD; | ||
| 492 | +} | ||
| 493 | + | ||
| 489 | SrsRtspResponse::SrsRtspResponse(int cseq) | 494 | SrsRtspResponse::SrsRtspResponse(int cseq) |
| 490 | { | 495 | { |
| 491 | seq = cseq; | 496 | seq = cseq; |
| @@ -513,6 +518,11 @@ int SrsRtspResponse::encode(stringstream& ss) | @@ -513,6 +518,11 @@ int SrsRtspResponse::encode(stringstream& ss) | ||
| 513 | << "Pragma: no-cache" << __SRS_RTSP_CRLF | 518 | << "Pragma: no-cache" << __SRS_RTSP_CRLF |
| 514 | << "Server: " << RTMP_SIG_SRS_SERVER << __SRS_RTSP_CRLF; | 519 | << "Server: " << RTMP_SIG_SRS_SERVER << __SRS_RTSP_CRLF; |
| 515 | 520 | ||
| 521 | + // session if specified. | ||
| 522 | + if (!session.empty()) { | ||
| 523 | + ss << __SRS_TOKEN_SESSION << ":" << session << __SRS_RTSP_CRLF; | ||
| 524 | + } | ||
| 525 | + | ||
| 516 | if ((ret = encode_header(ss)) != ERROR_SUCCESS) { | 526 | if ((ret = encode_header(ss)) != ERROR_SUCCESS) { |
| 517 | srs_error("rtsp: encode header failed. ret=%d", ret); | 527 | srs_error("rtsp: encode header failed. ret=%d", ret); |
| 518 | return ret; | 528 | return ret; |
| @@ -730,6 +740,13 @@ int SrsRtspStack::do_recv_message(SrsRtspRequest* req) | @@ -730,6 +740,13 @@ int SrsRtspStack::do_recv_message(SrsRtspRequest* req) | ||
| 730 | srs_error("rtsp: parse transport failed, transport=%s. ret=%d", transport.c_str(), ret); | 740 | srs_error("rtsp: parse transport failed, transport=%s. ret=%d", transport.c_str(), ret); |
| 731 | return ret; | 741 | return ret; |
| 732 | } | 742 | } |
| 743 | + } else if (token == __SRS_TOKEN_SESSION) { | ||
| 744 | + if ((ret = recv_token_eof(req->session)) != ERROR_SUCCESS) { | ||
| 745 | + if (!srs_is_client_gracefully_close(ret)) { | ||
| 746 | + srs_error("rtsp: parse %s failed. ret=%d", __SRS_TOKEN_SESSION, ret); | ||
| 747 | + } | ||
| 748 | + return ret; | ||
| 749 | + } | ||
| 733 | } else { | 750 | } else { |
| 734 | // unknown header name, parse util EOF. | 751 | // unknown header name, parse util EOF. |
| 735 | SrsRtspTokenState state = SrsRtspTokenStateNormal; | 752 | SrsRtspTokenState state = SrsRtspTokenStateNormal; |
| @@ -337,6 +337,10 @@ public: | @@ -337,6 +337,10 @@ public: | ||
| 337 | * assumed. It is interpreted according to [H14.14]. | 337 | * assumed. It is interpreted according to [H14.14]. |
| 338 | */ | 338 | */ |
| 339 | long content_length; | 339 | long content_length; |
| 340 | + /** | ||
| 341 | + * the session id. | ||
| 342 | + */ | ||
| 343 | + std::string session; | ||
| 340 | 344 | ||
| 341 | /** | 345 | /** |
| 342 | * the sdp in announce, NULL for no sdp. | 346 | * the sdp in announce, NULL for no sdp. |
| @@ -357,6 +361,7 @@ public: | @@ -357,6 +361,7 @@ public: | ||
| 357 | virtual bool is_options(); | 361 | virtual bool is_options(); |
| 358 | virtual bool is_announce(); | 362 | virtual bool is_announce(); |
| 359 | virtual bool is_setup(); | 363 | virtual bool is_setup(); |
| 364 | + virtual bool is_record(); | ||
| 360 | }; | 365 | }; |
| 361 | 366 | ||
| 362 | /** | 367 | /** |
| @@ -401,6 +406,10 @@ public: | @@ -401,6 +406,10 @@ public: | ||
| 401 | * for retransmissions of the same request). | 406 | * for retransmissions of the same request). |
| 402 | */ | 407 | */ |
| 403 | long seq; | 408 | long seq; |
| 409 | + /** | ||
| 410 | + * the session id. | ||
| 411 | + */ | ||
| 412 | + std::string session; | ||
| 404 | public: | 413 | public: |
| 405 | SrsRtspResponse(int cseq); | 414 | SrsRtspResponse(int cseq); |
| 406 | virtual ~SrsRtspResponse(); | 415 | virtual ~SrsRtspResponse(); |
-
请 注册 或 登录 后发表评论