mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
refine RTMP protocol stack.
This commit is contained in:
parent
ebf6203c3b
commit
be4c182d11
9 changed files with 104 additions and 1632 deletions
|
@ -189,22 +189,22 @@ int SrsBandwidth::do_bandwidth_check()
|
||||||
pkt->data->set("publish_bytes", SrsAmf0Any::number(publish_bytes));
|
pkt->data->set("publish_bytes", SrsAmf0Any::number(publish_bytes));
|
||||||
pkt->data->set("publish_time", SrsAmf0Any::number(publish_actual_duration_ms));
|
pkt->data->set("publish_time", SrsAmf0Any::number(publish_actual_duration_ms));
|
||||||
|
|
||||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
if ((ret = rtmp->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send bandwidth check finish message failed. ret=%d", ret);
|
srs_error("send bandwidth check finish message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if flash, we notice the result, and expect a final packet.
|
// if flash, we notice the result, and expect a final packet.
|
||||||
while (true) {
|
while (true) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
// info level to ignore and return success.
|
// info level to ignore and return success.
|
||||||
srs_info("expect final message failed. ret=%d", ret);
|
srs_info("expect final message failed. ret=%d", ret);
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get final message success.");
|
srs_info("get final message success.");
|
||||||
|
|
||||||
if (pkt->is_flash_final()) {
|
if (pkt->is_flash_final()) {
|
||||||
|
@ -233,8 +233,7 @@ int SrsBandwidth::check_play(
|
||||||
pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
|
pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
|
||||||
pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
|
pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
|
||||||
|
|
||||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
if ((ret = rtmp->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send bandwidth check start play message failed. ret=%d", ret);
|
srs_error("send bandwidth check start play message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -243,13 +242,14 @@ int SrsBandwidth::check_play(
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
// recv client's starting play response
|
// recv client's starting play response
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect bandwidth message failed. ret=%d", ret);
|
srs_error("expect bandwidth message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandwidth message succes.");
|
srs_info("get bandwidth message succes.");
|
||||||
|
|
||||||
if (pkt->is_starting_play()) {
|
if (pkt->is_starting_play()) {
|
||||||
|
@ -284,8 +284,7 @@ int SrsBandwidth::check_play(
|
||||||
// TODO: FIXME: get length from the rtmp protocol stack.
|
// TODO: FIXME: get length from the rtmp protocol stack.
|
||||||
play_bytes += pkt->get_payload_length();
|
play_bytes += pkt->get_payload_length();
|
||||||
|
|
||||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
if ((ret = rtmp->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send bandwidth check play messages failed. ret=%d", ret);
|
srs_error("send bandwidth check play messages failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -309,13 +308,13 @@ int SrsBandwidth::check_play(
|
||||||
if (true) {
|
if (true) {
|
||||||
// notify client to stop play
|
// notify client to stop play
|
||||||
SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play();
|
SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_stop_play();
|
||||||
|
|
||||||
pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
|
pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
|
||||||
pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
|
pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
|
||||||
pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
|
pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
|
||||||
pkt->data->set("bytes_delta", SrsAmf0Any::number(play_bytes));
|
pkt->data->set("bytes_delta", SrsAmf0Any::number(play_bytes));
|
||||||
|
|
||||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
if ((ret = rtmp->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send bandwidth check stop play message failed. ret=%d", ret);
|
srs_error("send bandwidth check stop play message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -324,13 +323,14 @@ int SrsBandwidth::check_play(
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
// recv client's stop play response.
|
// recv client's stop play response.
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect bandwidth message failed. ret=%d", ret);
|
srs_error("expect bandwidth message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandwidth message succes.");
|
srs_info("get bandwidth message succes.");
|
||||||
|
|
||||||
if (pkt->is_stopped_play()) {
|
if (pkt->is_stopped_play()) {
|
||||||
|
@ -357,8 +357,7 @@ int SrsBandwidth::check_publish(
|
||||||
pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
|
pkt->data->set("duration_ms", SrsAmf0Any::number(duration_ms));
|
||||||
pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
|
pkt->data->set("interval_ms", SrsAmf0Any::number(interval_ms));
|
||||||
|
|
||||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
if ((ret = rtmp->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send bandwidth check start publish message failed. ret=%d", ret);
|
srs_error("send bandwidth check start publish message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -367,13 +366,14 @@ int SrsBandwidth::check_publish(
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
// read client's notification of starting publish
|
// read client's notification of starting publish
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect bandwidth message failed. ret=%d", ret);
|
srs_error("expect bandwidth message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandwidth message succes.");
|
srs_info("get bandwidth message succes.");
|
||||||
|
|
||||||
if (pkt->is_starting_publish()) {
|
if (pkt->is_starting_publish()) {
|
||||||
|
@ -387,12 +387,12 @@ int SrsBandwidth::check_publish(
|
||||||
while ( (srs_get_system_time_ms() - current_time) < duration_ms ) {
|
while ( (srs_get_system_time_ms() - current_time) < duration_ms ) {
|
||||||
st_usleep(0);
|
st_usleep(0);
|
||||||
|
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
if ((ret = rtmp->recv_message(&msg)) != ERROR_SUCCESS) {
|
if ((ret = rtmp->__recv_message(&msg)) != ERROR_SUCCESS) {
|
||||||
srs_error("recv message failed. ret=%d", ret);
|
srs_error("recv message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
|
||||||
// TODO: FIXME.
|
// TODO: FIXME.
|
||||||
publish_bytes += msg->header.payload_length;
|
publish_bytes += msg->header.payload_length;
|
||||||
|
@ -420,8 +420,7 @@ int SrsBandwidth::check_publish(
|
||||||
pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
|
pkt->data->set("duration_delta", SrsAmf0Any::number(actual_duration_ms));
|
||||||
pkt->data->set("bytes_delta", SrsAmf0Any::number(publish_bytes));
|
pkt->data->set("bytes_delta", SrsAmf0Any::number(publish_bytes));
|
||||||
|
|
||||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
if ((ret = rtmp->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send bandwidth check stop publish message failed. ret=%d", ret);
|
srs_error("send bandwidth check stop publish message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -436,13 +435,14 @@ int SrsBandwidth::check_publish(
|
||||||
// TODO: FIXME: check whether flash client.
|
// TODO: FIXME: check whether flash client.
|
||||||
while (false) {
|
while (false) {
|
||||||
// recv client's stop publish response.
|
// recv client's stop publish response.
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect bandwidth message failed. ret=%d", ret);
|
srs_error("expect bandwidth message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandwidth message succes.");
|
srs_info("get bandwidth message succes.");
|
||||||
|
|
||||||
if (pkt->is_stopped_publish()) {
|
if (pkt->is_stopped_publish()) {
|
||||||
|
|
|
@ -315,8 +315,8 @@ int SrsForwarder::forward()
|
||||||
|
|
||||||
// read from client.
|
// read from client.
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
ret = client->recv_message(&msg);
|
ret = client->__recv_message(&msg);
|
||||||
|
|
||||||
srs_verbose("play loop recv message. ret=%d", ret);
|
srs_verbose("play loop recv message. ret=%d", ret);
|
||||||
if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) {
|
if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) {
|
||||||
|
|
|
@ -713,6 +713,7 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, __SrsMessage* msg, b
|
||||||
srs_error("source process audio message failed. ret=%d", ret);
|
srs_error("source process audio message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
// process video packet
|
// process video packet
|
||||||
if (msg->header.is_video()) {
|
if (msg->header.is_video()) {
|
||||||
|
@ -720,6 +721,7 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, __SrsMessage* msg, b
|
||||||
srs_error("source process video message failed. ret=%d", ret);
|
srs_error("source process video message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// process onMetaData
|
// process onMetaData
|
||||||
|
|
|
@ -283,15 +283,15 @@ int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** dat
|
||||||
Context* context = (Context*)rtmp;
|
Context* context = (Context*)rtmp;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
if ((ret = context->rtmp->recv_message(&msg)) != ERROR_SUCCESS) {
|
if ((ret = context->rtmp->__recv_message(&msg)) != ERROR_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (!msg) {
|
if (!msg) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
|
||||||
if (msg->header.is_audio()) {
|
if (msg->header.is_audio()) {
|
||||||
*type = SRS_RTMP_TYPE_AUDIO;
|
*type = SRS_RTMP_TYPE_AUDIO;
|
||||||
|
@ -332,13 +332,13 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
|
||||||
srs_assert(rtmp != NULL);
|
srs_assert(rtmp != NULL);
|
||||||
Context* context = (Context*)rtmp;
|
Context* context = (Context*)rtmp;
|
||||||
|
|
||||||
SrsSharedPtrMessage* msg = NULL;
|
__SrsSharedPtrMessage* msg = NULL;
|
||||||
|
|
||||||
if (type == SRS_RTMP_TYPE_AUDIO) {
|
if (type == SRS_RTMP_TYPE_AUDIO) {
|
||||||
SrsMessageHeader header;
|
SrsMessageHeader header;
|
||||||
header.initialize_audio(size, timestamp, context->stream_id);
|
header.initialize_audio(size, timestamp, context->stream_id);
|
||||||
|
|
||||||
msg = new SrsSharedPtrMessage();
|
msg = new __SrsSharedPtrMessage();
|
||||||
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
|
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
|
||||||
srs_freepa(data);
|
srs_freepa(data);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -347,7 +347,7 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
|
||||||
SrsMessageHeader header;
|
SrsMessageHeader header;
|
||||||
header.initialize_video(size, timestamp, context->stream_id);
|
header.initialize_video(size, timestamp, context->stream_id);
|
||||||
|
|
||||||
msg = new SrsSharedPtrMessage();
|
msg = new __SrsSharedPtrMessage();
|
||||||
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
|
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
|
||||||
srs_freepa(data);
|
srs_freepa(data);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -356,7 +356,7 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
|
||||||
SrsMessageHeader header;
|
SrsMessageHeader header;
|
||||||
header.initialize_amf0_script(size, context->stream_id);
|
header.initialize_amf0_script(size, context->stream_id);
|
||||||
|
|
||||||
msg = new SrsSharedPtrMessage();
|
msg = new __SrsSharedPtrMessage();
|
||||||
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
|
if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
|
||||||
srs_freepa(data);
|
srs_freepa(data);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -365,7 +365,7 @@ int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data,
|
||||||
|
|
||||||
if (msg) {
|
if (msg) {
|
||||||
// send out encoded msg.
|
// send out encoded msg.
|
||||||
if ((ret = context->rtmp->send_message(msg)) != ERROR_SUCCESS) {
|
if ((ret = context->rtmp->__send_and_free_message(msg)) != ERROR_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -341,13 +341,14 @@ int SrsBandCheckClient::expect_start_play()
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
// expect connect _result
|
// expect connect _result
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect bandcheck start play message failed. ret=%d", ret);
|
srs_error("expect bandcheck start play message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandcheck start play message");
|
srs_info("get bandcheck start play message");
|
||||||
|
|
||||||
if (pkt->command_name != SRS_BW_CHECK_START_PLAY) {
|
if (pkt->command_name != SRS_BW_CHECK_START_PLAY) {
|
||||||
|
@ -362,12 +363,9 @@ int SrsBandCheckClient::send_starting_play()
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage;
|
|
||||||
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
||||||
pkt->command_name = SRS_BW_CHECK_STARTING_PLAY;
|
pkt->command_name = SRS_BW_CHECK_STARTING_PLAY;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = __send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send starting play msg failed. ret=%d", ret);
|
srs_error("send starting play msg failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -380,13 +378,14 @@ int SrsBandCheckClient::expect_stop_play()
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect stop play message failed. ret=%d", ret);
|
srs_error("expect stop play message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandcheck stop play message");
|
srs_info("get bandcheck stop play message");
|
||||||
|
|
||||||
if (pkt->command_name == SRS_BW_CHECK_STOP_PLAY) {
|
if (pkt->command_name == SRS_BW_CHECK_STOP_PLAY) {
|
||||||
|
@ -401,12 +400,9 @@ int SrsBandCheckClient::send_stopped_play()
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage;
|
|
||||||
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
||||||
pkt->command_name = SRS_BW_CHECK_STOPPED_PLAY;
|
pkt->command_name = SRS_BW_CHECK_STOPPED_PLAY;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = __send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send stopped play msg failed. ret=%d", ret);
|
srs_error("send stopped play msg failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -419,13 +415,14 @@ int SrsBandCheckClient::expect_start_pub()
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect start pub message failed. ret=%d", ret);
|
srs_error("expect start pub message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandcheck start pub message");
|
srs_info("get bandcheck start pub message");
|
||||||
|
|
||||||
if (pkt->command_name == SRS_BW_CHECK_START_PUBLISH) {
|
if (pkt->command_name == SRS_BW_CHECK_START_PUBLISH) {
|
||||||
|
@ -440,12 +437,9 @@ int SrsBandCheckClient::send_starting_pub()
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage;
|
|
||||||
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
||||||
pkt->command_name = SRS_BW_CHECK_STARTING_PUBLISH;
|
pkt->command_name = SRS_BW_CHECK_STARTING_PUBLISH;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = __send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send starting play msg failed. ret=%d", ret);
|
srs_error("send starting play msg failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -460,10 +454,8 @@ int SrsBandCheckClient::send_pub_data()
|
||||||
|
|
||||||
int data_count = 100;
|
int data_count = 100;
|
||||||
while (true) {
|
while (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage;
|
|
||||||
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
||||||
pkt->command_name = SRS_BW_CHECK_PUBLISHING;
|
pkt->command_name = SRS_BW_CHECK_PUBLISHING;
|
||||||
msg->set_packet(pkt, 0);
|
|
||||||
|
|
||||||
for (int i = 0; i < data_count; ++i) {
|
for (int i = 0; i < data_count; ++i) {
|
||||||
std::stringstream seq;
|
std::stringstream seq;
|
||||||
|
@ -473,7 +465,7 @@ int SrsBandCheckClient::send_pub_data()
|
||||||
}
|
}
|
||||||
data_count += 100;
|
data_count += 100;
|
||||||
|
|
||||||
if ((ret = send_message(msg)) != ERROR_SUCCESS) {
|
if ((ret = __send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
srs_error("send publish message failed.ret=%d", ret);
|
srs_error("send publish message failed.ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -493,11 +485,13 @@ int SrsBandCheckClient::expect_stop_pub()
|
||||||
this->set_recv_timeout(1000 * 1000);
|
this->set_recv_timeout(1000 * 1000);
|
||||||
this->set_send_timeout(1000 * 1000);
|
this->set_send_timeout(1000 * 1000);
|
||||||
|
|
||||||
SrsCommonMessage* msg;
|
__SrsMessage* msg;
|
||||||
SrsBandwidthPacket* pkt;
|
SrsBandwidthPacket* pkt;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(this->protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(this->protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
if (pkt->command_name == SRS_BW_CHECK_STOP_PUBLISH) {
|
if (pkt->command_name == SRS_BW_CHECK_STOP_PUBLISH) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -510,13 +504,14 @@ int SrsBandCheckClient::expect_finished()
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsBandwidthPacket* pkt = NULL;
|
SrsBandwidthPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsBandwidthPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect finished message failed. ret=%d", ret);
|
srs_error("expect finished message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsBandwidthPacket, pkt, false);
|
||||||
srs_info("get bandcheck finished message");
|
srs_info("get bandcheck finished message");
|
||||||
|
|
||||||
if (pkt->command_name == SRS_BW_CHECK_FINISHED) {
|
if (pkt->command_name == SRS_BW_CHECK_FINISHED) {
|
||||||
|
@ -596,12 +591,9 @@ int SrsBandCheckClient::send_stopped_pub()
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage;
|
|
||||||
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
||||||
pkt->command_name = SRS_BW_CHECK_STOPPED_PUBLISH;
|
pkt->command_name = SRS_BW_CHECK_STOPPED_PUBLISH;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = __send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send stopped pub msg failed. ret=%d", ret);
|
srs_error("send stopped pub msg failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -614,12 +606,9 @@ int SrsBandCheckClient::send_final()
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage;
|
|
||||||
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
SrsBandwidthPacket* pkt = new SrsBandwidthPacket;
|
||||||
pkt->command_name = SRS_BW_CHECK_FLASH_FINAL;
|
pkt->command_name = SRS_BW_CHECK_FLASH_FINAL;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = __send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send final msg failed. ret=%d", ret);
|
srs_error("send final msg failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -372,16 +372,6 @@ int SrsRtmpClient::get_send_kbps()
|
||||||
return protocol->get_send_kbps();
|
return protocol->get_send_kbps();
|
||||||
}
|
}
|
||||||
|
|
||||||
int SrsRtmpClient::recv_message(SrsCommonMessage** pmsg)
|
|
||||||
{
|
|
||||||
return protocol->recv_message(pmsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SrsRtmpClient::send_message(ISrsMessage* msg)
|
|
||||||
{
|
|
||||||
return protocol->send_message(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SrsRtmpClient::__recv_message(__SrsMessage** pmsg)
|
int SrsRtmpClient::__recv_message(__SrsMessage** pmsg)
|
||||||
{
|
{
|
||||||
return protocol->__recv_message(pmsg);
|
return protocol->__recv_message(pmsg);
|
||||||
|
@ -462,9 +452,7 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
|
||||||
|
|
||||||
// Connect(vhost, app)
|
// Connect(vhost, app)
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsConnectAppPacket* pkt = new SrsConnectAppPacket();
|
SrsConnectAppPacket* pkt = new SrsConnectAppPacket();
|
||||||
msg->set_packet(pkt, 0);
|
|
||||||
|
|
||||||
pkt->command_object = SrsAmf0Any::object();
|
pkt->command_object = SrsAmf0Any::object();
|
||||||
pkt->command_object->set("app", SrsAmf0Any::str(app.c_str()));
|
pkt->command_object->set("app", SrsAmf0Any::str(app.c_str()));
|
||||||
|
@ -478,32 +466,29 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
|
||||||
pkt->command_object->set("pageUrl", SrsAmf0Any::str());
|
pkt->command_object->set("pageUrl", SrsAmf0Any::str());
|
||||||
pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0));
|
pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0));
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set Window Acknowledgement size(2500000)
|
// Set Window Acknowledgement size(2500000)
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket();
|
SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket();
|
||||||
|
|
||||||
pkt->ackowledgement_window_size = 2500000;
|
pkt->ackowledgement_window_size = 2500000;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// expect connect _result
|
// expect connect _result
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsConnectAppResPacket* pkt = NULL;
|
SrsConnectAppResPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsConnectAppResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsConnectAppResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect connect app response message failed. ret=%d", ret);
|
srs_error("expect connect app response message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsConnectAppResPacket, pkt, false);
|
||||||
srs_info("get connect app response message");
|
srs_info("get connect app response message");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -515,25 +500,22 @@ int SrsRtmpClient::create_stream(int& stream_id)
|
||||||
|
|
||||||
// CreateStream
|
// CreateStream
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket();
|
SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket();
|
||||||
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
msg->set_packet(pkt, 0);
|
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateStream _result.
|
// CreateStream _result.
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsCreateStreamResPacket* pkt = NULL;
|
SrsCreateStreamResPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect create stream response message failed. ret=%d", ret);
|
srs_error("expect create stream response message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsCreateStreamResPacket, pkt, false);
|
||||||
srs_info("get create stream response message");
|
srs_info("get create stream response message");
|
||||||
|
|
||||||
stream_id = (int)pkt->stream_id;
|
stream_id = (int)pkt->stream_id;
|
||||||
|
@ -548,13 +530,9 @@ int SrsRtmpClient::play(string stream, int stream_id)
|
||||||
|
|
||||||
// Play(stream)
|
// Play(stream)
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsPlayPacket* pkt = new SrsPlayPacket();
|
SrsPlayPacket* pkt = new SrsPlayPacket();
|
||||||
|
|
||||||
pkt->stream_name = stream;
|
pkt->stream_name = stream;
|
||||||
msg->set_packet(pkt, stream_id);
|
if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send play stream failed. "
|
srs_error("send play stream failed. "
|
||||||
"stream=%s, stream_id=%d, ret=%d",
|
"stream=%s, stream_id=%d, ret=%d",
|
||||||
stream.c_str(), stream_id, ret);
|
stream.c_str(), stream_id, ret);
|
||||||
|
@ -565,15 +543,13 @@ int SrsRtmpClient::play(string stream, int stream_id)
|
||||||
// SetBufferLength(1000ms)
|
// SetBufferLength(1000ms)
|
||||||
int buffer_length_ms = 1000;
|
int buffer_length_ms = 1000;
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsUserControlPacket* pkt = new SrsUserControlPacket();
|
SrsUserControlPacket* pkt = new SrsUserControlPacket();
|
||||||
|
|
||||||
pkt->event_type = SrcPCUCSetBufferLength;
|
pkt->event_type = SrcPCUCSetBufferLength;
|
||||||
pkt->event_data = stream_id;
|
pkt->event_data = stream_id;
|
||||||
pkt->extra_data = buffer_length_ms;
|
pkt->extra_data = buffer_length_ms;
|
||||||
msg->set_packet(pkt, 0);
|
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
srs_error("send set buffer length failed. "
|
srs_error("send set buffer length failed. "
|
||||||
"stream=%s, stream_id=%d, bufferLength=%d, ret=%d",
|
"stream=%s, stream_id=%d, bufferLength=%d, ret=%d",
|
||||||
stream.c_str(), stream_id, buffer_length_ms, ret);
|
stream.c_str(), stream_id, buffer_length_ms, ret);
|
||||||
|
@ -583,13 +559,9 @@ int SrsRtmpClient::play(string stream, int stream_id)
|
||||||
|
|
||||||
// SetChunkSize
|
// SetChunkSize
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
||||||
|
|
||||||
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send set chunk size failed. "
|
srs_error("send set chunk size failed. "
|
||||||
"stream=%s, chunk_size=%d, ret=%d",
|
"stream=%s, chunk_size=%d, ret=%d",
|
||||||
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
||||||
|
@ -606,13 +578,9 @@ int SrsRtmpClient::publish(string stream, int stream_id)
|
||||||
|
|
||||||
// SetChunkSize
|
// SetChunkSize
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
||||||
|
|
||||||
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send set chunk size failed. "
|
srs_error("send set chunk size failed. "
|
||||||
"stream=%s, chunk_size=%d, ret=%d",
|
"stream=%s, chunk_size=%d, ret=%d",
|
||||||
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
||||||
|
@ -622,13 +590,9 @@ int SrsRtmpClient::publish(string stream, int stream_id)
|
||||||
|
|
||||||
// publish(stream)
|
// publish(stream)
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsPublishPacket* pkt = new SrsPublishPacket();
|
SrsPublishPacket* pkt = new SrsPublishPacket();
|
||||||
|
|
||||||
pkt->stream_name = stream;
|
pkt->stream_name = stream;
|
||||||
msg->set_packet(pkt, stream_id);
|
if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send publish message failed. "
|
srs_error("send publish message failed. "
|
||||||
"stream=%s, stream_id=%d, ret=%d",
|
"stream=%s, stream_id=%d, ret=%d",
|
||||||
stream.c_str(), stream_id, ret);
|
stream.c_str(), stream_id, ret);
|
||||||
|
@ -647,12 +611,8 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
||||||
|
|
||||||
// SrsFMLEStartPacket
|
// SrsFMLEStartPacket
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsFMLEStartPacket* pkt = SrsFMLEStartPacket::create_release_stream(stream);
|
SrsFMLEStartPacket* pkt = SrsFMLEStartPacket::create_release_stream(stream);
|
||||||
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
msg->set_packet(pkt, 0);
|
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send FMLE publish "
|
srs_error("send FMLE publish "
|
||||||
"release stream failed. stream=%s, ret=%d", stream.c_str(), ret);
|
"release stream failed. stream=%s, ret=%d", stream.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -661,12 +621,8 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
||||||
|
|
||||||
// FCPublish
|
// FCPublish
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsFMLEStartPacket* pkt = SrsFMLEStartPacket::create_FC_publish(stream);
|
SrsFMLEStartPacket* pkt = SrsFMLEStartPacket::create_FC_publish(stream);
|
||||||
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
msg->set_packet(pkt, 0);
|
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send FMLE publish "
|
srs_error("send FMLE publish "
|
||||||
"FCPublish failed. stream=%s, ret=%d", stream.c_str(), ret);
|
"FCPublish failed. stream=%s, ret=%d", stream.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -675,13 +631,9 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
||||||
|
|
||||||
// CreateStream
|
// CreateStream
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket();
|
SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket();
|
||||||
|
|
||||||
pkt->transaction_id = 4;
|
pkt->transaction_id = 4;
|
||||||
msg->set_packet(pkt, 0);
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send FMLE publish "
|
srs_error("send FMLE publish "
|
||||||
"createStream failed. stream=%s, ret=%d", stream.c_str(), ret);
|
"createStream failed. stream=%s, ret=%d", stream.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -690,13 +642,14 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
||||||
|
|
||||||
// expect result of CreateStream
|
// expect result of CreateStream
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = NULL;
|
__SrsMessage* msg = NULL;
|
||||||
SrsCreateStreamResPacket* pkt = NULL;
|
SrsCreateStreamResPacket* pkt = NULL;
|
||||||
if ((ret = srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
if ((ret = __srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||||
srs_error("expect create stream response message failed. ret=%d", ret);
|
srs_error("expect create stream response message failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsCreateStreamResPacket, pkt, false);
|
||||||
srs_info("get create stream response message");
|
srs_info("get create stream response message");
|
||||||
|
|
||||||
stream_id = (int)pkt->stream_id;
|
stream_id = (int)pkt->stream_id;
|
||||||
|
@ -704,13 +657,9 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
||||||
|
|
||||||
// publish(stream)
|
// publish(stream)
|
||||||
if (true) {
|
if (true) {
|
||||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
|
||||||
SrsPublishPacket* pkt = new SrsPublishPacket();
|
SrsPublishPacket* pkt = new SrsPublishPacket();
|
||||||
|
|
||||||
pkt->stream_name = stream;
|
pkt->stream_name = stream;
|
||||||
msg->set_packet(pkt, stream_id);
|
if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
|
||||||
|
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send FMLE publish publish failed. "
|
srs_error("send FMLE publish publish failed. "
|
||||||
"stream=%s, stream_id=%d, ret=%d", stream.c_str(), stream_id, ret);
|
"stream=%s, stream_id=%d, ret=%d", stream.c_str(), stream_id, ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -778,16 +727,6 @@ int SrsRtmpServer::get_send_kbps()
|
||||||
return protocol->get_send_kbps();
|
return protocol->get_send_kbps();
|
||||||
}
|
}
|
||||||
|
|
||||||
int SrsRtmpServer::recv_message(SrsCommonMessage** pmsg)
|
|
||||||
{
|
|
||||||
return protocol->recv_message(pmsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SrsRtmpServer::send_message(ISrsMessage* msg)
|
|
||||||
{
|
|
||||||
return protocol->send_message(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SrsRtmpServer::__recv_message(__SrsMessage** pmsg)
|
int SrsRtmpServer::__recv_message(__SrsMessage** pmsg)
|
||||||
{
|
{
|
||||||
return protocol->__recv_message(pmsg);
|
return protocol->__recv_message(pmsg);
|
||||||
|
@ -841,6 +780,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SrsAutoFree(__SrsMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsConnectAppPacket, pkt, false);
|
||||||
srs_info("get connect app message");
|
srs_info("get connect app message");
|
||||||
|
|
||||||
SrsAmf0Any* prop = NULL;
|
SrsAmf0Any* prop = NULL;
|
||||||
|
@ -954,8 +894,7 @@ void SrsRtmpServer::response_connect_reject(SrsRequest *req, const char* desc)
|
||||||
pkt->props->set(StatusDescription, SrsAmf0Any::str(desc));
|
pkt->props->set(StatusDescription, SrsAmf0Any::str(desc));
|
||||||
//pkt->props->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding));
|
//pkt->props->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding));
|
||||||
|
|
||||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("send connect app response rejected message failed. ret=%d", ret);
|
srs_error("send connect app response rejected message failed. ret=%d", ret);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1197,6 +1136,8 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
|
||||||
srs_info("recv FCPublish request message success.");
|
srs_info("recv FCPublish request message success.");
|
||||||
|
|
||||||
SrsAutoFree(__SrsMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsFMLEStartPacket, pkt, false);
|
||||||
|
|
||||||
fc_publish_tid = pkt->transaction_id;
|
fc_publish_tid = pkt->transaction_id;
|
||||||
}
|
}
|
||||||
// FCPublish response
|
// FCPublish response
|
||||||
|
@ -1221,6 +1162,8 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
|
||||||
srs_info("recv createStream request message success.");
|
srs_info("recv createStream request message success.");
|
||||||
|
|
||||||
SrsAutoFree(__SrsMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsCreateStreamPacket, pkt, false);
|
||||||
|
|
||||||
create_stream_tid = pkt->transaction_id;
|
create_stream_tid = pkt->transaction_id;
|
||||||
}
|
}
|
||||||
// createStream response
|
// createStream response
|
||||||
|
@ -1244,6 +1187,7 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
|
||||||
srs_info("recv publish request message success.");
|
srs_info("recv publish request message success.");
|
||||||
|
|
||||||
SrsAutoFree(__SrsMessage, msg, false);
|
SrsAutoFree(__SrsMessage, msg, false);
|
||||||
|
SrsAutoFree(SrsPublishPacket, pkt, false);
|
||||||
}
|
}
|
||||||
// publish response onFCPublish(NetStream.Publish.Start)
|
// publish response onFCPublish(NetStream.Publish.Start)
|
||||||
if (true) {
|
if (true) {
|
||||||
|
|
|
@ -164,8 +164,6 @@ public:
|
||||||
virtual int64_t get_send_bytes();
|
virtual int64_t get_send_bytes();
|
||||||
virtual int get_recv_kbps();
|
virtual int get_recv_kbps();
|
||||||
virtual int get_send_kbps();
|
virtual int get_send_kbps();
|
||||||
virtual int recv_message(SrsCommonMessage** pmsg);
|
|
||||||
virtual int send_message(ISrsMessage* msg);
|
|
||||||
virtual int __recv_message(__SrsMessage** pmsg);
|
virtual int __recv_message(__SrsMessage** pmsg);
|
||||||
virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
|
virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
|
||||||
virtual int __send_and_free_message(__SrsMessage* msg);
|
virtual int __send_and_free_message(__SrsMessage* msg);
|
||||||
|
@ -213,8 +211,6 @@ public:
|
||||||
virtual int64_t get_send_bytes();
|
virtual int64_t get_send_bytes();
|
||||||
virtual int get_recv_kbps();
|
virtual int get_recv_kbps();
|
||||||
virtual int get_send_kbps();
|
virtual int get_send_kbps();
|
||||||
virtual int recv_message(SrsCommonMessage** pmsg);
|
|
||||||
virtual int send_message(ISrsMessage* msg);
|
|
||||||
virtual int __recv_message(__SrsMessage** pmsg);
|
virtual int __recv_message(__SrsMessage** pmsg);
|
||||||
virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
|
virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
|
||||||
virtual int __send_and_free_message(__SrsMessage* msg);
|
virtual int __send_and_free_message(__SrsMessage* msg);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -40,11 +40,8 @@ class ISrsProtocolReaderWriter;
|
||||||
class SrsBuffer;
|
class SrsBuffer;
|
||||||
class SrsPacket;
|
class SrsPacket;
|
||||||
class SrsStream;
|
class SrsStream;
|
||||||
class SrsCommonMessage;
|
|
||||||
class SrsChunkStream;
|
|
||||||
class SrsAmf0Object;
|
class SrsAmf0Object;
|
||||||
class SrsAmf0Any;
|
class SrsAmf0Any;
|
||||||
class ISrsMessage;
|
|
||||||
class SrsMessageHeader;
|
class SrsMessageHeader;
|
||||||
class __SrsMessage;
|
class __SrsMessage;
|
||||||
class __SrsChunkStream;
|
class __SrsChunkStream;
|
||||||
|
@ -112,7 +109,6 @@ private:
|
||||||
std::map<double, std::string> requests;
|
std::map<double, std::string> requests;
|
||||||
// peer in
|
// peer in
|
||||||
private:
|
private:
|
||||||
std::map<int, SrsChunkStream*> chunk_streams;
|
|
||||||
// TODO: FIXME: rename to chunk_streams
|
// TODO: FIXME: rename to chunk_streams
|
||||||
std::map<int, __SrsChunkStream*> __chunk_streams;
|
std::map<int, __SrsChunkStream*> __chunk_streams;
|
||||||
SrsStream* decode_stream;
|
SrsStream* decode_stream;
|
||||||
|
@ -220,58 +216,9 @@ private:
|
||||||
* when message sentout, update the context.
|
* when message sentout, update the context.
|
||||||
*/
|
*/
|
||||||
virtual int __on_send_message(__SrsMessage* msg, SrsPacket* packet);
|
virtual int __on_send_message(__SrsMessage* msg, SrsPacket* packet);
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* recv a message with raw/undecoded payload from peer.
|
|
||||||
* the payload is not decoded, use srs_rtmp_expect_message<T> if requires
|
|
||||||
* specifies message.
|
|
||||||
* @pmsg, user must free it. NULL if not success.
|
|
||||||
* @remark, only when success, user can use and must free the pmsg.
|
|
||||||
*/
|
|
||||||
virtual int recv_message(SrsCommonMessage** pmsg);
|
|
||||||
/**
|
|
||||||
* send out message with encoded payload to peer.
|
|
||||||
* use the message encode method to encode to payload,
|
|
||||||
* then sendout over socket.
|
|
||||||
* @msg this method will free it whatever return value.
|
|
||||||
*/
|
|
||||||
virtual int send_message(ISrsMessage* msg);
|
|
||||||
private:
|
private:
|
||||||
/**
|
|
||||||
* when recv message, update the context.
|
|
||||||
*/
|
|
||||||
virtual int on_recv_message(SrsCommonMessage* msg);
|
|
||||||
virtual int response_acknowledgement_message();
|
virtual int response_acknowledgement_message();
|
||||||
virtual int response_ping_message(int32_t timestamp);
|
virtual int response_ping_message(int32_t timestamp);
|
||||||
/**
|
|
||||||
* when message sentout, update the context.
|
|
||||||
*/
|
|
||||||
virtual int on_send_message(ISrsMessage* msg);
|
|
||||||
/**
|
|
||||||
* try to recv interlaced message from peer,
|
|
||||||
* return error if error occur and nerver set the pmsg,
|
|
||||||
* return success and pmsg set to NULL if no entire message got,
|
|
||||||
* return success and pmsg set to entire message if got one.
|
|
||||||
*/
|
|
||||||
virtual int recv_interlaced_message(SrsCommonMessage** pmsg);
|
|
||||||
/**
|
|
||||||
* read the chunk basic header(fmt, cid) from chunk stream.
|
|
||||||
* user can discovery a SrsChunkStream by cid.
|
|
||||||
* @bh_size return the chunk basic header size, to remove the used bytes when finished.
|
|
||||||
*/
|
|
||||||
virtual int read_basic_header(char& fmt, int& cid, int& bh_size);
|
|
||||||
/**
|
|
||||||
* read the chunk message header(timestamp, payload_length, message_type, stream_id)
|
|
||||||
* from chunk stream and save to SrsChunkStream.
|
|
||||||
* @mh_size return the chunk message header size, to remove the used bytes when finished.
|
|
||||||
*/
|
|
||||||
virtual int read_message_header(SrsChunkStream* chunk, char fmt, int bh_size, int& mh_size);
|
|
||||||
/**
|
|
||||||
* read the chunk payload, remove the used bytes in buffer,
|
|
||||||
* if got entire message, set the pmsg.
|
|
||||||
* @payload_size read size in this roundtrip, generally a chunk size or left message size.
|
|
||||||
*/
|
|
||||||
virtual int read_message_payload(SrsChunkStream* chunk, int bh_size, int mh_size, int& payload_size, SrsCommonMessage** pmsg);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -338,44 +285,6 @@ public:
|
||||||
void initialize_video(int size, u_int32_t time, int stream);
|
void initialize_video(int size, u_int32_t time, int stream);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* incoming chunk stream maybe interlaced,
|
|
||||||
* use the chunk stream to cache the input RTMP chunk streams.
|
|
||||||
*/
|
|
||||||
class SrsChunkStream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* represents the basic header fmt,
|
|
||||||
* which used to identify the variant message header type.
|
|
||||||
*/
|
|
||||||
char fmt;
|
|
||||||
/**
|
|
||||||
* represents the basic header cid,
|
|
||||||
* which is the chunk stream id.
|
|
||||||
*/
|
|
||||||
int cid;
|
|
||||||
/**
|
|
||||||
* cached message header
|
|
||||||
*/
|
|
||||||
SrsMessageHeader header;
|
|
||||||
/**
|
|
||||||
* whether the chunk message header has extended timestamp.
|
|
||||||
*/
|
|
||||||
bool extended_timestamp;
|
|
||||||
/**
|
|
||||||
* partially read message.
|
|
||||||
*/
|
|
||||||
SrsCommonMessage* msg;
|
|
||||||
/**
|
|
||||||
* decoded msg count, to identify whether the chunk stream is fresh.
|
|
||||||
*/
|
|
||||||
int64_t msg_count;
|
|
||||||
public:
|
|
||||||
SrsChunkStream(int _cid);
|
|
||||||
virtual ~SrsChunkStream();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* incoming chunk stream maybe interlaced,
|
* incoming chunk stream maybe interlaced,
|
||||||
* use the chunk stream to cache the input RTMP chunk streams.
|
* use the chunk stream to cache the input RTMP chunk streams.
|
||||||
|
@ -479,156 +388,6 @@ public:
|
||||||
virtual __SrsSharedPtrMessage* copy();
|
virtual __SrsSharedPtrMessage* copy();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* message to output.
|
|
||||||
*/
|
|
||||||
class ISrsMessage
|
|
||||||
{
|
|
||||||
// 4.1. Message Header
|
|
||||||
public:
|
|
||||||
SrsMessageHeader header;
|
|
||||||
// 4.2. Message Payload
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* The other part which is the payload is the actual data that is
|
|
||||||
* contained in the message. For example, it could be some audio samples
|
|
||||||
* or compressed video data. The payload format and interpretation are
|
|
||||||
* beyond the scope of this document.
|
|
||||||
*/
|
|
||||||
int32_t size;
|
|
||||||
int8_t* payload;
|
|
||||||
public:
|
|
||||||
ISrsMessage();
|
|
||||||
virtual ~ISrsMessage();
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* whether message canbe decoded.
|
|
||||||
* only update the context when message canbe decoded.
|
|
||||||
*/
|
|
||||||
virtual bool can_decode() = 0;
|
|
||||||
/**
|
|
||||||
* encode functions.
|
|
||||||
*/
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* get the perfered cid(chunk stream id) which sendout over.
|
|
||||||
*/
|
|
||||||
virtual int get_perfer_cid() = 0;
|
|
||||||
/**
|
|
||||||
* encode the packet to message payload bytes.
|
|
||||||
* @remark there exists empty packet, so maybe the payload is NULL.
|
|
||||||
*/
|
|
||||||
virtual int encode_packet() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* common RTMP message defines in rtmp.part2.Message-Formats.pdf.
|
|
||||||
* cannbe parse and decode.
|
|
||||||
*/
|
|
||||||
class SrsCommonMessage : public ISrsMessage
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
disable_default_copy(SrsCommonMessage);
|
|
||||||
// decoded message payload.
|
|
||||||
private:
|
|
||||||
SrsStream* stream;
|
|
||||||
SrsPacket* packet;
|
|
||||||
public:
|
|
||||||
SrsCommonMessage();
|
|
||||||
virtual ~SrsCommonMessage();
|
|
||||||
public:
|
|
||||||
virtual bool can_decode();
|
|
||||||
/**
|
|
||||||
* decode functions.
|
|
||||||
*/
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* decode packet from message payload.
|
|
||||||
*/
|
|
||||||
// TODO: use protocol to decode it.
|
|
||||||
virtual int decode_packet(SrsProtocol* protocol);
|
|
||||||
/**
|
|
||||||
* whether msg has decoded packet.
|
|
||||||
*/
|
|
||||||
virtual bool has_packet();
|
|
||||||
/**
|
|
||||||
* get the decoded packet which decoded by decode_packet().
|
|
||||||
* @remark, user never free the pkt, the message will auto free it.
|
|
||||||
*/
|
|
||||||
virtual SrsPacket* get_packet();
|
|
||||||
/**
|
|
||||||
* encode functions.
|
|
||||||
*/
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* get the perfered cid(chunk stream id) which sendout over.
|
|
||||||
*/
|
|
||||||
virtual int get_perfer_cid();
|
|
||||||
/**
|
|
||||||
* set the encoded packet to encode_packet() to payload.
|
|
||||||
* @stream_id, the id of stream which is created by createStream.
|
|
||||||
* @remark, user never free the pkt, the message will auto free it.
|
|
||||||
* @return message itself.
|
|
||||||
*/
|
|
||||||
// TODO: refine the send methods.
|
|
||||||
virtual SrsCommonMessage* set_packet(SrsPacket* pkt, int stream_id);
|
|
||||||
/**
|
|
||||||
* encode the packet to message payload bytes.
|
|
||||||
* @remark there exists empty packet, so maybe the payload is NULL.
|
|
||||||
*/
|
|
||||||
virtual int encode_packet();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shared ptr message.
|
|
||||||
* for audio/video/data message that need less memory copy.
|
|
||||||
* and only for output.
|
|
||||||
*/
|
|
||||||
class SrsSharedPtrMessage : public ISrsMessage
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
struct SrsSharedPtr
|
|
||||||
{
|
|
||||||
char* payload;
|
|
||||||
int size;
|
|
||||||
int perfer_cid;
|
|
||||||
int shared_count;
|
|
||||||
|
|
||||||
SrsSharedPtr();
|
|
||||||
virtual ~SrsSharedPtr();
|
|
||||||
};
|
|
||||||
SrsSharedPtr* ptr;
|
|
||||||
public:
|
|
||||||
SrsSharedPtrMessage();
|
|
||||||
virtual ~SrsSharedPtrMessage();
|
|
||||||
public:
|
|
||||||
virtual bool can_decode();
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* set the shared payload.
|
|
||||||
* we will detach the payload of source,
|
|
||||||
* so ensure donot use it before.
|
|
||||||
*/
|
|
||||||
virtual int initialize(SrsCommonMessage* source);
|
|
||||||
/**
|
|
||||||
* set the shared payload.
|
|
||||||
* use source header, and specified param payload.
|
|
||||||
*/
|
|
||||||
virtual int initialize(SrsMessageHeader* source, char* payload, int size);
|
|
||||||
virtual SrsSharedPtrMessage* copy();
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* get the perfered cid(chunk stream id) which sendout over.
|
|
||||||
*/
|
|
||||||
virtual int get_perfer_cid();
|
|
||||||
/**
|
|
||||||
* ignored.
|
|
||||||
* for shared message, nothing should be done.
|
|
||||||
* use initialize() to set the data.
|
|
||||||
*/
|
|
||||||
virtual int encode_packet();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the decoded message payload.
|
* the decoded message payload.
|
||||||
* @remark we seperate the packet from message,
|
* @remark we seperate the packet from message,
|
||||||
|
@ -1374,44 +1133,6 @@ protected:
|
||||||
* if need to set timeout, use set timeout of SrsProtocol.
|
* if need to set timeout, use set timeout of SrsProtocol.
|
||||||
*/
|
*/
|
||||||
template<class T>
|
template<class T>
|
||||||
int srs_rtmp_expect_message(SrsProtocol* protocol, SrsCommonMessage** pmsg, T** ppacket)
|
|
||||||
{
|
|
||||||
*pmsg = NULL;
|
|
||||||
*ppacket = NULL;
|
|
||||||
|
|
||||||
int ret = ERROR_SUCCESS;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
SrsCommonMessage* msg = NULL;
|
|
||||||
if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
|
|
||||||
srs_error("recv message failed. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
srs_verbose("recv message success.");
|
|
||||||
|
|
||||||
if ((ret = msg->decode_packet(protocol)) != ERROR_SUCCESS) {
|
|
||||||
delete msg;
|
|
||||||
srs_error("decode message failed. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* pkt = dynamic_cast<T*>(msg->get_packet());
|
|
||||||
if (!pkt) {
|
|
||||||
delete msg;
|
|
||||||
srs_trace("drop message(type=%d, size=%d, time=%"PRId64", sid=%d).",
|
|
||||||
msg->header.message_type, msg->header.payload_length,
|
|
||||||
msg->header.timestamp, msg->header.stream_id);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
*pmsg = msg;
|
|
||||||
*ppacket = pkt;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
int __srs_rtmp_expect_message(SrsProtocol* protocol, __SrsMessage** pmsg, T** ppacket)
|
int __srs_rtmp_expect_message(SrsProtocol* protocol, __SrsMessage** pmsg, T** ppacket)
|
||||||
{
|
{
|
||||||
*pmsg = NULL;
|
*pmsg = NULL;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue