aboutsummaryrefslogtreecommitdiffhomepage
path: root/mpvcore/mp_ring.c
diff options
context:
space:
mode:
authorGravatar wm4 <wm4@nowhere>2013-12-17 02:39:45 +0100
committerGravatar wm4 <wm4@nowhere>2013-12-17 02:39:45 +0100
commit0112143fdaae0a6264d9e02355e9dc0ca4f7741c (patch)
treebbbe9527d1e1490e37b67d97398c5bc19c7794cd /mpvcore/mp_ring.c
parent73a5417950a2d21a397597c05521725f3d125993 (diff)
Split mpvcore/ into common/, misc/, bstr/
Diffstat (limited to 'mpvcore/mp_ring.c')
-rw-r--r--mpvcore/mp_ring.c138
1 files changed, 0 insertions, 138 deletions
diff --git a/mpvcore/mp_ring.c b/mpvcore/mp_ring.c
deleted file mode 100644
index d310aa4f46..0000000000
--- a/mpvcore/mp_ring.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * This file is part of mpv.
- * Copyright (c) 2012 wm4
- * Copyright (c) 2013 Stefano Pigozzi <stefano.pigozzi@gmail.com>
- *
- * mpv is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpv is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with mpv. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <inttypes.h>
-#include <libavutil/common.h>
-#include <assert.h>
-#include "talloc.h"
-#include "mpvcore/mp_memory_barrier.h"
-#include "mpvcore/mp_ring.h"
-
-struct mp_ring {
- uint8_t *buffer;
-
- /* Positions of the first readable/writeable chunks. Do not read this
- * fields but use the atomic private accessors `mp_ring_get_wpos`
- * and `mp_ring_get_rpos`. */
- uint32_t rpos, wpos;
-};
-
-static uint32_t mp_ring_get_wpos(struct mp_ring *buffer)
-{
- mp_memory_barrier();
- return buffer->wpos;
-}
-
-static uint32_t mp_ring_get_rpos(struct mp_ring *buffer)
-{
- mp_memory_barrier();
- return buffer->rpos;
-}
-
-struct mp_ring *mp_ring_new(void *talloc_ctx, int size)
-{
- struct mp_ring *ringbuffer =
- talloc_zero(talloc_ctx, struct mp_ring);
-
- *ringbuffer = (struct mp_ring) {
- .buffer = talloc_size(talloc_ctx, 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);
- mp_atomic_add_and_fetch(&buffer->rpos, drain_len);
- mp_memory_barrier();
- 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);
- int read_ptr = mp_ring_get_rpos(buffer) % size;
-
- 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);
-
- mp_atomic_add_and_fetch(&buffer->rpos, read_len);
- mp_memory_barrier();
-
- return read_len;
-}
-
-int mp_ring_write(struct mp_ring *buffer, unsigned char *src, int len)
-{
- int size = mp_ring_size(buffer);
- int free = mp_ring_available(buffer);
- int write_len = FFMIN(len, free);
- int write_ptr = mp_ring_get_wpos(buffer) % size;
-
- int len1 = FFMIN(size - write_ptr, write_len);
- int len2 = write_len - len1;
-
- memcpy(buffer->buffer + write_ptr, src, len1);
- memcpy(buffer->buffer, src + len1, len2);
-
- mp_atomic_add_and_fetch(&buffer->wpos, write_len);
- mp_memory_barrier();
-
- return write_len;
-}
-
-void mp_ring_reset(struct mp_ring *buffer)
-{
- buffer->wpos = buffer->rpos = 0;
- mp_memory_barrier();
-}
-
-int mp_ring_available(struct mp_ring *buffer)
-{
- return mp_ring_size(buffer) - mp_ring_buffered(buffer);
-}
-
-int mp_ring_size(struct mp_ring *buffer)
-{
- return talloc_get_size(buffer->buffer);
-}
-
-int mp_ring_buffered(struct mp_ring *buffer)
-{
- return (mp_ring_get_wpos(buffer) - mp_ring_get_rpos(buffer));
-}
-
-char *mp_ring_repr(struct mp_ring *buffer, void *talloc_ctx)
-{
- return talloc_asprintf(
- talloc_ctx,
- "Ringbuffer { .size = %dB, .buffered = %dB, .available = %dB }",
- mp_ring_size(buffer),
- mp_ring_buffered(buffer),
- mp_ring_available(buffer));
-}