diff utils.c @ 602:15cf78d9aceb libavformat

fifo_realloc()
author michael
date Wed, 01 Dec 2004 02:28:28 +0000
parents 6446e6aee91e
children deece487318e
line wrap: on
line diff
--- a/utils.c	Tue Nov 30 21:57:51 2004 +0000
+++ b/utils.c	Wed Dec 01 02:28:28 2004 +0000
@@ -232,6 +232,9 @@
 int fifo_size(FifoBuffer *f, uint8_t *rptr)
 {
     int size;
+    
+    if(!rptr)
+        rptr= f->rptr;
 
     if (f->wptr >= rptr) {
         size = f->wptr - rptr;
@@ -244,9 +247,13 @@
 /* get data from the fifo (return -1 if not enough data) */
 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
 {
-    uint8_t *rptr = *rptr_ptr;
+    uint8_t *rptr;
     int size, len;
 
+    if(!rptr_ptr)
+        rptr_ptr= &f->rptr;
+    rptr = *rptr_ptr;
+
     if (f->wptr >= rptr) {
         size = f->wptr - rptr;
     } else {
@@ -270,11 +277,34 @@
     return 0;
 }
 
+void fifo_realloc(FifoBuffer *f, int new_size){
+    int old_size= f->end - f->buffer;
+    
+    if(old_size < new_size){
+        uint8_t *old= f->buffer;
+
+        f->buffer= av_realloc(f->buffer, new_size);
+
+        f->rptr += f->buffer - old;
+        f->wptr += f->buffer - old;
+
+        if(f->wptr < f->rptr){
+            memmove(f->rptr + new_size - old_size, f->rptr, f->buffer + old_size - f->rptr);
+            f->rptr += new_size - old_size;
+        }
+        f->end= f->buffer + new_size;
+    }
+}
+
 void fifo_write(FifoBuffer *f, uint8_t *buf, int size, uint8_t **wptr_ptr)
 {
     int len;
     uint8_t *wptr;
+
+    if(!wptr_ptr)
+        wptr_ptr= &f->wptr;
     wptr = *wptr_ptr;
+
     while (size > 0) {
         len = f->end - wptr;
         if (len > size)