diff --git a/trunk/src/core/srs_core_amf0.cpp b/trunk/src/core/srs_core_amf0.cpp index d5ed5ff82..f17de3ddc 100755 --- a/trunk/src/core/srs_core_amf0.cpp +++ b/trunk/src/core/srs_core_amf0.cpp @@ -225,7 +225,7 @@ int srs_amf0_read_string(SrsStream* stream, std::string& value) return ret; } - char marker = stream->read_char(); + char marker = stream->read_1bytes(); if (marker != RTMP_AMF0_String) { ret = ERROR_RTMP_AMF0_DECODE; srs_error("amf0 check string marker failed. " @@ -248,7 +248,7 @@ int srs_amf0_read_boolean(SrsStream* stream, bool& value) return ret; } - char marker = stream->read_char(); + char marker = stream->read_1bytes(); if (marker != RTMP_AMF0_Boolean) { ret = ERROR_RTMP_AMF0_DECODE; srs_error("amf0 check bool marker failed. " @@ -264,7 +264,7 @@ int srs_amf0_read_boolean(SrsStream* stream, bool& value) return ret; } - if (stream->read_char() == 0) { + if (stream->read_1bytes() == 0) { value = false; } else { value = true; @@ -286,7 +286,7 @@ int srs_amf0_read_number(SrsStream* stream, double& value) return ret; } - char marker = stream->read_char(); + char marker = stream->read_1bytes(); if (marker != RTMP_AMF0_Number) { ret = ERROR_RTMP_AMF0_DECODE; srs_error("amf0 check number marker failed. " @@ -321,7 +321,7 @@ int srs_amf0_read_any(SrsStream* stream, SrsAmf0Any*& value) return ret; } - char marker = stream->read_char(); + char marker = stream->read_1bytes(); srs_verbose("amf0 any marker success"); // backward the 1byte marker. @@ -393,7 +393,7 @@ int srs_amf0_read_object_eof(SrsStream* stream, SrsAmf0ObjectEOF*& value) return ret; } - char marker = stream->read_char(); + char marker = stream->read_1bytes(); if (marker != RTMP_AMF0_ObjectEnd) { ret = ERROR_RTMP_AMF0_DECODE; srs_error("amf0 check object eof marker failed. " @@ -420,7 +420,7 @@ int srs_amf0_read_object(SrsStream* stream, SrsAmf0Object*& value) return ret; } - char marker = stream->read_char(); + char marker = stream->read_1bytes(); if (marker != RTMP_AMF0_Object) { ret = ERROR_RTMP_AMF0_DECODE; srs_error("amf0 check object marker failed. " diff --git a/trunk/src/core/srs_core_client.cpp b/trunk/src/core/srs_core_client.cpp index f18fb23e9..327286f8b 100755 --- a/trunk/src/core/srs_core_client.cpp +++ b/trunk/src/core/srs_core_client.cpp @@ -86,6 +86,12 @@ int SrsClient::do_cycle() return ret; } srs_verbose("set window acknowledgement size success"); + + if ((ret = rtmp->set_peer_bandwidth(2.5 * 1000 * 1000, 2)) != ERROR_SUCCESS) { + srs_error("set peer bandwidth failed. ret=%d", ret); + return ret; + } + srs_verbose("set peer bandwidth success"); return ret; } diff --git a/trunk/src/core/srs_core_protocol.cpp b/trunk/src/core/srs_core_protocol.cpp index 48c592654..5b6437cd3 100755 --- a/trunk/src/core/srs_core_protocol.cpp +++ b/trunk/src/core/srs_core_protocol.cpp @@ -923,9 +923,16 @@ SrsPacket::~SrsPacket() { } -int SrsPacket::decode(SrsStream* /*stream*/) +int SrsPacket::decode(SrsStream* stream) { int ret = ERROR_SUCCESS; + + srs_assert(stream != NULL); + + ret = ERROR_SYSTEM_PACKET_INVALID; + srs_error("current packet is not support to decode. " + "paket=%s, ret=%d", get_class_name(), ret); + return ret; } @@ -988,7 +995,7 @@ int SrsPacket::encode_packet(SrsStream* stream) srs_assert(stream != NULL); ret = ERROR_SYSTEM_PACKET_INVALID; - srs_error("current packet is not support to sendout. " + srs_error("current packet is not support to encode. " "paket=%s, ret=%d", get_class_name(), ret); return ret; @@ -1008,10 +1015,6 @@ SrsConnectAppPacket::~SrsConnectAppPacket() int SrsConnectAppPacket::decode(SrsStream* stream) { int ret = ERROR_SUCCESS; - - if ((ret = super::decode(stream)) != ERROR_SUCCESS) { - return ret; - } if ((ret = srs_amf0_read_string(stream, command_name)) != ERROR_SUCCESS) { srs_error("amf0 decode connect command_name failed. ret=%d", ret); @@ -1059,26 +1062,6 @@ SrsSetWindowAckSizePacket::~SrsSetWindowAckSizePacket() { } -int SrsSetWindowAckSizePacket::decode(SrsStream* stream) -{ - int ret = ERROR_SUCCESS; - - if ((ret = super::decode(stream)) != ERROR_SUCCESS) { - return ret; - } - - if (!stream->require(4)) { - ret = ERROR_RTMP_MESSAGE_DECODE; - srs_error("set window ack size failed. ret=%d", ret); - return ret; - } - - ackowledgement_window_size = stream->read_4bytes(); - srs_info("decode window ack size success. ack_size=%d", ackowledgement_window_size); - - return ret; -} - int SrsSetWindowAckSizePacket::get_perfer_cid() { return RTMP_CID_ProtocolControl; @@ -1112,3 +1095,47 @@ int SrsSetWindowAckSizePacket::encode_packet(SrsStream* stream) return ret; } +SrsSetPeerBandwidthPacket::SrsSetPeerBandwidthPacket() +{ + bandwidth = 0; + type = 2; +} + +SrsSetPeerBandwidthPacket::~SrsSetPeerBandwidthPacket() +{ +} + +int SrsSetPeerBandwidthPacket::get_perfer_cid() +{ + return RTMP_CID_ProtocolControl; +} + +int SrsSetPeerBandwidthPacket::get_message_type() +{ + return RTMP_MSG_SetPeerBandwidth; +} + +int SrsSetPeerBandwidthPacket::get_size() +{ + return 5; +} + +int SrsSetPeerBandwidthPacket::encode_packet(SrsStream* stream) +{ + int ret = ERROR_SUCCESS; + + if (!stream->require(5)) { + ret = ERROR_RTMP_MESSAGE_ENCODE; + srs_error("encode set bandwidth packet failed. ret=%d", ret); + return ret; + } + + stream->write_4bytes(bandwidth); + stream->write_1bytes(type); + + srs_verbose("encode set bandwidth packet " + "success. bandwidth=%d, type=%d", bandwidth, type); + + return ret; +} + diff --git a/trunk/src/core/srs_core_protocol.hpp b/trunk/src/core/srs_core_protocol.hpp index 20c4367ad..db9378549 100755 --- a/trunk/src/core/srs_core_protocol.hpp +++ b/trunk/src/core/srs_core_protocol.hpp @@ -256,10 +256,22 @@ public: */ class SrsPacket { +protected: + /** + * subpacket must override to provide the right class name. + */ + virtual const char* get_class_name() + { + return CLASS_NAME_STRING(SrsPacket); + } public: SrsPacket(); virtual ~SrsPacket(); public: + /** + * subpacket must override to decode packet from stream. + * @remark never invoke the super.decode, it always failed. + */ virtual int decode(SrsStream* stream); public: virtual int get_perfer_cid(); @@ -283,16 +295,9 @@ protected: virtual int get_size(); /** * subpacket can override to encode the payload to stream. + * @remark never invoke the super.encode_packet, it always failed. */ 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); - } }; /** @@ -304,6 +309,11 @@ class SrsConnectAppPacket : public SrsPacket { private: typedef SrsPacket super; +protected: + virtual const char* get_class_name() + { + return CLASS_NAME_STRING(SrsConnectAppPacket); + } public: std::string command_name; double transaction_id; @@ -313,11 +323,6 @@ public: virtual ~SrsConnectAppPacket(); public: virtual int decode(SrsStream* stream); -protected: - virtual const char* get_class_name() - { - return CLASS_NAME_STRING(SrsConnectAppPacket); - } }; /** @@ -329,13 +334,16 @@ class SrsSetWindowAckSizePacket : public SrsPacket { private: typedef SrsPacket super; +protected: + virtual const char* get_class_name() + { + return CLASS_NAME_STRING(SrsSetWindowAckSizePacket); + } public: int32_t ackowledgement_window_size; public: SrsSetWindowAckSizePacket(); virtual ~SrsSetWindowAckSizePacket(); -public: - virtual int decode(SrsStream* stream); public: virtual int get_perfer_cid(); public: @@ -343,11 +351,35 @@ public: protected: virtual int get_size(); virtual int encode_packet(SrsStream* stream); +}; + +/** +* 5.6. Set Peer Bandwidth (6) +* The client or the server sends this message to update the output +* bandwidth of the peer. +*/ +class SrsSetPeerBandwidthPacket : public SrsPacket +{ +private: + typedef SrsPacket super; protected: virtual const char* get_class_name() { - return CLASS_NAME_STRING(SrsSetWindowAckSizePacket); + return CLASS_NAME_STRING(SrsSetPeerBandwidthPacket); } +public: + int32_t bandwidth; + int8_t type; +public: + SrsSetPeerBandwidthPacket(); + virtual ~SrsSetPeerBandwidthPacket(); +public: + virtual int get_perfer_cid(); +public: + virtual int get_message_type(); +protected: + virtual int get_size(); + virtual int encode_packet(SrsStream* stream); }; /** diff --git a/trunk/src/core/srs_core_rtmp.cpp b/trunk/src/core/srs_core_rtmp.cpp index f9388696c..65226ddac 100755 --- a/trunk/src/core/srs_core_rtmp.cpp +++ b/trunk/src/core/srs_core_rtmp.cpp @@ -184,3 +184,24 @@ int SrsRtmp::set_window_ack_size(int ack_size) return ret; } +int SrsRtmp::set_peer_bandwidth(int bandwidth, int type) +{ + int ret = ERROR_SUCCESS; + + SrsMessage* msg = new SrsMessage(); + SrsSetPeerBandwidthPacket* pkt = new SrsSetPeerBandwidthPacket(); + + pkt->bandwidth = bandwidth; + pkt->type = type; + msg->set_packet(pkt); + + if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { + srs_error("send set bandwidth message failed. ret=%d", ret); + return ret; + } + srs_info("send set bandwidth message " + "success. bandwidth=%d, type=%d", bandwidth, type); + + return ret; +} + diff --git a/trunk/src/core/srs_core_rtmp.hpp b/trunk/src/core/srs_core_rtmp.hpp index bd9a2472c..846aedbca 100755 --- a/trunk/src/core/srs_core_rtmp.hpp +++ b/trunk/src/core/srs_core_rtmp.hpp @@ -74,6 +74,11 @@ public: virtual int handshake(); virtual int connect_app(SrsRequest* req); virtual int set_window_ack_size(int ack_size); + /** + * @type: The sender can mark this message hard (0), soft (1), or dynamic (2) + * using the Limit type field. + */ + virtual int set_peer_bandwidth(int bandwidth, int type); }; #endif \ No newline at end of file diff --git a/trunk/src/core/srs_core_stream.cpp b/trunk/src/core/srs_core_stream.cpp index 3ea887638..76847f3d7 100755 --- a/trunk/src/core/srs_core_stream.cpp +++ b/trunk/src/core/srs_core_stream.cpp @@ -78,11 +78,11 @@ void SrsStream::skip(int size) p += size; } -char SrsStream::read_char() +int8_t SrsStream::read_1bytes() { srs_assert(require(1)); - return *p++; + return (int8_t)*p++; } int16_t SrsStream::read_2bytes() @@ -152,3 +152,10 @@ void SrsStream::write_4bytes(int32_t value) *p++ = pp[0]; } +void SrsStream::write_1bytes(int8_t value) +{ + srs_assert(require(1)); + + *p++ = value; +} + diff --git a/trunk/src/core/srs_core_stream.hpp b/trunk/src/core/srs_core_stream.hpp index 13ee31b55..094f6d230 100755 --- a/trunk/src/core/srs_core_stream.hpp +++ b/trunk/src/core/srs_core_stream.hpp @@ -74,7 +74,7 @@ public: /** * get 1bytes char from stream. */ - virtual char read_char(); + virtual int8_t read_1bytes(); /** * get 2bytes int from stream. */ @@ -96,6 +96,10 @@ public: * write 4bytes int to stream. */ virtual void write_4bytes(int32_t value); + /** + * write 1bytes char to stream. + */ + virtual void write_1bytes(int8_t value); }; #endif \ No newline at end of file diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 5a1954077..2cad78ff5 100755 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -34,7 +34,7 @@ int main(int /*argc*/, char** /*argv*/){ return ret; } - if ((ret = server.listen(19350)) != ERROR_SUCCESS) { + if ((ret = server.listen(1935)) != ERROR_SUCCESS) { return ret; }