mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
support set ack window size.
This commit is contained in:
parent
1047e06bf3
commit
2abfcee10f
5 changed files with 169 additions and 3 deletions
|
@ -57,7 +57,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#define ERROR_RTMP_REQ_CONNECT 305
|
#define ERROR_RTMP_REQ_CONNECT 305
|
||||||
#define ERROR_RTMP_REQ_TCURL 306
|
#define ERROR_RTMP_REQ_TCURL 306
|
||||||
#define ERROR_RTMP_MESSAGE_DECODE 307
|
#define ERROR_RTMP_MESSAGE_DECODE 307
|
||||||
|
#define ERROR_RTMP_MESSAGE_ENCODE 308
|
||||||
|
|
||||||
#define ERROR_SYSTEM_STREAM_INIT 400
|
#define ERROR_SYSTEM_STREAM_INIT 400
|
||||||
|
#define ERROR_SYSTEM_PACKET_INVALID 401
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -884,12 +884,17 @@ int SrsMessage::get_perfer_cid()
|
||||||
return packet->get_perfer_cid();
|
return packet->get_perfer_cid();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsMessage::set_packet(SrsPacket* pkt)
|
void SrsMessage::set_packet(SrsPacket* pkt, int stream_id)
|
||||||
{
|
{
|
||||||
if (packet) {
|
if (packet) {
|
||||||
delete packet;
|
delete packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
packet = pkt;
|
packet = pkt;
|
||||||
|
|
||||||
|
header.message_type = packet->get_message_type();
|
||||||
|
header.payload_length = packet->get_payload_length();
|
||||||
|
header.stream_id = stream_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SrsMessage::encode_packet()
|
int SrsMessage::encode_packet()
|
||||||
|
@ -900,8 +905,14 @@ int SrsMessage::encode_packet()
|
||||||
srs_warn("packet is empty, send out empty message.");
|
srs_warn("packet is empty, send out empty message.");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
// realloc the payload.
|
||||||
|
size = 0;
|
||||||
|
if (payload) {
|
||||||
|
delete[] payload;
|
||||||
|
payload = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return packet->encode(size, (char*&)payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsPacket::SrsPacket()
|
SrsPacket::SrsPacket()
|
||||||
|
@ -923,6 +934,66 @@ int SrsPacket::get_perfer_cid()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SrsPacket::get_message_type()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsPacket::get_payload_length()
|
||||||
|
{
|
||||||
|
return get_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsPacket::encode(int& psize, char*& ppayload)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
int size = get_size();
|
||||||
|
char* payload = NULL;
|
||||||
|
|
||||||
|
SrsStream stream;
|
||||||
|
|
||||||
|
if (size > 0) {
|
||||||
|
payload = new char[size];
|
||||||
|
|
||||||
|
if ((ret = stream.initialize(payload, size)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("initialize the stream failed. ret=%d", ret);
|
||||||
|
delete[] payload;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ret = encode_packet(&stream)) != ERROR_SUCCESS) {
|
||||||
|
srs_error("encode the packet failed. ret=%d", ret);
|
||||||
|
delete[] payload;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
psize = size;
|
||||||
|
ppayload = payload;
|
||||||
|
srs_verbose("encode the packet success. size=%d", size);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsPacket::get_size()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsPacket::encode_packet(SrsStream* stream)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
srs_assert(stream != NULL);
|
||||||
|
|
||||||
|
ret = ERROR_SYSTEM_PACKET_INVALID;
|
||||||
|
srs_error("current packet is not support to sendout. "
|
||||||
|
"paket=%s, ret=%d", get_class_name(), ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
SrsConnectAppPacket::SrsConnectAppPacket()
|
SrsConnectAppPacket::SrsConnectAppPacket()
|
||||||
{
|
{
|
||||||
command_name = RTMP_AMF0_COMMAND_CONNECT;
|
command_name = RTMP_AMF0_COMMAND_CONNECT;
|
||||||
|
@ -1013,3 +1084,31 @@ int SrsSetWindowAckSizePacket::get_perfer_cid()
|
||||||
return RTMP_CID_ProtocolControl;
|
return RTMP_CID_ProtocolControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SrsSetWindowAckSizePacket::get_message_type()
|
||||||
|
{
|
||||||
|
return RTMP_MSG_WindowAcknowledgementSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsSetWindowAckSizePacket::get_size()
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsSetWindowAckSizePacket::encode_packet(SrsStream* stream)
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if (!stream->require(4)) {
|
||||||
|
ret = ERROR_RTMP_MESSAGE_ENCODE;
|
||||||
|
srs_error("encode ack size packet failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream->write_4bytes(ackowledgement_window_size);
|
||||||
|
|
||||||
|
srs_verbose("encode ack size packet "
|
||||||
|
"success. ack_size=%d", ackowledgement_window_size);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,9 @@ class SrsMessage;
|
||||||
class SrsChunkStream;
|
class SrsChunkStream;
|
||||||
class SrsAmf0Object;
|
class SrsAmf0Object;
|
||||||
|
|
||||||
|
// convert class name to string.
|
||||||
|
#define CLASS_NAME_STRING(className) #className
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* max rtmp header size:
|
* max rtmp header size:
|
||||||
* 1bytes basic header,
|
* 1bytes basic header,
|
||||||
|
@ -237,9 +240,10 @@ public:
|
||||||
virtual int get_perfer_cid();
|
virtual int get_perfer_cid();
|
||||||
/**
|
/**
|
||||||
* set the encoded packet to encode_packet() to payload.
|
* 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.
|
* @remark, user never free the pkt, the message will auto free it.
|
||||||
*/
|
*/
|
||||||
virtual void set_packet(SrsPacket* pkt);
|
virtual void set_packet(SrsPacket* pkt, int stream_id = 0);
|
||||||
/**
|
/**
|
||||||
* encode the packet to message payload bytes.
|
* encode the packet to message payload bytes.
|
||||||
* @remark there exists empty packet, so maybe the payload is NULL.
|
* @remark there exists empty packet, so maybe the payload is NULL.
|
||||||
|
@ -259,6 +263,36 @@ public:
|
||||||
virtual int decode(SrsStream* stream);
|
virtual int decode(SrsStream* stream);
|
||||||
public:
|
public:
|
||||||
virtual int get_perfer_cid();
|
virtual int get_perfer_cid();
|
||||||
|
virtual int get_payload_length();
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* subpacket must override to provide the right message type.
|
||||||
|
*/
|
||||||
|
virtual int get_message_type();
|
||||||
|
/**
|
||||||
|
* the subpacket can override this encode,
|
||||||
|
* for example, video and audio will directly set the payload withou memory copy,
|
||||||
|
* other packet which need to serialize/encode to bytes by override the
|
||||||
|
* get_size and encode_packet.
|
||||||
|
*/
|
||||||
|
virtual int encode(int& size, char*& payload);
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* subpacket can override to calc the packet size.
|
||||||
|
*/
|
||||||
|
virtual int get_size();
|
||||||
|
/**
|
||||||
|
* subpacket can override to encode the payload to stream.
|
||||||
|
*/
|
||||||
|
virtual int encode_packet(SrsStream* stream);
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* subpacket must override to provide the right class name.
|
||||||
|
*/
|
||||||
|
virtual const char* get_class_name()
|
||||||
|
{
|
||||||
|
return CLASS_NAME_STRING(SrsPacket);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -279,6 +313,11 @@ public:
|
||||||
virtual ~SrsConnectAppPacket();
|
virtual ~SrsConnectAppPacket();
|
||||||
public:
|
public:
|
||||||
virtual int decode(SrsStream* stream);
|
virtual int decode(SrsStream* stream);
|
||||||
|
protected:
|
||||||
|
virtual const char* get_class_name()
|
||||||
|
{
|
||||||
|
return CLASS_NAME_STRING(SrsConnectAppPacket);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -299,6 +338,16 @@ public:
|
||||||
virtual int decode(SrsStream* stream);
|
virtual int decode(SrsStream* stream);
|
||||||
public:
|
public:
|
||||||
virtual int get_perfer_cid();
|
virtual int get_perfer_cid();
|
||||||
|
public:
|
||||||
|
virtual int get_message_type();
|
||||||
|
protected:
|
||||||
|
virtual int get_size();
|
||||||
|
virtual int encode_packet(SrsStream* stream);
|
||||||
|
protected:
|
||||||
|
virtual const char* get_class_name()
|
||||||
|
{
|
||||||
|
return CLASS_NAME_STRING(SrsSetWindowAckSizePacket);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -141,3 +141,14 @@ std::string SrsStream::read_string(int len)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SrsStream::write_4bytes(int32_t value)
|
||||||
|
{
|
||||||
|
srs_assert(require(4));
|
||||||
|
|
||||||
|
pp = (char*)&value;
|
||||||
|
*p++ = pp[3];
|
||||||
|
*p++ = pp[2];
|
||||||
|
*p++ = pp[1];
|
||||||
|
*p++ = pp[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,11 @@ public:
|
||||||
* get string from stream, length specifies by param len.
|
* get string from stream, length specifies by param len.
|
||||||
*/
|
*/
|
||||||
virtual std::string read_string(int len);
|
virtual std::string read_string(int len);
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* write 4bytes int to stream.
|
||||||
|
*/
|
||||||
|
virtual void write_4bytes(int32_t value);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Add table
Add a link
Reference in a new issue