mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
support ack size.
This commit is contained in:
parent
2e590e18f4
commit
5475d0e435
2 changed files with 79 additions and 10 deletions
|
@ -311,6 +311,12 @@ int SrsProtocol::recv_message(SrsMessage** pmsg)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ret = on_recv_message(msg)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("update context when received msg. ret=%d", ret);
|
||||||
|
delete msg;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
srs_verbose("get a msg with raw/undecoded payload");
|
srs_verbose("get a msg with raw/undecoded payload");
|
||||||
*pmsg = msg;
|
*pmsg = msg;
|
||||||
break;
|
break;
|
||||||
|
@ -431,6 +437,35 @@ int SrsProtocol::send_message(SrsMessage* msg)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SrsProtocol::on_recv_message(SrsMessage* msg)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
srs_assert(msg != NULL);
|
||||||
|
|
||||||
|
switch (msg->header.message_type) {
|
||||||
|
case RTMP_MSG_WindowAcknowledgementSize:
|
||||||
|
if ((ret = msg->decode_packet()) != ERROR_SUCCESS) {
|
||||||
|
srs_error("decode packet from message payload failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
srs_verbose("decode packet from message payload success.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (msg->header.message_type) {
|
||||||
|
case RTMP_MSG_WindowAcknowledgementSize: {
|
||||||
|
SrsSetWindowAckSizePacket* pkt = dynamic_cast<SrsSetWindowAckSizePacket*>(msg->get_packet());
|
||||||
|
srs_assert(pkt != NULL);
|
||||||
|
// TODO: take effect.
|
||||||
|
srs_trace("set ack window size to %d", pkt->ackowledgement_window_size);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int SrsProtocol::recv_interlaced_message(SrsMessage** pmsg)
|
int SrsProtocol::recv_interlaced_message(SrsMessage** pmsg)
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
@ -816,22 +851,30 @@ int SrsMessage::decode_packet()
|
||||||
srs_assert(payload != NULL);
|
srs_assert(payload != NULL);
|
||||||
srs_assert(size > 0);
|
srs_assert(size > 0);
|
||||||
|
|
||||||
|
if (packet) {
|
||||||
|
srs_verbose("msg already decoded");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (!stream) {
|
if (!stream) {
|
||||||
srs_verbose("create decode stream for message.");
|
srs_verbose("create decode stream for message.");
|
||||||
stream = new SrsStream();
|
stream = new SrsStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.message_type == RTMP_MSG_AMF0CommandMessage) {
|
// initialize the decode stream for all message,
|
||||||
srs_verbose("start to decode AMF0 command message.");
|
// it's ok for the initialize if fast and without memory copy.
|
||||||
|
|
||||||
// amf0 command message.
|
|
||||||
// need to read the command name.
|
|
||||||
if ((ret = stream->initialize((char*)payload, size)) != ERROR_SUCCESS) {
|
if ((ret = stream->initialize((char*)payload, size)) != ERROR_SUCCESS) {
|
||||||
srs_error("initialize stream failed. ret=%d", ret);
|
srs_error("initialize stream failed. ret=%d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
srs_verbose("decode stream initialized success");
|
srs_verbose("decode stream initialized success");
|
||||||
|
|
||||||
|
// decode specified packet type
|
||||||
|
if (header.message_type == RTMP_MSG_AMF0CommandMessage) {
|
||||||
|
srs_verbose("start to decode AMF0 command message.");
|
||||||
|
|
||||||
|
// amf0 command message.
|
||||||
|
// need to read the command name.
|
||||||
std::string command;
|
std::string command;
|
||||||
if ((ret = srs_amf0_read_string(stream, command)) != ERROR_SUCCESS) {
|
if ((ret = srs_amf0_read_string(stream, command)) != ERROR_SUCCESS) {
|
||||||
srs_error("decode AMF0 command name failed. ret=%d", ret);
|
srs_error("decode AMF0 command name failed. ret=%d", ret);
|
||||||
|
@ -850,11 +893,15 @@ int SrsMessage::decode_packet()
|
||||||
srs_trace("drop the AMF0 command message, command_name=%s", command.c_str());
|
srs_trace("drop the AMF0 command message, command_name=%s", command.c_str());
|
||||||
packet = new SrsPacket();
|
packet = new SrsPacket();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
} else if(header.message_type == RTMP_MSG_WindowAcknowledgementSize) {
|
||||||
|
srs_verbose("start to decode set ack window size message.");
|
||||||
|
packet = new SrsSetWindowAckSizePacket();
|
||||||
|
return packet->decode(stream);
|
||||||
|
} else {
|
||||||
// default packet to drop message.
|
// default packet to drop message.
|
||||||
srs_trace("drop the unknown message, type=%d", header.message_type);
|
srs_trace("drop the unknown message, type=%d", header.message_type);
|
||||||
packet = new SrsPacket();
|
packet = new SrsPacket();
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1137,6 +1184,22 @@ SrsSetWindowAckSizePacket::~SrsSetWindowAckSizePacket()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SrsSetWindowAckSizePacket::decode(SrsStream* stream)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if (!stream->require(4)) {
|
||||||
|
ret = ERROR_RTMP_MESSAGE_DECODE;
|
||||||
|
srs_error("decode ack window size failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ackowledgement_window_size = stream->read_4bytes();
|
||||||
|
srs_info("decode ack window size success");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int SrsSetWindowAckSizePacket::get_perfer_cid()
|
int SrsSetWindowAckSizePacket::get_perfer_cid()
|
||||||
{
|
{
|
||||||
return RTMP_CID_ProtocolControl;
|
return RTMP_CID_ProtocolControl;
|
||||||
|
|
|
@ -107,6 +107,10 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual int send_message(SrsMessage* msg);
|
virtual int send_message(SrsMessage* msg);
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* when recv message, update the context.
|
||||||
|
*/
|
||||||
|
virtual int on_recv_message(SrsMessage* msg);
|
||||||
/**
|
/**
|
||||||
* try to recv interlaced message from peer,
|
* try to recv interlaced message from peer,
|
||||||
* return error if error occur and nerver set the pmsg,
|
* return error if error occur and nerver set the pmsg,
|
||||||
|
@ -372,6 +376,8 @@ public:
|
||||||
public:
|
public:
|
||||||
SrsSetWindowAckSizePacket();
|
SrsSetWindowAckSizePacket();
|
||||||
virtual ~SrsSetWindowAckSizePacket();
|
virtual ~SrsSetWindowAckSizePacket();
|
||||||
|
public:
|
||||||
|
virtual int decode(SrsStream* stream);
|
||||||
public:
|
public:
|
||||||
virtual int get_perfer_cid();
|
virtual int get_perfer_cid();
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue