@@ -27,6 +27,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2727#include < srs_kernel_log.hpp>
2828#include < srs_kernel_utility.hpp>
2929
30+ // the max header size,
31+ // @see SrsProtocol::read_message_header().
32+ #define SRS_RTMP_MAX_MESSAGE_HEADER 11
33+
3034SrsSimpleBuffer::SrsSimpleBuffer ()
3135{
3236}
@@ -81,46 +85,45 @@ SrsFastBuffer::SrsFastBuffer()
8185 merged_read = false ;
8286 _handler = NULL ;
8387
84- nb_buffer = SOCKET_READ_SIZE;
85- buffer = new char [nb_buffer];
88+ p = end = buffer = NULL ;
89+ nb_buffer = 0 ;
90+
91+ reset_buffer (SOCKET_READ_SIZE);
8692}
8793
8894SrsFastBuffer::~SrsFastBuffer ()
8995{
9096 srs_freep (buffer);
9197}
9298
93- int SrsFastBuffer::length ()
99+ char SrsFastBuffer::read_1byte ()
94100{
95- int len = (int )data.size ();
96- srs_assert (len >= 0 );
97- return len;
98- }
99-
100- char * SrsFastBuffer::bytes ()
101- {
102- return (length () == 0 )? NULL : &data.at (0 );
101+ srs_assert (end - p >= 1 );
102+ return *p++;
103103}
104104
105- void SrsFastBuffer::erase (int size)
105+ char * SrsFastBuffer::read_slice (int size)
106106{
107- if (size <= 0 ) {
108- return ;
109- }
107+ srs_assert (end - p >= size);
108+ srs_assert (p + size > buffer);
110109
111- if (size >= length ()) {
112- data.clear ();
113- return ;
114- }
110+ char * ptr = p;
111+ p += size;
115112
116- data.erase (data.begin (), data.begin () + size);
113+ // reset when consumed all.
114+ if (p == end) {
115+ p = end = buffer;
116+ srs_verbose (" all consumed, reset fast buffer" );
117+ }
118+
119+ return ptr;
117120}
118121
119- void SrsFastBuffer::append ( const char * bytes, int size)
122+ void SrsFastBuffer::skip ( int size)
120123{
121- srs_assert (size > 0 );
122-
123- data. insert (data. end (), bytes, bytes + size) ;
124+ srs_assert (end - p >= size );
125+ srs_assert (p + size > buffer);
126+ p += size;
124127}
125128
126129int SrsFastBuffer::grow (ISrsBufferReader* reader, int required_size)
@@ -133,9 +136,27 @@ int SrsFastBuffer::grow(ISrsBufferReader* reader, int required_size)
133136 return ret;
134137 }
135138
136- while (length () < required_size) {
139+ // when read payload and need to grow, reset buffer.
140+ if (end - p < required_size && required_size > SRS_RTMP_MAX_MESSAGE_HEADER) {
141+ int nb_cap = end - p;
142+ srs_verbose (" move fast buffer %d bytes" , nb_cap);
143+ buffer = (char *)memmove (buffer, p, nb_cap);
144+ p = buffer;
145+ end = p + nb_cap;
146+ }
147+
148+ while (end - p < required_size) {
149+ // the max to read is the left bytes.
150+ size_t max_to_read = buffer + nb_buffer - end;
151+
152+ if (max_to_read <= 0 ) {
153+ ret = ERROR_RTMP_BUFFER_OVERFLOW;
154+ srs_error (" buffer overflow, required=%d, max=%d, ret=%d" , required_size, nb_buffer, ret);
155+ return ret;
156+ }
157+
137158 ssize_t nread;
138- if ((ret = reader->read (buffer, nb_buffer , &nread)) != ERROR_SUCCESS) {
159+ if ((ret = reader->read (end, max_to_read , &nread)) != ERROR_SUCCESS) {
139160 return ret;
140161 }
141162
@@ -149,8 +170,9 @@ int SrsFastBuffer::grow(ISrsBufferReader* reader, int required_size)
149170 _handler->on_read (nread);
150171 }
151172
173+ // we just move the ptr to next.
152174 srs_assert ((int )nread > 0 );
153- append (buffer, ( int ) nread) ;
175+ end += nread;
154176 }
155177
156178 return ret;
@@ -198,8 +220,19 @@ int SrsFastBuffer::buffer_size()
198220
199221void SrsFastBuffer::reset_buffer (int size)
200222{
223+ // remember the cap.
224+ int nb_cap = end - p;
225+
226+ // atleast to put the old data.
227+ nb_buffer = srs_max (nb_cap, size);
228+
229+ // copy old data to buf.
230+ char * buf = new char [nb_buffer];
231+ if (nb_cap > 0 ) {
232+ memcpy (buf, p, nb_cap);
233+ }
234+
201235 srs_freep (buffer);
202-
203- nb_buffer = size;
204- buffer = new char [nb_buffer];
236+ p = buffer = buf;
237+ end = p + nb_cap;
205238}
0 commit comments