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);
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;
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;
}
}
+ fifo_realloc(&stream->fifo, fifo_size(&stream->fifo, NULL) + size + 1);
fifo_write(&stream->fifo, buf, size, &stream->fifo.wptr);
for(;;){
int fifo_size(FifoBuffer *f, uint8_t *rptr)
{
int size;
+
+ if(!rptr)
+ rptr= f->rptr;
if (f->wptr >= rptr) {
size = f->wptr - 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 {
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)