1
0
Fork 0
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:
winlin 2013-10-20 22:22:55 +08:00
parent 2e590e18f4
commit 5475d0e435
2 changed files with 79 additions and 10 deletions

View file

@ -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();
} }
// initialize the decode stream for all message,
// it's ok for the initialize if fast and without memory copy.
if ((ret = stream->initialize((char*)payload, size)) != ERROR_SUCCESS) {
srs_error("initialize stream failed. ret=%d", ret);
return ret;
}
srs_verbose("decode stream initialized success");
// decode specified packet type
if (header.message_type == RTMP_MSG_AMF0CommandMessage) { if (header.message_type == RTMP_MSG_AMF0CommandMessage) {
srs_verbose("start to decode AMF0 command message."); srs_verbose("start to decode AMF0 command message.");
// amf0 command message. // amf0 command message.
// need to read the command name. // need to read the command name.
if ((ret = stream->initialize((char*)payload, size)) != ERROR_SUCCESS) {
srs_error("initialize stream failed. ret=%d", ret);
return ret;
}
srs_verbose("decode stream initialized success");
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,12 +893,16 @@ 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.
srs_trace("drop the unknown message, type=%d", header.message_type);
packet = new SrsPacket();
} }
// default packet to drop message.
srs_trace("drop the unknown message, type=%d", header.message_type);
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;

View file

@ -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: