winlin

merge from 2.0

@@ -342,6 +342,7 @@ Remark: @@ -342,6 +342,7 @@ Remark:
342 342
343 ## History 343 ## History
344 344
  345 +* v2.0, 2015-08-18, close [#454](https://github.com/simple-rtmp-server/srs/issues/454), support obs restart publish. 2.0.184
345 * v2.0, 2015-08-14, use reduce_sequence_header for stream control. 346 * v2.0, 2015-08-14, use reduce_sequence_header for stream control.
346 * v2.0, 2015-08-14, use send_min_interval for stream control. 2.0.183 347 * v2.0, 2015-08-14, use send_min_interval for stream control. 2.0.183
347 * v2.0, 2015-08-12, enable the SRS_PERF_TCP_NODELAY and add config tcp_nodelay. 2.0.182 348 * v2.0, 2015-08-12, enable the SRS_PERF_TCP_NODELAY and add config tcp_nodelay. 2.0.182
@@ -508,10 +508,15 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then @@ -508,10 +508,15 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
508 else 508 else
509 echo -e "${YELLOW}warning: without HLS support${BLACK}" 509 echo -e "${YELLOW}warning: without HLS support${BLACK}"
510 fi 510 fi
  511 + if [ $SRS_STREAM_CASTER = YES ]; then
  512 + echo -e "${YELLOW}Experiment: StreamCaster is enabled${BLACK}"
  513 + else
  514 + echo -e "${GREEN}note: without StreamCaster support${BLACK}"
  515 + fi
511 if [ $SRS_HDS = YES ]; then 516 if [ $SRS_HDS = YES ]; then
512 - echo -e "${GREEN}HDS is enabled${BLACK}" 517 + echo -e "${YELLOW}Experiment: HDS is enabled${BLACK}"
513 else 518 else
514 - echo -e "${YELLOW}warning: without HDS support${BLACK}" 519 + echo -e "${GREEN}warning: without HDS support${BLACK}"
515 fi 520 fi
516 if [ $SRS_NGINX = YES ]; then 521 if [ $SRS_NGINX = YES ]; then
517 echo -e "${GREEN}Nginx http server is enabled${BLACK}" 522 echo -e "${GREEN}Nginx http server is enabled${BLACK}"
@@ -96,7 +96,7 @@ int SrsRecvThread::cycle() @@ -96,7 +96,7 @@ int SrsRecvThread::cycle()
96 } 96 }
97 97
98 if (ret != ERROR_SUCCESS) { 98 if (ret != ERROR_SUCCESS) {
99 - if (!srs_is_client_gracefully_close(ret)) { 99 + if (!srs_is_client_gracefully_close(ret) && !srs_is_system_control_error(ret)) {
100 srs_error("thread process message failed. ret=%d", ret); 100 srs_error("thread process message failed. ret=%d", ret);
101 } 101 }
102 102
@@ -337,6 +337,16 @@ int SrsRtmpConn::service_cycle() @@ -337,6 +337,16 @@ int SrsRtmpConn::service_cycle()
337 } 337 }
338 } 338 }
339 339
  340 + // set chunk size to larger.
  341 + // set the chunk size before any larger response greater than 128,
  342 + // to make OBS happy, @see https://github.com/simple-rtmp-server/srs/issues/454
  343 + int chunk_size = _srs_config->get_chunk_size(req->vhost);
  344 + if ((ret = rtmp->set_chunk_size(chunk_size)) != ERROR_SUCCESS) {
  345 + srs_error("set chunk_size=%d failed. ret=%d", chunk_size, ret);
  346 + return ret;
  347 + }
  348 + srs_info("set chunk_size=%d success", chunk_size);
  349 +
