winlin

for #730, merge srs2

@@ -203,13 +203,61 @@ Please select your language: @@ -203,13 +203,61 @@ Please select your language:
203 203
204 ### V2 changes 204 ### V2 changes
205 205
  206 +* v2.0, 2017-01-06, for #730, reset ack follow flash player rules. 2.0.225
  207 +* v2.0, 2016-12-15, for #513, remove hls ram from srs2 to srs3+. 2.0.224
206 * <strong>v2.0, 2016-12-13, [2.0 beta3(2.0.223)][r2.0b3] released. 86685 lines.</strong> 208 * <strong>v2.0, 2016-12-13, [2.0 beta3(2.0.223)][r2.0b3] released. 86685 lines.</strong>
  209 +* v2.0, 2016-12-13, fix #713, disable the source cleanup. 2.0.223
  210 +* v2.0, 2016-12-13, fix #713, refine source to avoid critical fetch and create. 2.0.222
207 * <strong>v2.0, 2016-11-09, [2.0 beta2(2.0.221)][r2.0b2] released. 86691 lines.</strong> 211 * <strong>v2.0, 2016-11-09, [2.0 beta2(2.0.221)][r2.0b2] released. 86691 lines.</strong>
  212 +* v2.0, 2016-11-05, fix #654, crash when source cleanup for edge. 2.0.221
  213 +* v2.0, 2016-10-26, fix #666, crash when source cleanup for http-flv. 2.0.220
  214 +* v2.0, 2016-10-10, fix #661, close fd after thread stopped. 2.0.219
  215 +* v2.0, 2016-09-23, support asprocess for oryx. 2.0.218
  216 +* v2.0, 2016-09-23, support change work_dir for oryx.
  217 +* v2.0, 2016-09-15, fix #640, typo for rtmp type. 2.0.217
  218 +* v2.0, 2016-09-12, fix fast stream error bug. 2.0.216
