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