340 // response the client connect ok. 350 // response the client connect ok.
341 if ((ret = rtmp->response_connect_app(req, local_ip.c_str())) != ERROR_SUCCESS) { 351 if ((ret = rtmp->response_connect_app(req, local_ip.c_str())) != ERROR_SUCCESS) {
342 srs_error("response connect app failed. ret=%d", ret); 352 srs_error("response connect app failed. ret=%d", ret);
@@ -424,14 +434,6 @@ int SrsRtmpConn::stream_service_cycle() @@ -424,14 +434,6 @@ int SrsRtmpConn::stream_service_cycle()
424 rtmp->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US); 434 rtmp->set_recv_timeout(SRS_CONSTS_RTMP_RECV_TIMEOUT_US);
425 rtmp->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US); 435 rtmp->set_send_timeout(SRS_CONSTS_RTMP_SEND_TIMEOUT_US);
426 436
427 - // set chunk size to larger.  
428 - int chunk_size = _srs_config->get_chunk_size(req->vhost);  
429 - if ((ret = rtmp->set_chunk_size(chunk_size)) != ERROR_SUCCESS) {  
430 - srs_error("set chunk_size=%d failed. ret=%d", chunk_size, ret);  
431 - return ret;  
432 - }  
433 - srs_info("set chunk_size=%d success", chunk_size);  
434 -  
435 // find a source to serve. 437 // find a source to serve.
436 SrsSource* source = SrsSource::fetch(req); 438 SrsSource* source = SrsSource::fetch(req);
437 if (!source) { 439 if (!source) {
@@ -637,7 +639,7 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe @@ -637,7 +639,7 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe
637 639
638 // quit when recv thread error. 640 // quit when recv thread error.
639 if ((ret = trd->error_code()) != ERROR_SUCCESS) { 641 if ((ret = trd->error_code()) != ERROR_SUCCESS) {
640 - if (!srs_is_client_gracefully_close(ret)) { 642 + if (!srs_is_client_gracefully_close(ret) && !srs_is_system_control_error(ret)) {
641 srs_error("recv thread failed. ret=%d", ret); 643 srs_error("recv thread failed. ret=%d", ret);
642 } 644 }
643 return ret; 645 return ret;
@@ -824,7 +826,7 @@ int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) @@ -824,7 +826,7 @@ int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd)
824 826
825 // check the thread error code. 827 // check the thread error code.
826 if ((ret = trd->error_code()) != ERROR_SUCCESS) { 828 if ((ret = trd->error_code()) != ERROR_SUCCESS) {
827 - if (!srs_is_client_gracefully_close(ret)) { 829 + if (!srs_is_system_control_error(ret) && !srs_is_client_gracefully_close(ret)) {
828 srs_error("recv thread failed. ret=%d", ret); 830 srs_error("recv thread failed. ret=%d", ret);
829 } 831 }
830 return ret; 832 return ret;
@@ -1463,7 +1463,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -1463,7 +1463,11 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
1463 srs_verbose("initialize shared ptr metadata success."); 1463 srs_verbose("initialize shared ptr metadata success.");
1464 1464
1465 // copy to all consumer 1465 // copy to all consumer
1466 - if (true) { 1466 + bool drop_for_reduce = false;
  1467 + if (cache_metadata && _srs_config->get_reduce_sequence_header(_req->vhost)) {
  1468 + drop_for_reduce = true;
  1469 + }
  1470 + if (!drop_for_reduce) {
1467 std::vector<SrsConsumer*>::iterator it; 1471 std::vector<SrsConsumer*>::iterator it;
1468 for (it = consumers.begin(); it != consumers.end(); ++it) { 1472 for (it = consumers.begin(); it != consumers.end(); ++it) {
1469 SrsConsumer* consumer = *it; 1473 SrsConsumer* consumer = *it;
@@ -2084,10 +2088,10 @@ void SrsSource::on_unpublish() @@ -2084,10 +2088,10 @@ void SrsSource::on_unpublish()
2084 hds->on_unpublish(); 2088 hds->on_unpublish();
2085 #endif 2089 #endif
2086 2090
2087 - // only clear the gop cache metadata,  
2088 - // donot clear the sequence header, for it maybe not changed. 2091 + // only clear the gop cache,
  2092 + // donot clear the sequence header, for it maybe not changed,
  2093 + // when drop dup sequence header, drop the metadata also.
2089 gop_cache->clear(); 2094 gop_cache->clear();
2090 - srs_freep(cache_metadata);  
2091 2095
2092 srs_info("clear cache/metadata when unpublish."); 2096 srs_info("clear cache/metadata when unpublish.");
2093 srs_trace("cleanup when unpublish"); 2097 srs_trace("cleanup when unpublish");
@@ -187,7 +187,7 @@ namespace internal { @@ -187,7 +187,7 @@ namespace internal {
187 srs_info("thread %s on before cycle success"); 187 srs_info("thread %s on before cycle success");
188 188
189 if ((ret = handler->cycle()) != ERROR_SUCCESS) { 189 if ((ret = handler->cycle()) != ERROR_SUCCESS) {
190 - if (!srs_is_client_gracefully_close(ret)) { 190 + if (!srs_is_client_gracefully_close(ret) && !srs_is_system_control_error(ret)) {
191 srs_warn("thread %s cycle failed, ignored and retry, ret=%d", _name, ret); 191 srs_warn("thread %s cycle failed, ignored and retry, ret=%d", _name, ret);
192 } 192 }
193 goto failed; 193 goto failed;
@@ -2924,7 +2924,9 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid) @@ -2924,7 +2924,9 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
2924 pkt->data->set(StatusDescription, SrsAmf0Any::str("Stop publishing stream.")); 2924 pkt->data->set(StatusDescription, SrsAmf0Any::str("Stop publishing stream."));
2925 2925
2926 if ((ret = protocol->send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) { 2926 if ((ret = protocol->send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
  2927 + if (!srs_is_system_control_error(ret) && !srs_is_client_gracefully_close(ret)) {
2927 srs_error("send onFCUnpublish(NetStream.unpublish.Success) message failed. ret=%d", ret); 2928 srs_error("send onFCUnpublish(NetStream.unpublish.Success) message failed. ret=%d", ret);
  2929 + }
2928 return ret; 2930 return ret;
2929 } 2931 }
2930 srs_info("send onFCUnpublish(NetStream.unpublish.Success) message success."); 2932 srs_info("send onFCUnpublish(NetStream.unpublish.Success) message success.");
@@ -2933,7 +2935,9 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid) @@ -2933,7 +2935,9 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
2933 if (true) { 2935 if (true) {
2934 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(unpublish_tid); 2936 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(unpublish_tid);
2935 if ((ret = protocol->send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) { 2937 if ((ret = protocol->send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
  2938 + if (!srs_is_system_control_error(ret) && !srs_is_client_gracefully_close(ret)) {
2936 srs_error("send FCUnpublish response message failed. ret=%d", ret); 2939 srs_error("send FCUnpublish response message failed. ret=%d", ret);
  2940 + }
2937 return ret; 2941 return ret;
2938 } 2942 }
2939 srs_info("send FCUnpublish response message success."); 2943 srs_info("send FCUnpublish response message success.");
@@ -2948,7 +2952,9 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid) @@ -2948,7 +2952,9 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
2948 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID)); 2952 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
2949 2953
2950 if ((ret = protocol->send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) { 2954 if ((ret = protocol->send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
  2955 + if (!srs_is_system_control_error(ret) && !srs_is_client_gracefully_close(ret)) {
2951 srs_error("send onStatus(NetStream.Unpublish.Success) message failed. ret=%d", ret); 2956 srs_error("send onStatus(NetStream.Unpublish.Success) message failed. ret=%d", ret);
  2957 + }
2952 return ret; 2958 return ret;
2953 } 2959 }
2954 srs_info("send onStatus(NetStream.Unpublish.Success) message success."); 2960 srs_info("send onStatus(NetStream.Unpublish.Success) message success.");
@@ -4234,10 +4240,22 @@ int SrsPlayPacket::get_message_type() @@ -4234,10 +4240,22 @@ int SrsPlayPacket::get_message_type()
4234 4240
4235 int SrsPlayPacket::get_size() 4241 int SrsPlayPacket::get_size()
4236 { 4242 {
4237 - return SrsAmf0Size::str(command_name) + SrsAmf0Size::number()  
4238 - + SrsAmf0Size::null() + SrsAmf0Size::str(stream_name)  
4239 - + SrsAmf0Size::number() + SrsAmf0Size::number()  
4240 - + SrsAmf0Size::boolean(); 4243 + int size = SrsAmf0Size::str(command_name) + SrsAmf0Size::number()
  4244 + + SrsAmf0Size::null() + SrsAmf0Size::str(stream_name);
  4245 +
  4246 + if (start != -2 || duration != -1 || !reset) {
  4247 + size += SrsAmf0Size::number();
  4248 + }
  4249 +
  4250 + if (duration != -1 || !reset) {
  4251 + size += SrsAmf0Size::number();
  4252 + }
  4253 +
  4254 + if (!reset) {
  4255 + size += SrsAmf0Size::boolean();
  4256 + }
  4257 +
  4258 + return size;
4241 } 4259 }
4242 4260
4243 int SrsPlayPacket::encode_packet(SrsStream* stream) 4261 int SrsPlayPacket::encode_packet(SrsStream* stream)
@@ -4268,19 +4286,19 @@ int SrsPlayPacket::encode_packet(SrsStream* stream) @@ -4268,19 +4286,19 @@ int SrsPlayPacket::encode_packet(SrsStream* stream)
4268 } 4286 }
4269 srs_verbose("encode stream_name success."); 4287 srs_verbose("encode stream_name success.");
4270 4288
4271 - if ((ret = srs_amf0_write_number(stream, start)) != ERROR_SUCCESS) { 4289 + if ((start != -2 || duration != -1 || !reset) && (ret = srs_amf0_write_number(stream, start)) != ERROR_SUCCESS) {
4272 srs_error("encode start failed. ret=%d", ret); 4290 srs_error("encode start failed. ret=%d", ret);
4273 return ret; 4291 return ret;
4274 } 4292 }
4275 srs_verbose("encode start success."); 4293 srs_verbose("encode start success.");
4276 4294
4277 - if ((ret = srs_amf0_write_number(stream, duration)) != ERROR_SUCCESS) { 4295 + if ((duration != -1 || !reset) && (ret = srs_amf0_write_number(stream, duration)) != ERROR_SUCCESS) {
4278 srs_error("encode duration failed. ret=%d", ret); 4296 srs_error("encode duration failed. ret=%d", ret);
4279 return ret; 4297 return ret;
4280 } 4298 }
4281 srs_verbose("encode duration success."); 4299 srs_verbose("encode duration success.");
4282 4300
4283 - if ((ret = srs_amf0_write_boolean(stream, reset)) != ERROR_SUCCESS) { 4301 + if (!reset && (ret = srs_amf0_write_boolean(stream, reset)) != ERROR_SUCCESS) {
4284 srs_error("encode reset failed. ret=%d", ret); 4302 srs_error("encode reset failed. ret=%d", ret);
4285 return ret; 4303 return ret;
4286 } 4304 }
@@ -5111,14 +5129,29 @@ int SrsUserControlPacket::decode(SrsStream* stream) @@ -5111,14 +5129,29 @@ int SrsUserControlPacket::decode(SrsStream* stream)
5111 { 5129 {
5112 int ret = ERROR_SUCCESS; 5130 int ret = ERROR_SUCCESS;
5113 5131
5114 - if (!stream->require(6)) { 5132 + if (!stream->require(2)) {
5115 ret = ERROR_RTMP_MESSAGE_DECODE; 5133 ret = ERROR_RTMP_MESSAGE_DECODE;
5116 srs_error("decode user control failed. ret=%d", ret); 5134 srs_error("decode user control failed. ret=%d", ret);
5117 return ret; 5135 return ret;
5118 } 5136 }
5119 5137
5120 event_type = stream->read_2bytes(); 5138 event_type = stream->read_2bytes();
  5139 +
  5140 + if (event_type == SrsPCUCFmsEvent0) {
  5141 + if (!stream->require(1)) {
  5142 + ret = ERROR_RTMP_MESSAGE_DECODE;
  5143 + srs_error("decode user control failed. ret=%d", ret);
  5144 + return ret;
  5145 + }
  5146 + event_data = stream->read_1bytes();
  5147 + } else {
  5148 + if (!stream->require(4)) {
  5149 + ret = ERROR_RTMP_MESSAGE_DECODE;
  5150 + srs_error("decode user control failed. ret=%d", ret);
  5151 + return ret;
  5152 + }
5121 event_data = stream->read_4bytes(); 5153 event_data = stream->read_4bytes();
  5154 + }
5122 5155
5123 if (event_type == SrcPCUCSetBufferLength) { 5156 if (event_type == SrcPCUCSetBufferLength) {
5124 if (!stream->require(4)) { 5157 if (!stream->require(4)) {
@@ -5148,11 +5181,19 @@ int SrsUserControlPacket::get_message_type() @@ -5148,11 +5181,19 @@ int SrsUserControlPacket::get_message_type()
5148 5181
5149 int SrsUserControlPacket::get_size() 5182 int SrsUserControlPacket::get_size()
5150 { 5183 {
5151 - if (event_type == SrcPCUCSetBufferLength) {  
5152 - return 2 + 4 + 4; 5184 + int size = 2;
  5185 +
  5186 + if (event_type == SrsPCUCFmsEvent0) {
  5187 + size += 1;
5153 } else { 5188 } else {
5154 - return 2 + 4; 5189 + size += 4;
5155 } 5190 }
  5191 +
  5192 + if (event_type == SrcPCUCSetBufferLength) {
  5193 + size += 4;
  5194 + }
  5195 +
  5196 + return size;
5156 } 5197 }
5157 5198
5158 int SrsUserControlPacket::encode_packet(SrsStream* stream) 5199 int SrsUserControlPacket::encode_packet(SrsStream* stream)
@@ -5166,7 +5207,12 @@ int SrsUserControlPacket::encode_packet(SrsStream* stream) @@ -5166,7 +5207,12 @@ int SrsUserControlPacket::encode_packet(SrsStream* stream)
5166 } 5207 }
5167 5208
5168 stream->write_2bytes(event_type); 5209 stream->write_2bytes(event_type);
  5210 +
  5211 + if (event_type == SrsPCUCFmsEvent0) {
  5212 + stream->write_1bytes(event_data);
  5213 + } else {
5169 stream->write_4bytes(event_data); 5214 stream->write_4bytes(event_data);
  5215 + }
5170 5216
5171 // when event type is set buffer length, 5217 // when event type is set buffer length,
5172 // write the extra buffer length. 5218 // write the extra buffer length.
@@ -1991,6 +1991,13 @@ enum SrcPCUCEventType @@ -1991,6 +1991,13 @@ enum SrcPCUCEventType
1991 * kMsgPingRequest request. 1991 * kMsgPingRequest request.
1992 */ 1992 */
1993 SrcPCUCPingResponse = 0x07, 1993 SrcPCUCPingResponse = 0x07,
  1994 +
  1995 + /**
  1996 + * for PCUC size=3, the payload is "00 1A 01",
  1997 + * where we think the event is 0x001a, fms defined msg,
  1998 + * which has only 1bytes event data.
  1999 + */
  2000 + SrsPCUCFmsEvent0 = 0x1a,
1994 }; 2001 };
1995 2002
1996 /** 2003 /**
@@ -2019,6 +2026,11 @@ public: @@ -2019,6 +2026,11 @@ public:
2019 * @see: SrcPCUCEventType 2026 * @see: SrcPCUCEventType
2020 */ 2027 */
2021 int16_t event_type; 2028 int16_t event_type;
  2029 + /**
  2030 + * the event data generally in 4bytes.
  2031 + * @remark for event type is 0x001a, only 1bytes.
  2032 + * @see SrsPCUCFmsEvent0
  2033 + */
2022 int32_t event_data; 2034 int32_t event_data;
2023 /** 2035 /**
2024 * 4bytes if event_type is SetBufferLength; otherwise 0. 2036 * 4bytes if event_type is SetBufferLength; otherwise 0.