208 * <strong>v2.0, 2016-09-09, [2.0 beta1(2.0.215)][r2.0b1] released. 89941 lines.</strong> 219 * <strong>v2.0, 2016-09-09, [2.0 beta1(2.0.215)][r2.0b1] released. 89941 lines.</strong>
  220 +* v2.0, 2016-09-09, refine librtmp comments about NALUs. 2.0.215
  221 +* v2.0, 2016-09-05, fix memory leak at source. 2.0.214
  222 +* v2.0, 2016-09-05, fix memory leak at handshake. 2.0.213
  223 +* v2.0, 2016-09-04, support valgrind for [patched st](https://github.com/ossrs/state-threads/issues/2).
  224 +* v2.0, 2016-09-03, support all arm for [patched st](https://github.com/ossrs/state-threads/issues/1). 2.0.212
  225 +* v2.0, 2016-09-01, workaround [#511][bug #511] the fly stfd in close. 2.0.211
  226 +* v2.0, 2016-08-30, comment the pcr.
  227 +* v2.0, 2016-08-18, fix [srs-librtmp#4](https://github.com/ossrs/srs-librtmp/issues/4) filter frame.
  228 +* v2.0, 2016-08-10, fix socket timeout for librtmp.
  229 +* v2.0, 2016-08-08, fix the crash by srs_info log.
209 * <strong>v2.0, 2016-08-06, [2.0 beta0(2.0.210)][r2.0b0] released. 89704 lines.</strong> 230 * <strong>v2.0, 2016-08-06, [2.0 beta0(2.0.210)][r2.0b0] released. 89704 lines.</strong>
  231 +* v2.0, 2016-05-17, fix the sps pps parse bug.
  232 +* v2.0, 2016-01-13, fix http reader bug, support infinite chunked. 2.0.209
  233 +* v2.0, 2016-01-09, merge [#559][pr #559] fix memory leak bug. 2.0.208
  234 +* v2.0, 2016-01-09, merge [#558][pr #558] add tcUrl for on_publish.
  235 +* v2.0, 2016-01-05, add keyword XCORE for coredump to identify the version. 2.0.207
210 * <strong>v2.0, 2015-12-23, [2.0 alpha3(2.0.205)][r2.0a3] released. 89544 lines.</strong> 236 * <strong>v2.0, 2015-12-23, [2.0 alpha3(2.0.205)][r2.0a3] released. 89544 lines.</strong>
  237 +* v2.0, 2015-12-22, for [#509][bug #509] always alloc big object at heap. 2.0.205
  238 +* v2.0, 2015-12-22, for [#418][bug #418] ignore null connect props to make RED5 happy. 2.0.204
  239 +* v2.0, 2015-12-22, for [#546][bug #546] thread terminate normally dispose bug. 2.0.203
  240 +* v2.0, 2015-12-22, for [#541][bug #541] failed when chunk size too small. 2.0.202
  241 +* v2.0, 2015-12-15, default hls_on_error to continue. 2.0.201
  242 +* v2.0, 2015-11-16, for [#518][bug #518] fix fd leak bug when fork. 2.0.200
  243 +* v2.0, 2015-11-05, for [#511][bug #511] fix bug for restart thread. 2.0.199
  244 +* v2.0, 2015-11-02, for [#515][bug #515] use srs_freepa and SrsAutoFreeA for array. 2.0.198
  245 +* v2.0, 2015-10-28, for [ExoPlayer #828][exo #828], remove duration for live.
  246 +* v2.0, 2015-10-28, for [ExoPlayer #828][exo #828], add av tag in flv header. 2.0.197
  247 +* v2.0, 2015-10-27, for [#512][bug #512] partial hotfix the hls pure audio. 2.0.196
211 * <strong>v2.0, 2015-10-08, [2.0 alpha2(2.0.195)][r2.0a2] released. 89358 lines.</strong> 248 * <strong>v2.0, 2015-10-08, [2.0 alpha2(2.0.195)][r2.0a2] released. 89358 lines.</strong>
  249 +* v2.0, 2015-10-04, for [#448][bug #448] fix the bug of response of http hooks. 2.0.195
  250 +* v2.0, 2015-10-01, for [#497][bug #497] response error when client not found to kickoff. 2.0.194
  251 +* v2.0, 2015-10-01, for [#495][bug #495] decrease the srs-librtmp size. 2.0.193
  252 +* v2.0, 2015-09-23, for [#485][bug #485] error when arm glibc 2.15+ or not i386/x86_64/amd64. 2.0.192
  253 +* v2.0, 2015-09-23, for [#485][bug #485] srs for respberrypi and cubieboard. 2.0.191
  254 +* v2.0, 2015-09-21, fix [#484][bug #484] hotfix the openssl build script 2.0.190
212 * <strong>v2.0, 2015-09-14, [2.0 alpha1(2.0.189)][r2.0a1] released. 89269 lines.</strong> 255 * <strong>v2.0, 2015-09-14, [2.0 alpha1(2.0.189)][r2.0a1] released. 89269 lines.</strong>
  256 +* v2.0, 2015-09-14, fix [#474][bug #474] config to donot parse width/height from sps. 2.0.189
  257 +* v2.0, 2015-09-14, for [#474][bug #474] always release publish for source.
  258 +* v2.0, 2015-09-14, for [#458][bug #458] http hooks use source thread cid. 2.0.188
  259 +* v2.0, 2015-09-14, for [#475][bug #475] fix http hooks crash for st context switch. 2.0.187
  260 +* v2.0, 2015-09-09, support reload utc_time. 2.0.186
213 * <strong>v2.0, 2015-08-23, [2.0 alpha0(2.0.185)][r2.0a0] released. 89022 lines.</strong> 261 * <strong>v2.0, 2015-08-23, [2.0 alpha0(2.0.185)][r2.0a0] released. 89022 lines.</strong>
214 * v2.0, 2015-08-22, HTTP API support JSONP by specifies the query string callback=xxx. 262 * v2.0, 2015-08-22, HTTP API support JSONP by specifies the query string callback=xxx.
215 * v2.0, 2015-08-20, fix [#380][bug #380], srs-librtmp send sequence header when sps or pps changed. 263 * v2.0, 2015-08-20, fix [#380][bug #380], srs-librtmp send sequence header when sps or pps changed.
@@ -325,7 +373,7 @@ Please select your language: @@ -325,7 +373,7 @@ Please select your language:
325 * v2.0, 2014-11-21, srs-librtmp add rtmp prefix for rtmp/utils/human apis. 2.0.29. 373 * v2.0, 2014-11-21, srs-librtmp add rtmp prefix for rtmp/utils/human apis. 2.0.29.
326 * v2.0, 2014-11-21, refine examples of srs-librtmp, add srs_print_rtmp_packet. 2.0.28. 374 * v2.0, 2014-11-21, refine examples of srs-librtmp, add srs_print_rtmp_packet. 2.0.28.
327 * v2.0, 2014-11-20, fix [#212][bug #212], support publish audio raw frames. 2.0.27 375 * v2.0, 2014-11-20, fix [#212][bug #212], support publish audio raw frames. 2.0.27
328 -* v2.0, 2014-11-19, fix [#213][bug #213], support compile [srs-librtmp on windows][srs-librtmp], [bug #213][bug #213]. 2.0.26 376 +* v2.0, 2014-11-19, fix [#213][bug #213], support compile [srs-librtmp on windows](https://github.com/winlinvip/srs.librtmp), [bug #213][bug #213]. 2.0.26
329 * v2.0, 2014-11-18, all wiki translated to English. 2.0.23. 377 * v2.0, 2014-11-18, all wiki translated to English. 2.0.23.
330 * v2.0, 2014-11-15, fix [#204][bug #204], srs-librtmp drop duplicated sps/pps(sequence header). 2.0.22. 378 * v2.0, 2014-11-15, fix [#204][bug #204], srs-librtmp drop duplicated sps/pps(sequence header). 2.0.22.
331 * v2.0, 2014-11-15, fix [#203][bug #203], srs-librtmp drop any video before sps/pps(sequence header). 2.0.21. 379 * v2.0, 2014-11-15, fix [#203][bug #203], srs-librtmp drop any video before sps/pps(sequence header). 2.0.21.
@@ -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 3 32 #define VERSION_MAJOR 3
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 12 34 +#define VERSION_REVISION 13
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(SrsBuffer* stream) @@ -210,8 +210,8 @@ int SrsPacket::encode_packet(SrsBuffer* 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) {
@@ -5079,6 +5096,22 @@ SrsAcknowledgementPacket::~SrsAcknowledgementPacket() @@ -5079,6 +5096,22 @@ SrsAcknowledgementPacket::~SrsAcknowledgementPacket()
5079 { 5096 {
5080 } 5097 }
5081 5098
  5099 +int SrsAcknowledgementPacket::decode(SrsBuffer* stream)
  5100 +{
  5101 + int ret = ERROR_SUCCESS;
  5102 +
  5103 + if (!stream->require(4)) {
  5104 + ret = ERROR_RTMP_MESSAGE_DECODE;
  5105 + srs_error("decode acknowledgement failed. ret=%d", ret);
  5106 + return ret;
  5107 + }
  5108 +
  5109 + sequence_number = (uint32_t)stream->read_4bytes();
  5110 + srs_info("decode acknowledgement success");
  5111 +
  5112 + return ret;
  5113 +}
  5114 +
5082 int SrsAcknowledgementPacket::get_prefer_cid() 5115 int SrsAcknowledgementPacket::get_prefer_cid()
5083 { 5116 {
5084 return RTMP_CID_ProtocolControl; 5117 return RTMP_CID_ProtocolControl;
@@ -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.
@@ -1847,10 +1851,13 @@ protected: @@ -1847,10 +1851,13 @@ protected:
1847 class SrsAcknowledgementPacket : public SrsPacket 1851 class SrsAcknowledgementPacket : public SrsPacket
1848 { 1852 {
1849 public: 1853 public:
1850 - int32_t sequence_number; 1854 + uint32_t sequence_number;
1851 public: 1855 public:
1852 SrsAcknowledgementPacket(); 1856 SrsAcknowledgementPacket();
1853 virtual ~SrsAcknowledgementPacket(); 1857 virtual ~SrsAcknowledgementPacket();
  1858 +// decode functions for concrete packet to override.
  1859 +public:
  1860 + virtual int decode(SrsBuffer* stream);
1854 // encode functions for concrete packet to override. 1861 // encode functions for concrete packet to override.
1855 public: 1862 public:
1856 virtual int get_prefer_cid(); 1863 virtual int get_prefer_cid();
@@ -31,12 +31,12 @@ using namespace std; @@ -31,12 +31,12 @@ using namespace std;
31 VOID TEST(CoreAutoFreeTest, Free) 31 VOID TEST(CoreAutoFreeTest, Free)
32 { 32 {
33 char* data = new char[32]; 33 char* data = new char[32];
34 - srs_freep(data); 34 + srs_freepa(data);
35 EXPECT_TRUE(data == NULL); 35 EXPECT_TRUE(data == NULL);
36 36
37 if (true) { 37 if (true) {
38 data = new char[32]; 38 data = new char[32];
39 - SrsAutoFree(char, data); 39 + SrsAutoFreeA(char, data);
40 } 40 }
41 EXPECT_TRUE(data == NULL); 41 EXPECT_TRUE(data == NULL);
42 } 42 }