diff options
author | wm4 <wm4@nowhere> | 2014-05-29 02:24:05 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-05-29 02:24:05 +0200 |
commit | 690ea07b7a8a034303fa2b42a8c6854f9ba46f7f (patch) | |
tree | 9eb0621ea627db0d5c5b313cfb88ac309f516e95 /misc | |
parent | 3238cd3dac49d3f961314f16cf689863db0e92e2 (diff) | |
download | mpv-690ea07b7a8a034303fa2b42a8c6854f9ba46f7f.tar.bz2 mpv-690ea07b7a8a034303fa2b42a8c6854f9ba46f7f.tar.xz |
ring: implement drain in terms of read
I think this makes it easier to reason about it and avoids duplicate
logic.
Diffstat (limited to 'misc')
-rw-r--r-- | misc/ring.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/misc/ring.c b/misc/ring.c index 28e610c9bb..3db87f71f6 100644 --- a/misc/ring.c +++ b/misc/ring.c @@ -55,18 +55,8 @@ struct mp_ring *mp_ring_new(void *talloc_ctx, int size) return ringbuffer; } -int mp_ring_drain(struct mp_ring *buffer, int len) -{ - int buffered = mp_ring_buffered(buffer); - int drain_len = FFMIN(len, buffered); - atomic_fetch_add(&buffer->rpos, drain_len); - return drain_len; -} - int mp_ring_read(struct mp_ring *buffer, unsigned char *dest, int len) { - if (!dest) return mp_ring_drain(buffer, len); - int size = mp_ring_size(buffer); int buffered = mp_ring_buffered(buffer); int read_len = FFMIN(len, buffered); @@ -75,14 +65,21 @@ int mp_ring_read(struct mp_ring *buffer, unsigned char *dest, int len) int len1 = FFMIN(size - read_ptr, read_len); int len2 = read_len - len1; - memcpy(dest, buffer->buffer + read_ptr, len1); - memcpy(dest + len1, buffer->buffer, len2); + if (dest) { + memcpy(dest, buffer->buffer + read_ptr, len1); + memcpy(dest + len1, buffer->buffer, len2); + } atomic_fetch_add(&buffer->rpos, read_len); return read_len; } +int mp_ring_drain(struct mp_ring *buffer, int len) +{ + return mp_ring_read(buffer, NULL, len); +} + int mp_ring_write(struct mp_ring *buffer, unsigned char *src, int len) { int size = mp_ring_size(buffer); |