diff --git a/trunk/src/app/srs_app_recv_thread.cpp b/trunk/src/app/srs_app_recv_thread.cpp index e4bfaa897..dc1a26ea6 100644 --- a/trunk/src/app/srs_app_recv_thread.cpp +++ b/trunk/src/app/srs_app_recv_thread.cpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // when we read from socket less than this value, // sleep a while to merge read. // @see https://github.com/winlinvip/simple-rtmp-server/issues/241 -#define SRS_MERGED_READ_SIZE (SOCKET_READ_SIZE / 10) +#define SRS_MERGED_READ_SIZE(buffer) (buffer / 10) // the time to sleep to merge read, to read more bytes. #define SRS_MERGED_READ_US (300 * 1000) @@ -334,7 +334,7 @@ void SrsPublishRecvThread::on_recv_error(int ret) st_cond_signal(error); } -void SrsPublishRecvThread::on_read(ssize_t nread) +void SrsPublishRecvThread::on_read(int nb_buffer, ssize_t nread) { if (nread < 0) { return; @@ -346,7 +346,7 @@ void SrsPublishRecvThread::on_read(ssize_t nread) * that is, we merge some data to read together. * @see https://github.com/winlinvip/simple-rtmp-server/issues/241 */ - if (nread < SRS_MERGED_READ_SIZE) { + if (nread < SRS_MERGED_READ_SIZE(nb_buffer)) { st_usleep(SRS_MERGED_READ_US); } } diff --git a/trunk/src/app/srs_app_recv_thread.hpp b/trunk/src/app/srs_app_recv_thread.hpp index f723374fd..534a051cc 100644 --- a/trunk/src/app/srs_app_recv_thread.hpp +++ b/trunk/src/app/srs_app_recv_thread.hpp @@ -173,7 +173,7 @@ public: virtual void on_recv_error(int ret); // interface IMergeReadHandler public: - virtual void on_read(ssize_t nread); + virtual void on_read(int nb_buffer, ssize_t nread); }; #endif diff --git a/trunk/src/qt/srs/srs-qt.pro.user b/trunk/src/qt/srs/srs-qt.pro.user index fb16e8d12..8672380b5 100644 --- a/trunk/src/qt/srs/srs-qt.pro.user +++ b/trunk/src/qt/srs/srs-qt.pro.user @@ -1,6 +1,5 @@ - ProjectExplorer.Project.ActiveTarget diff --git a/trunk/src/rtmp/srs_protocol_buffer.cpp b/trunk/src/rtmp/srs_protocol_buffer.cpp index 1778b4efd..f4d949cec 100644 --- a/trunk/src/rtmp/srs_protocol_buffer.cpp +++ b/trunk/src/rtmp/srs_protocol_buffer.cpp @@ -26,6 +26,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include +// 4KB=4096 +// 8KB=8192 +// 16KB=16384 +// 32KB=32768 +// 64KB=65536 +// @see https://github.com/winlinvip/simple-rtmp-server/issues/241 +#define SOCKET_READ_SIZE 4096 + IMergeReadHandler::IMergeReadHandler() { } @@ -39,7 +47,8 @@ SrsBuffer::SrsBuffer() merged_read = false; _handler = NULL; - buffer = new char[SOCKET_READ_SIZE]; + nb_buffer = SOCKET_READ_SIZE; + buffer = new char[nb_buffer]; } SrsBuffer::~SrsBuffer() @@ -92,7 +101,7 @@ int SrsBuffer::grow(ISrsBufferReader* reader, int required_size) while (length() < required_size) { ssize_t nread; - if ((ret = reader->read(buffer, SOCKET_READ_SIZE, &nread)) != ERROR_SUCCESS) { + if ((ret = reader->read(buffer, nb_buffer, &nread)) != ERROR_SUCCESS) { return ret; } @@ -103,7 +112,7 @@ int SrsBuffer::grow(ISrsBufferReader* reader, int required_size) * @see https://github.com/winlinvip/simple-rtmp-server/issues/241 */ if (merged_read && _handler) { - _handler->on_read(nread); + _handler->on_read(nb_buffer, nread); } srs_assert((int)nread > 0); @@ -119,4 +128,21 @@ void SrsBuffer::set_merge_read(bool v, IMergeReadHandler* handler) _handler = handler; } +void SrsBuffer::on_chunk_size(int32_t chunk_size) +{ + if (nb_buffer >= chunk_size) { + return; + } + + srs_freep(buffer); + + nb_buffer = chunk_size; + buffer = new char[nb_buffer]; +} + +int SrsBuffer::buffer_size() +{ + return nb_buffer; +} + diff --git a/trunk/src/rtmp/srs_protocol_buffer.hpp b/trunk/src/rtmp/srs_protocol_buffer.hpp index b03f8ec4b..35f9c4615 100644 --- a/trunk/src/rtmp/srs_protocol_buffer.hpp +++ b/trunk/src/rtmp/srs_protocol_buffer.hpp @@ -34,14 +34,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include -// 4KB=4096 -// 8KB=8192 -// 16KB=16384 -// 32KB=32768 -// 64KB=65536 -// @see https://github.com/winlinvip/simple-rtmp-server/issues/241 -#define SOCKET_READ_SIZE 4096 - /** * to improve read performance, merge some packets then read, * when it on and read small bytes, we sleep to wait more data., @@ -59,7 +51,7 @@ public: * some small bytes. * @remark, it only for server-side, client srs-librtmp just ignore. */ - virtual void on_read(ssize_t nread) = 0; + virtual void on_read(int nb_buffer, ssize_t nread) = 0; }; /** @@ -75,6 +67,7 @@ private: // data and socket buffer std::vector data; char* buffer; + int nb_buffer; public: SrsBuffer(); virtual ~SrsBuffer(); @@ -121,6 +114,17 @@ public: * @see https://github.com/winlinvip/simple-rtmp-server/issues/241 */ virtual void set_merge_read(bool v, IMergeReadHandler* handler); +public: + /** + * when chunk size changed, the buffer should change the buffer also. + * to keep the socket buffer size always greater than chunk size. + * @see https://github.com/winlinvip/simple-rtmp-server/issues/241 + */ + virtual void on_chunk_size(int32_t chunk_size); + /** + * get the size of socket buffer to read. + */ + virtual int buffer_size(); }; #endif diff --git a/trunk/src/rtmp/srs_protocol_stack.cpp b/trunk/src/rtmp/srs_protocol_stack.cpp index eb030f007..a58bc7c6e 100644 --- a/trunk/src/rtmp/srs_protocol_stack.cpp +++ b/trunk/src/rtmp/srs_protocol_stack.cpp @@ -1688,10 +1688,13 @@ int SrsProtocol::on_recv_message(SrsMessage* msg) pkt->chunk_size, SRS_CONSTS_RTMP_MIN_CHUNK_SIZE, SRS_CONSTS_RTMP_MAX_CHUNK_SIZE); } - + + int sock_buffer = in_buffer->buffer_size(); in_chunk_size = pkt->chunk_size; - - srs_trace("input chunk size to %d", pkt->chunk_size); + in_buffer->on_chunk_size(pkt->chunk_size); + srs_trace("input chunk size to %d, sock buf %d=>%d", + pkt->chunk_size, sock_buffer, in_buffer->buffer_size()); + break; } case RTMP_MSG_UserControlMessage: {