winlin

for bug #241, change buffer size when chunk size changed.

@@ -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 // when we read from socket less than this value, 31 // when we read from socket less than this value,
32 // sleep a while to merge read. 32 // sleep a while to merge read.
33 // @see https://github.com/winlinvip/simple-rtmp-server/issues/241 33 // @see https://github.com/winlinvip/simple-rtmp-server/issues/241
34 -#define SRS_MERGED_READ_SIZE (SOCKET_READ_SIZE / 10) 34 +#define SRS_MERGED_READ_SIZE(buffer) (buffer / 10)
35 // the time to sleep to merge read, to read more bytes. 35 // the time to sleep to merge read, to read more bytes.
36 #define SRS_MERGED_READ_US (300 * 1000) 36 #define SRS_MERGED_READ_US (300 * 1000)
37 37
@@ -334,7 +334,7 @@ void SrsPublishRecvThread::on_recv_error(int ret) @@ -334,7 +334,7 @@ void SrsPublishRecvThread::on_recv_error(int ret)
334 st_cond_signal(error); 334 st_cond_signal(error);
335 } 335 }
336 336
337 -void SrsPublishRecvThread::on_read(ssize_t nread) 337 +void SrsPublishRecvThread::on_read(int nb_buffer, ssize_t nread)
338 { 338 {
339 if (nread < 0) { 339 if (nread < 0) {
340 return; 340 return;
@@ -346,7 +346,7 @@ void SrsPublishRecvThread::on_read(ssize_t nread) @@ -346,7 +346,7 @@ void SrsPublishRecvThread::on_read(ssize_t nread)
346 * that is, we merge some data to read together. 346 * that is, we merge some data to read together.
347 * @see https://github.com/winlinvip/simple-rtmp-server/issues/241 347 * @see https://github.com/winlinvip/simple-rtmp-server/issues/241
348 */ 348 */
349 - if (nread < SRS_MERGED_READ_SIZE) { 349 + if (nread < SRS_MERGED_READ_SIZE(nb_buffer)) {
350 st_usleep(SRS_MERGED_READ_US); 350 st_usleep(SRS_MERGED_READ_US);
351 } 351 }
352 } 352 }
@@ -173,7 +173,7 @@ public: @@ -173,7 +173,7 @@ public:
173 virtual void on_recv_error(int ret); 173 virtual void on_recv_error(int ret);
174 // interface IMergeReadHandler 174 // interface IMergeReadHandler
175 public: 175 public:
176 - virtual void on_read(ssize_t nread); 176 + virtual void on_read(int nb_buffer, ssize_t nread);
177 }; 177 };
178 178
179 #endif 179 #endif
1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE QtCreatorProject> 2 <!DOCTYPE QtCreatorProject>
3 -<!-- Written by QtCreator 3.1.1, 2014-12-01T23:49:21. -->  
4 <qtcreator> 3 <qtcreator>
5 <data> 4 <data>
6 <variable>ProjectExplorer.Project.ActiveTarget</variable> 5 <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -26,6 +26,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -26,6 +26,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include <srs_kernel_error.hpp> 26 #include <srs_kernel_error.hpp>
27 #include <srs_kernel_log.hpp> 27 #include <srs_kernel_log.hpp>
28 28
  29 +// 4KB=4096
  30 +// 8KB=8192
  31 +// 16KB=16384
  32 +// 32KB=32768
  33 +// 64KB=65536
  34 +// @see https://github.com/winlinvip/simple-rtmp-server/issues/241
  35 +#define SOCKET_READ_SIZE 4096
  36 +
29 IMergeReadHandler::IMergeReadHandler() 37 IMergeReadHandler::IMergeReadHandler()
30 { 38 {
31 } 39 }
@@ -39,7 +47,8 @@ SrsBuffer::SrsBuffer() @@ -39,7 +47,8 @@ SrsBuffer::SrsBuffer()
39 merged_read = false; 47 merged_read = false;
40 _handler = NULL; 48 _handler = NULL;
41 49
42 - buffer = new char[SOCKET_READ_SIZE]; 50 + nb_buffer = SOCKET_READ_SIZE;
  51 + buffer = new char[nb_buffer];
