summaryrefslogtreecommitdiff
path: root/contrib/ffmpeg/libavutil/fifo.c
diff options
context:
space:
mode:
authorDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2007-04-03 01:18:24 +0200
committerDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2007-04-03 01:18:24 +0200
commitfb09531720a4aa2dfa97e5a9a246a453b6278fd2 (patch)
tree61525c3a8ddb419d3838a26e488fc3659079bbcd /contrib/ffmpeg/libavutil/fifo.c
parent294d01046724e28b7193bcb65bf2a0391b0135b6 (diff)
downloadxine-lib-fb09531720a4aa2dfa97e5a9a246a453b6278fd2.tar.gz
xine-lib-fb09531720a4aa2dfa97e5a9a246a453b6278fd2.tar.bz2
Sync with a more recent version of FFmpeg.
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;