正在显示
8 个修改的文件
包含
104 行增加
和
34 行删除
| @@ -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 | - srs_error("send onFCUnpublish(NetStream.unpublish.Success) message failed. ret=%d", ret); | 2927 | + if (!srs_is_system_control_error(ret) && !srs_is_client_gracefully_close(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) { |
| 2936 | - srs_error("send FCUnpublish response message failed. ret=%d", ret); | 2938 | + if (!srs_is_system_control_error(ret) && !srs_is_client_gracefully_close(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) { |
| 2951 | - srs_error("send onStatus(NetStream.Unpublish.Success) message failed. ret=%d", ret); | 2955 | + if (!srs_is_system_control_error(ret) && !srs_is_client_gracefully_close(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(); |
| 5121 | - event_data = stream->read_4bytes(); | 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 | + } | ||
| 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); |
| 5169 | - stream->write_4bytes(event_data); | 5210 | + |
| 5211 | + if (event_type == SrsPCUCFmsEvent0) { | ||
| 5212 | + stream->write_1bytes(event_data); | ||
| 5213 | + } else { | ||
| 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. |
-
请 注册 或 登录 后发表评论