winlin

for #133, finish rtsp sdp, start rtp.

@@ -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();