OSDN Git Service

bypass internal buffer for "large" packets
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 24 Mar 2005 22:07:54 +0000 (22:07 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 24 Mar 2005 22:07:54 +0000 (22:07 +0000)
Originally committed as revision 4080 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/aviobuf.c

index 7db4f15..6eab0e1 100644 (file)
@@ -333,10 +333,28 @@ int get_buffer(ByteIOContext *s, unsigned char *buf, int size)
         if (len > size)
             len = size;
         if (len == 0) {
-            fill_buffer(s);
-            len = s->buf_end - s->buf_ptr;
-            if (len == 0)
-                break;
+            if(size > s->buffer_size && !s->update_checksum){
+                len = s->read_packet(s->opaque, buf, size);
+                if (len <= 0) {
+                    /* do not modify buffer if EOF reached so that a seek back can
+                    be done without rereading data */
+                    s->eof_reached = 1;
+                    if(len<0)
+                        s->error= len;
+                    break;
+                } else {
+                    s->pos += len;
+                    size -= len;
+                    buf += len;
+                    s->buf_ptr = s->buffer;
+                    s->buf_end = s->buffer/* + len*/;
+                }
+            }else{
+                fill_buffer(s);
+                len = s->buf_end - s->buf_ptr;
+                if (len == 0)
+                    break;
+            }
         } else {
             memcpy(buf, s->buf_ptr, len);
             buf += len;