# HG changeset patch # User michael # Date 1101868108 0 # Node ID 15cf78d9aceb9d5edebba147bc12d08ecee34966 # Parent 3d516cb458e617003875b08b7c54906d49f44e12 fifo_realloc() diff -r 3d516cb458e6 -r 15cf78d9aceb avformat.h --- a/avformat.h Tue Nov 30 21:57:51 2004 +0000 +++ b/avformat.h Wed Dec 01 02:28:28 2004 +0000 @@ -546,6 +546,7 @@ 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 -r 3d516cb458e6 -r 15cf78d9aceb mpeg.c --- a/mpeg.c Tue Nov 30 21:57:51 2004 +0000 +++ b/mpeg.c Wed Dec 01 02:28:28 2004 +0000 @@ -391,7 +391,7 @@ 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 @@ 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 @@ } } + fifo_realloc(&stream->fifo, fifo_size(&stream->fifo, NULL) + size + 1); fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr); for(;;){ diff -r 3d516cb458e6 -r 15cf78d9aceb utils.c --- 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)