summaryrefslogtreecommitdiff
path: root/contrib/ffmpeg/libavutil/fifo.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ffmpeg/libavutil/fifo.c')
-rw-r--r--contrib/ffmpeg/libavutil/fifo.c75
1 files changed, 26 insertions, 49 deletions
diff --git a/contrib/ffmpeg/libavutil/fifo.c b/contrib/ffmpeg/libavutil/fifo.c
index 550f13de5..8ac3a0cb5 100644
--- a/contrib/ffmpeg/libavutil/fifo.c
+++ b/contrib/ffmpeg/libavutil/fifo.c
@@ -24,11 +24,11 @@
int av_fifo_init(AVFifoBuffer *f, int size)
{
+ f->wptr = f->rptr =
f->buffer = av_malloc(size);
+ f->end = f->buffer + size;
if (!f->buffer)
return -1;
- f->end = f->buffer + size;
- f->wptr = f->rptr = f->buffer;
return 0;
}
@@ -50,23 +50,7 @@ int av_fifo_size(AVFifoBuffer *f)
*/
int av_fifo_read(AVFifoBuffer *f, uint8_t *buf, int buf_size)
{
- int len;
- int size = f->wptr - f->rptr;
- if (size < 0)
- size += f->end - f->buffer;
-
- if (size < buf_size)
- return -1;
- while (buf_size > 0) {
- len = FFMIN(f->end - f->rptr, buf_size);
- memcpy(buf, f->rptr, len);
- buf += len;
- f->rptr += len;
- if (f->rptr >= f->end)
- f->rptr = f->buffer;
- buf_size -= len;
- }
- return 0;
+ return av_fifo_generic_read(f, buf_size, NULL, buf);
}
/**
@@ -76,59 +60,52 @@ void av_fifo_realloc(AVFifoBuffer *f, unsigned int new_size) {
unsigned 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;
+ int len= av_fifo_size(f);
+ AVFifoBuffer f2;
+
+ av_fifo_init(&f2, new_size);
+ av_fifo_read(f, f2.buffer, len);
+ f2.wptr += len;
+ av_free(f->buffer);
+ *f= f2;
}
}
void av_fifo_write(AVFifoBuffer *f, const uint8_t *buf, int size)
{
- int len;
-
- while (size > 0) {
- len = FFMIN(f->end - f->wptr, size);
+ do {
+ int len = FFMIN(f->end - f->wptr, size);
memcpy(f->wptr, buf, len);
f->wptr += len;
if (f->wptr >= f->end)
f->wptr = f->buffer;
buf += len;
size -= len;
- }
+ } while (size > 0);
}
-/* get data from the fifo (return -1 if not enough data) */
+/** get data from the fifo (return -1 if not enough data) */
int av_fifo_generic_read(AVFifoBuffer *f, int buf_size, void (*func)(void*, void*, int), void* dest)
{
- int len;
- int size = f->wptr - f->rptr;
- if (size < 0)
- size += f->end - f->buffer;
+ int size = av_fifo_size(f);
if (size < buf_size)
return -1;
- while (buf_size > 0) {
- len = FFMIN(f->end - f->rptr, buf_size);
- func(dest, f->rptr, len);
- f->rptr += len;
- if (f->rptr >= f->end)
- f->rptr = f->buffer;
+ do {
+ int len = FFMIN(f->end - f->rptr, buf_size);
+ if(func) func(dest, f->rptr, len);
+ else{
+ memcpy(dest, f->rptr, len);
+ dest = (uint8_t*)dest + len;
+ }
+ av_fifo_drain(f, len);
buf_size -= len;
- }
+ } while (buf_size > 0);
return 0;
}
-/* discard data from the fifo */
+/** discard data from the fifo */
void av_fifo_drain(AVFifoBuffer *f, int size)
{
f->rptr += size;