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

pull/133/head
winlin 10 years ago
parent 19b1d750aa
commit aee00877df

@ -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);
}
}

@ -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

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.1.1, 2014-12-01T23:49:21. -->
<qtcreator>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>

@ -26,6 +26,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_kernel_error.hpp>
#include <srs_kernel_log.hpp>
// 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;
}

@ -34,14 +34,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_protocol_io.hpp>
// 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<char> 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

@ -1689,9 +1689,12 @@ int SrsProtocol::on_recv_message(SrsMessage* msg)
SRS_CONSTS_RTMP_MAX_CHUNK_SIZE);
}
int sock_buffer = in_buffer->buffer_size();
in_chunk_size = 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());
srs_trace("input chunk size to %d", pkt->chunk_size);
break;
}
case RTMP_MSG_UserControlMessage: {

Loading…
Cancel
Save