43 } 52 }
44 53
45 SrsBuffer::~SrsBuffer() 54 SrsBuffer::~SrsBuffer()
@@ -92,7 +101,7 @@ int SrsBuffer::grow(ISrsBufferReader* reader, int required_size) @@ -92,7 +101,7 @@ int SrsBuffer::grow(ISrsBufferReader* reader, int required_size)
92 101
93 while (length() < required_size) { 102 while (length() < required_size) {
94 ssize_t nread; 103 ssize_t nread;
95 - if ((ret = reader->read(buffer, SOCKET_READ_SIZE, &nread)) != ERROR_SUCCESS) { 104 + if ((ret = reader->read(buffer, nb_buffer, &nread)) != ERROR_SUCCESS) {
96 return ret; 105 return ret;
97 } 106 }
98 107
@@ -103,7 +112,7 @@ int SrsBuffer::grow(ISrsBufferReader* reader, int required_size) @@ -103,7 +112,7 @@ int SrsBuffer::grow(ISrsBufferReader* reader, int required_size)
103 * @see https://github.com/winlinvip/simple-rtmp-server/issues/241 112 * @see https://github.com/winlinvip/simple-rtmp-server/issues/241
104 */ 113 */
105 if (merged_read && _handler) { 114 if (merged_read && _handler) {
106 - _handler->on_read(nread); 115 + _handler->on_read(nb_buffer, nread);
107 } 116 }
108 117
109 srs_assert((int)nread > 0); 118 srs_assert((int)nread > 0);
@@ -119,4 +128,21 @@ void SrsBuffer::set_merge_read(bool v, IMergeReadHandler* handler) @@ -119,4 +128,21 @@ void SrsBuffer::set_merge_read(bool v, IMergeReadHandler* handler)
119 _handler = handler; 128 _handler = handler;
120 } 129 }
121 130
  131 +void SrsBuffer::on_chunk_size(int32_t chunk_size)
  132 +{
  133 + if (nb_buffer >= chunk_size) {
  134 + return;
  135 + }
  136 +
  137 + srs_freep(buffer);
  138 +
  139 + nb_buffer = chunk_size;
  140 + buffer = new char[nb_buffer];
  141 +}
  142 +
  143 +int SrsBuffer::buffer_size()
  144 +{
  145 + return nb_buffer;
  146 +}
  147 +
122 148
@@ -34,14 +34,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -34,14 +34,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 34
35 #include <srs_protocol_io.hpp> 35 #include <srs_protocol_io.hpp>
36 36
37 -// 4KB=4096  
38 -// 8KB=8192  
39 -// 16KB=16384  
40 -// 32KB=32768  
41 -// 64KB=65536  
42 -// @see https://github.com/winlinvip/simple-rtmp-server/issues/241  
43 -#define SOCKET_READ_SIZE 4096  
44 -  
45 /** 37 /**
46 * to improve read performance, merge some packets then read, 38 * to improve read performance, merge some packets then read,
47 * when it on and read small bytes, we sleep to wait more data., 39 * when it on and read small bytes, we sleep to wait more data.,
@@ -59,7 +51,7 @@ public: @@ -59,7 +51,7 @@ public:
59 * some small bytes. 51 * some small bytes.
60 * @remark, it only for server-side, client srs-librtmp just ignore. 52 * @remark, it only for server-side, client srs-librtmp just ignore.
61 */ 53 */
62 - virtual void on_read(ssize_t nread) = 0; 54 + virtual void on_read(int nb_buffer, ssize_t nread) = 0;
63 }; 55 };
64 56
65 /** 57 /**
@@ -75,6 +67,7 @@ private: @@ -75,6 +67,7 @@ private:
75 // data and socket buffer 67 // data and socket buffer
76 std::vector<char> data; 68 std::vector<char> data;
77 char* buffer; 69 char* buffer;
  70 + int nb_buffer;
78 public: 71 public:
79 SrsBuffer(); 72 SrsBuffer();
80 virtual ~SrsBuffer(); 73 virtual ~SrsBuffer();
@@ -121,6 +114,17 @@ public: @@ -121,6 +114,17 @@ public:
121 * @see https://github.com/winlinvip/simple-rtmp-server/issues/241 114 * @see https://github.com/winlinvip/simple-rtmp-server/issues/241
122 */ 115 */
123 virtual void set_merge_read(bool v, IMergeReadHandler* handler); 116 virtual void set_merge_read(bool v, IMergeReadHandler* handler);
  117 +public:
  118 + /**
  119 + * when chunk size changed, the buffer should change the buffer also.
  120 + * to keep the socket buffer size always greater than chunk size.
  121 + * @see https://github.com/winlinvip/simple-rtmp-server/issues/241
  122 + */
  123 + virtual void on_chunk_size(int32_t chunk_size);
  124 + /**
  125 + * get the size of socket buffer to read.
  126 + */
  127 + virtual int buffer_size();
124 }; 128 };
125 129
126 #endif 130 #endif
@@ -1688,10 +1688,13 @@ int SrsProtocol::on_recv_message(SrsMessage* msg) @@ -1688,10 +1688,13 @@ int SrsProtocol::on_recv_message(SrsMessage* msg)
1688 pkt->chunk_size, SRS_CONSTS_RTMP_MIN_CHUNK_SIZE, 1688 pkt->chunk_size, SRS_CONSTS_RTMP_MIN_CHUNK_SIZE,
1689 SRS_CONSTS_RTMP_MAX_CHUNK_SIZE); 1689 SRS_CONSTS_RTMP_MAX_CHUNK_SIZE);
1690 } 1690 }
1691 - 1691 +
  1692 + int sock_buffer = in_buffer->buffer_size();
1692 in_chunk_size = pkt->chunk_size; 1693 in_chunk_size = pkt->chunk_size;
1693 -  
1694 - srs_trace("input chunk size to %d", pkt->chunk_size); 1694 + in_buffer->on_chunk_size(pkt->chunk_size);
  1695 + srs_trace("input chunk size to %d, sock buf %d=>%d",
  1696 + pkt->chunk_size, sock_buffer, in_buffer->buffer_size());
  1697 +
1695 break; 1698 break;
1696 } 1699 }
1697 case RTMP_MSG_UserControlMessage: { 1700 case RTMP_MSG_UserControlMessage: {