正在显示
6 个修改的文件
包含
52 行增加
和
20 行删除
| @@ -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: { |
-
请 注册 或 登录 后发表评论