winlin

for #730, reset ack follow flash player rules. 2.0.225

@@ -345,6 +345,7 @@ Remark: @@ -345,6 +345,7 @@ Remark:
345 345
346 ## History 346 ## History
347 347
  348 +* v2.0, 2017-01-06, for #730, reset ack follow flash player rules. 2.0.225
348 * v2.0, 2016-12-15, for #513, remove hls ram from srs2 to srs3+. 2.0.224 349 * v2.0, 2016-12-15, for #513, remove hls ram from srs2 to srs3+. 2.0.224
349 * <strong>v2.0, 2016-12-13, [2.0 beta3(2.0.223)][r2.0b3] released. 86685 lines.</strong> 350 * <strong>v2.0, 2016-12-13, [2.0 beta3(2.0.223)][r2.0b3] released. 86685 lines.</strong>
350 * v2.0, 2016-12-13, fix #713, disable the source cleanup. 2.0.223 351 * v2.0, 2016-12-13, fix #713, disable the source cleanup. 2.0.223
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR 2 32 #define VERSION_MAJOR 2
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 224 34 +#define VERSION_REVISION 225
35 35
36 // generated by configure, only macros. 36 // generated by configure, only macros.
37 #include <srs_auto_headers.hpp> 37 #include <srs_auto_headers.hpp>
@@ -210,8 +210,8 @@ int SrsPacket::encode_packet(SrsStream* stream) @@ -210,8 +210,8 @@ int SrsPacket::encode_packet(SrsStream* stream)
210 210
211 SrsProtocol::AckWindowSize::AckWindowSize() 211 SrsProtocol::AckWindowSize::AckWindowSize()
212 { 212 {
213 - ack_window_size = 0;  
214 - acked_size = 0; 213 + window = 0;
  214 + sequence_number = nb_recv_bytes = 0;
215 } 215 }
216 216
217 SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io) 217 SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io)
@@ -1457,13 +1457,9 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg) @@ -1457,13 +1457,9 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg)
1457 1457
1458 srs_assert(msg != NULL); 1458 srs_assert(msg != NULL);
1459 1459
1460 - // acknowledgement  
1461 - if (in_ack_size.ack_window_size > 0  
1462 - && skt->get_recv_bytes() - in_ack_size.acked_size > in_ack_size.ack_window_size  
1463 - ) {  
1464 - if ((ret = response_acknowledgement_message()) != ERROR_SUCCESS) {  
1465 - return ret;  
1466 - } 1460 + // try to response acknowledgement
  1461 + if ((ret = response_acknowledgement_message()) != ERROR_SUCCESS) {
  1462 + return ret;
1467 } 1463 }
1468 1464
1469 SrsPacket* packet = NULL; 1465 SrsPacket* packet = NULL;
@@ -1492,7 +1488,7 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg) @@ -1492,7 +1488,7 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg)
1492 srs_assert(pkt != NULL); 1488 srs_assert(pkt != NULL);
1493 1489
1494 if (pkt->ackowledgement_window_size > 0) { 1490 if (pkt->ackowledgement_window_size > 0) {
1495 - in_ack_size.ack_window_size = pkt->ackowledgement_window_size; 1491 + in_ack_size.window = (uint32_t)pkt->ackowledgement_window_size;
1496 // @remark, we ignore this message, for user noneed to care. 1492 // @remark, we ignore this message, for user noneed to care.
1497 // but it's important for dev, for client/server will block if required 1493 // but it's important for dev, for client/server will block if required
1498 // ack msg not arrived. 1494 // ack msg not arrived.
@@ -1526,7 +1522,7 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg) @@ -1526,7 +1522,7 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg)
1526 } 1522 }
1527 1523
1528 in_chunk_size = pkt->chunk_size; 1524 in_chunk_size = pkt->chunk_size;
1529 - srs_trace("input chunk size to %d", pkt->chunk_size); 1525 + srs_info("in.chunk=%d", pkt->chunk_size);
1530 1526
1531 break; 1527 break;
1532 } 1528 }
@@ -1535,7 +1531,8 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg) @@ -1535,7 +1531,8 @@ int SrsProtocol::on_recv_message(SrsCommonMessage* msg)
1535 srs_assert(pkt != NULL); 1531 srs_assert(pkt != NULL);
1536 1532
1537 if (pkt->event_type == SrcPCUCSetBufferLength) { 1533 if (pkt->event_type == SrcPCUCSetBufferLength) {
1538 - srs_trace("ignored. set buffer length to %d", pkt->extra_data); 1534 + srs_trace("buffer=%d, in.ack=%d, out.ack=%d, in.chunk=%d, out.chunk=%d", pkt->extra_data,
  1535 + in_ack_size.window, out_ack_size.window, in_chunk_size, out_chunk_size);
1539 } 1536 }
1540 if (pkt->event_type == SrcPCUCPingRequest) { 1537 if (pkt->event_type == SrcPCUCPingRequest) {
1541 if ((ret = response_ping_message(pkt->event_data)) != ERROR_SUCCESS) { 1538 if ((ret = response_ping_message(pkt->event_data)) != ERROR_SUCCESS) {
@@ -1563,11 +1560,13 @@ int SrsProtocol::on_send_packet(SrsMessageHeader* mh, SrsPacket* packet) @@ -1563,11 +1560,13 @@ int SrsProtocol::on_send_packet(SrsMessageHeader* mh, SrsPacket* packet)
1563 switch (mh->message_type) { 1560 switch (mh->message_type) {
1564 case RTMP_MSG_SetChunkSize: { 1561 case RTMP_MSG_SetChunkSize: {
1565 SrsSetChunkSizePacket* pkt = dynamic_cast<SrsSetChunkSizePacket*>(packet); 1562 SrsSetChunkSizePacket* pkt = dynamic_cast<SrsSetChunkSizePacket*>(packet);
1566 - srs_assert(pkt != NULL);  
1567 -  
1568 out_chunk_size = pkt->chunk_size; 1563 out_chunk_size = pkt->chunk_size;
1569 -  
1570 - srs_trace("out chunk size to %d", pkt->chunk_size); 1564 + srs_info("out.chunk=%d", pkt->chunk_size);
  1565 + break;
  1566 + }
  1567 + case RTMP_MSG_WindowAcknowledgementSize: {
  1568 + SrsSetWindowAckSizePacket* pkt = dynamic_cast<SrsSetWindowAckSizePacket*>(packet);
  1569 + out_ack_size.window = (uint32_t)pkt->ackowledgement_window_size;
1571 break; 1570 break;
1572 } 1571 }
1573 case RTMP_MSG_AMF0CommandMessage: 1572 case RTMP_MSG_AMF0CommandMessage:
@@ -1606,9 +1605,27 @@ int SrsProtocol::response_acknowledgement_message() @@ -1606,9 +1605,27 @@ int SrsProtocol::response_acknowledgement_message()
1606 { 1605 {
1607 int ret = ERROR_SUCCESS; 1606 int ret = ERROR_SUCCESS;
1608 1607
  1608 + if (in_ack_size.window <= 0) {
  1609 + return ret;
  1610 + }
  1611 +
  1612 + // ignore when delta bytes not exceed half of window(ack size).
  1613 + uint32_t delta = (uint32_t)(skt->get_recv_bytes() - in_ack_size.nb_recv_bytes);
  1614 + if (delta < in_ack_size.window / 2) {
  1615 + return ret;
  1616 + }
  1617 + in_ack_size.nb_recv_bytes = skt->get_recv_bytes();
  1618 +
  1619 + // when the sequence number overflow, reset it.
  1620 + uint32_t sequence_number = in_ack_size.sequence_number + delta;
  1621 + if (sequence_number > 0xf0000000) {
  1622 + sequence_number = delta;
  1623 + }
  1624 + in_ack_size.sequence_number = sequence_number;
  1625 +
1609 SrsAcknowledgementPacket* pkt = new SrsAcknowledgementPacket(); 1626 SrsAcknowledgementPacket* pkt = new SrsAcknowledgementPacket();
1610 - in_ack_size.acked_size = skt->get_recv_bytes();  
1611 - pkt->sequence_number = (int32_t)in_ack_size.acked_size; 1627 + pkt->sequence_number = sequence_number;
  1628 + srs_warn("ack sequence=%#x", sequence_number);
1612 1629
1613 // cache the message and use flush to send. 1630 // cache the message and use flush to send.
1614 if (!auto_response_when_recv) { 1631 if (!auto_response_when_recv) {
@@ -5017,7 +5034,7 @@ SrsAcknowledgementPacket::~SrsAcknowledgementPacket() @@ -5017,7 +5034,7 @@ SrsAcknowledgementPacket::~SrsAcknowledgementPacket()
5017 { 5034 {
5018 } 5035 }
5019 5036
5020 -int SrsAcknowledgementPacket::decode(SrsBuffer* stream) 5037 +int SrsAcknowledgementPacket::decode(SrsStream* stream)
5021 { 5038 {
5022 int ret = ERROR_SUCCESS; 5039 int ret = ERROR_SUCCESS;
5023 5040
@@ -5027,7 +5044,7 @@ int SrsAcknowledgementPacket::decode(SrsBuffer* stream) @@ -5027,7 +5044,7 @@ int SrsAcknowledgementPacket::decode(SrsBuffer* stream)
5027 return ret; 5044 return ret;
5028 } 5045 }
5029 5046
5030 - sequence_number = stream->read_4bytes(); 5047 + sequence_number = (uint32_t)stream->read_4bytes();
5031 srs_info("decode acknowledgement success"); 5048 srs_info("decode acknowledgement success");
5032 5049
5033 return ret; 5050 return ret;
@@ -190,8 +190,11 @@ private: @@ -190,8 +190,11 @@ private:
190 class AckWindowSize 190 class AckWindowSize
191 { 191 {
192 public: 192 public:
193 - int ack_window_size;  
194 - int64_t acked_size; 193 + uint32_t window;
  194 + // number of received bytes.
  195 + int64_t nb_recv_bytes;
  196 + // previous responsed sequence number.
  197 + uint32_t sequence_number;
195 198
196 AckWindowSize(); 199 AckWindowSize();
197 }; 200 };
@@ -227,10 +230,11 @@ private: @@ -227,10 +230,11 @@ private:
227 * input chunk size, default to 128, set by peer packet. 230 * input chunk size, default to 128, set by peer packet.
228 */ 231 */
229 int32_t in_chunk_size; 232 int32_t in_chunk_size;
230 - /**  
231 - * input ack size, when to send the acked packet.  
232 - */ 233 + // The input ack window, to response acknowledge to peer,
  234 + // for example, to respose the encoder, for server got lots of packets.
233 AckWindowSize in_ack_size; 235 AckWindowSize in_ack_size;
  236 + // The output ack window, to require peer to response the ack.
  237 + AckWindowSize out_ack_size;
234 /** 238 /**
235 * whether auto response when recv messages. 239 * whether auto response when recv messages.
236 * default to true for it's very easy to use the protocol stack. 240 * default to true for it's very easy to use the protocol stack.
@@ -1843,13 +1847,13 @@ protected: @@ -1843,13 +1847,13 @@ protected:
1843 class SrsAcknowledgementPacket : public SrsPacket 1847 class SrsAcknowledgementPacket : public SrsPacket
1844 { 1848 {
1845 public: 1849 public:
1846 - int32_t sequence_number; 1850 + uint32_t sequence_number;
1847 public: 1851 public:
1848 SrsAcknowledgementPacket(); 1852 SrsAcknowledgementPacket();
1849 virtual ~SrsAcknowledgementPacket(); 1853 virtual ~SrsAcknowledgementPacket();
1850 // decode functions for concrete packet to override. 1854 // decode functions for concrete packet to override.
1851 public: 1855 public:
1852 - virtual int decode(SrsBuffer* stream); 1856 + virtual int decode(SrsStream* stream);
1853 // encode functions for concrete packet to override. 1857 // encode functions for concrete packet to override.
1854 public: 1858 public:
1855 virtual int get_prefer_cid(); 1859 virtual int get_prefer_cid();