FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
fifo.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include "libavutil/fifo.h"
22 
23 int main(void)
24 {
25  /* create a FIFO buffer */
26  AVFifoBuffer *fifo = av_fifo_alloc(13 * sizeof(int));
27  int i, j, n, *p;
28 
29  /* fill data */
30  for (i = 0; av_fifo_space(fifo) >= sizeof(int); i++)
31  av_fifo_generic_write(fifo, &i, sizeof(int), NULL);
32 
33  /* peek at FIFO */
34  n = av_fifo_size(fifo) / sizeof(int);
35  for (i = -n + 1; i < n; i++) {
36  int *v = (int *)av_fifo_peek2(fifo, i * sizeof(int));
37  printf("%d: %d\n", i, *v);
38  }
39  printf("\n");
40 
41  /* peek_at at FIFO */
42  n = av_fifo_size(fifo) / sizeof(int);
43  for (i = 0; i < n; i++) {
44  av_fifo_generic_peek_at(fifo, &j, i * sizeof(int), sizeof(j), NULL);
45  printf("%d: %d\n", i, j);
46  }
47  printf("\n");
48 
49  /* generic peek at FIFO */
50 
51  n = av_fifo_size(fifo);
52  p = malloc(n);
53  if (p == NULL) {
54  fprintf(stderr, "failed to allocate memory.\n");
55  exit(1);
56  }
57 
58  (void) av_fifo_generic_peek(fifo, p, n, NULL);
59 
60  /* read data at p */
61  n /= sizeof(int);
62  for(i = 0; i < n; ++i)
63  printf("%d: %d\n", i, p[i]);
64 
65  putchar('\n');
66 
67  /* read data */
68  for (i = 0; av_fifo_size(fifo) >= sizeof(int); i++) {
69  av_fifo_generic_read(fifo, &j, sizeof(int), NULL);
70  printf("%d ", j);
71  }
72  printf("\n");
73 
74  /* test *ndx overflow */
75  av_fifo_reset(fifo);
76  fifo->rndx = fifo->wndx = ~(uint32_t)0 - 5;
77 
78  /* fill data */
79  for (i = 0; av_fifo_space(fifo) >= sizeof(int); i++)
80  av_fifo_generic_write(fifo, &i, sizeof(int), NULL);
81 
82  /* peek_at at FIFO */
83  n = av_fifo_size(fifo) / sizeof(int);
84  for (i = 0; i < n; i++) {
85  av_fifo_generic_peek_at(fifo, &j, i * sizeof(int), sizeof(j), NULL);
86  printf("%d: %d\n", i, j);
87  }
88  putchar('\n');
89 
90  /* test fifo_grow */
91  (void) av_fifo_grow(fifo, 15 * sizeof(int));
92 
93  /* fill data */
94  n = av_fifo_size(fifo) / sizeof(int);
95  for (i = n; av_fifo_space(fifo) >= sizeof(int); ++i)
96  av_fifo_generic_write(fifo, &i, sizeof(int), NULL);
97 
98  /* peek_at at FIFO */
99  n = av_fifo_size(fifo) / sizeof(int);
100  for (i = 0; i < n; i++) {
101  av_fifo_generic_peek_at(fifo, &j, i * sizeof(int), sizeof(j), NULL);
102  printf("%d: %d\n", i, j);
103  }
104 
105  av_fifo_free(fifo);
106  free(p);
107 
108  return 0;
109 }
#define NULL
Definition: coverity.c:32
int av_fifo_grow(AVFifoBuffer *f, unsigned int size)
Enlarge an AVFifoBuffer.
Definition: fifo.c:107
int main(void)
Definition: fifo.c:23
uint32_t rndx
Definition: fifo.h:34
int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
Definition: fifo.c:189
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
Definition: fifo.c:122
int av_fifo_space(const AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
Definition: fifo.c:82
void av_fifo_free(AVFifoBuffer *f)
Free an AVFifoBuffer.
Definition: fifo.c:55
static uint8_t * av_fifo_peek2(const AVFifoBuffer *f, int offs)
Return a pointer to the data stored in a FIFO buffer at a certain offset.
Definition: fifo.h:169
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
Definition: fifo.c:213
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
int n
Definition: avisynth_c.h:684
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
Definition: fifo.c:77
int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void(*func)(void *, void *, int))
Feed data at specific position from an AVFifoBuffer to a user-supplied callback.
Definition: fifo.c:151
a very simple circular buffer FIFO implementation
uint32_t wndx
Definition: fifo.h:34
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
Definition: fifo.c:43
void av_fifo_reset(AVFifoBuffer *f)
Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied...
Definition: fifo.c:71