1 /*
2 * a very simple circular buffer FIFO implementation
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4 * Copyright (c) 2006 Roman Shaposhnik
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
26
28 {
30 if (!f)
31 return NULL;
37 return f;
38 }
39
41 {
42 if (f) {
45 }
46 }
47
49 {
52 }
53
55 {
56 return (uint32_t)(f->
wndx - f->
rndx);
57 }
58
60 {
62 }
63
65 {
66 unsigned int old_size = f->
end - f->
buffer;
67
68 if (old_size < new_size) {
71
72 if (!f2)
78 *f = *f2;
80 }
81 return 0;
82 }
83
85 {
86 unsigned int old_size = f->
end - f->
buffer;
89
91
92 if (old_size < size)
94 return 0;
95 }
96
97 /* src must NOT be const as it can be a context for func that may need
98 * updating (like a pointer or byte counter) */
100 int (*
func)(
void *,
void *,
int))
101 {
103 uint32_t wndx= f->
wndx;
105
106 do {
109 if (
func(src, wptr, len) <= 0)
110 break;
111 } else {
112 memcpy(wptr, src, len);
114 }
115 // Write memory barrier needed for SMP here in theory
121 } while (size > 0);
125 }
126
128 void (*
func)(
void *,
void *,
int))
129 {
130 // Read memory barrier needed for SMP here in theory
131 do {
135 else {
136 memcpy(dest, f->
rptr, len);
138 }
139 // memory barrier needed for SMP here in theory
142 } while (buf_size > 0);
143 return 0;
144 }
145
146 /** Discard data from the FIFO. */
148 {
154 }
155
156 #ifdef TEST
157
159 {
160 /* create a FIFO buffer */
163
164 /* fill data */
167
168 /* peek at FIFO */
170 for (i = -n + 1; i <
n; i++) {
172 printf("%d: %d\n", i, *v);
173 }
174 printf("\n");
175
176 /* read data */
179 printf("%d ", j);
180 }
181 printf("\n");
182
184
185 return 0;
186 }
187
188 #endif