[SCM] libav/experimental: fifo_realloc()

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:42:20 UTC 2013


The following commit has been merged in the experimental branch:
commit 0d71240921397c98af9b42616be2fe4796df8912
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Wed Dec 1 02:28:28 2004 +0000

    fifo_realloc()
    
    Originally committed as revision 3726 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index d2812b3..c04f0f3 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -546,6 +546,7 @@ int fifo_size(FifoBuffer *f, uint8_t *rptr);
 int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr);
 void fifo_write(FifoBuffer *f, uint8_t *buf, int size, uint8_t **wptr_ptr);
 int put_fifo(ByteIOContext *pb, FifoBuffer *f, int buf_size, uint8_t **rptr_ptr);
+void fifo_realloc(FifoBuffer *f, int size);
 
 /* media file input */
 AVInputFormat *av_find_input_format(const char *short_name);
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c
index 3b4a5f7..dee7a8a 100644
--- a/libavformat/mpeg.c
+++ b/libavformat/mpeg.c
@@ -391,7 +391,7 @@ static int mpeg_mux_init(AVFormatContext *ctx)
         default:
             return -1;
         }
-        fifo_init(&stream->fifo, 2*stream->max_buffer_size + 100*MAX_PAYLOAD_SIZE); //FIXME think about the size maybe dynamically realloc
+        fifo_init(&stream->fifo, 16);
         stream->next_packet= &stream->premux_packet;
     }
     bitrate = 0;
@@ -1172,11 +1172,6 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
         stream->predecode_packet= pkt_desc;
     stream->next_packet= &pkt_desc->next;
 
-    if(stream->fifo.end - stream->fifo.buffer - fifo_size(&stream->fifo, stream->fifo.rptr) < size){
-        av_log(ctx, AV_LOG_ERROR, "fifo overflow\n");
-        return -1;
-    }
-
     if (s->is_dvd){
         if (is_iframe) {
             stream->fifo_iframe_ptr = stream->fifo.wptr;
@@ -1186,6 +1181,7 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
         }
     }
 
+    fifo_realloc(&stream->fifo, fifo_size(&stream->fifo, NULL) + size + 1);
     fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr);
 
     for(;;){
diff --git a/libavformat/utils.c b/libavformat/utils.c
index a861c97..ddfadde 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -232,6 +232,9 @@ void fifo_free(FifoBuffer *f)
 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 @@ int fifo_size(FifoBuffer *f, uint8_t *rptr)
 /* 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 @@ int fifo_read(FifoBuffer *f, uint8_t *buf, int buf_size, uint8_t **rptr_ptr)
     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)

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list