1、结构体
typedef struct AVFifoBuffer {
uint8_t *buffer;
uint8_t *rptr, *wptr, *end;
uint32_t rndx, wndx;
} AVFifoBuffer;
2、申请fifo
/*
*分配单个size大小的fifo,其内部调用av_fifo_alloc_array(size, 1),失败返回NULL
*/
AVFifoBuffer *av_fifo_alloc(unsigned int size);
/*
*分配nmemb个大小为size的空间,失败返回NULL
*/
AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size);
3、释放fifo
/*
*释放fifo
*/
void av_fifo_free(AVFifoBuffer *f);
/*
*释放fifo,并且将f置为NULL
*/
void av_fifo_freep(AVFifoBuffer **f);
4、重置fifo
/*
*重置fifo
*/
void av_fifo_reset(AVFifoBuffer *f);
5、获取fifo内部数据大小
/*
*以字节数的方式返回当前在AVFifoBuffer中数据的大小,
*也就是你可以从当前AVFifoBuffer中读取数据的长度
*/
int av_fifo_size(const AVFifoBuffer *f);
6、获取fifo剩余容量
/*
*以字节数的方式返回当前AVFifoBuffer中剩余的容量,也就是你可以写入的内容的大小
*/
int av_fifo_space(const AVFifoBuffer *f);
7、读取fifo中的内容,(非丢弃方式,也就是不会将fifo中对应的数据擦除)
/*
*从当前AVFifoBuffer中的rptr += offset位置读取buf_size长度的数据到dest中;
*可以自定义读取函数,若没有自定义函数,则使用memcpy进行拷贝
*/
int av_fifo_generic_peek_at(AVFifoBuffer *f,
void *dest,
int offset,
int buf_size,
void (*func)(void*, void*, int));
/*
*从当前AVFifoBuffer中读取buf_size长度的数据到dest中;
*可以自定义读取函数
*/
int av_fifo_generic_peek(AVFifoBuffer *f,
void *dest,
int buf_size,
void (*func)(void*, void*, int));
8、读取fifo中的内容,(丢弃方式)
/*
*从AVFifoBuffe中读取buf_size长度的数据到dest中
*/
int av_fifo_generic_read(AVFifoBuffer *f,
void *dest,
int buf_size,
void (*func)(void*, void*, int));
9、写数据到fifo中
/*
*写size字节的数据到AVFifoBuffer中
*/
int av_fifo_generic_write(AVFifoBuffer *f,
void *src,
int size,
int (*func)(void*, void*, int));
10、重置fifo大小
int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);
11、增加fifo大小
int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space);
12、删除fifo中固定长度的内容
void av_fifo_drain(AVFifoBuffer *f, int size);
13、使用实例
#include
#include
#include "libavutil/fifo.h"
int main()
{
/* create a FIFO buffer */
AVFifoBuffer *fifo = av_fifo_alloc(13 * sizeof(int));
int i, out, num, *p;
/* fill data */
for (i = 0; av_fifo_space(fifo) >= sizeof(int); i++) {
av_fifo_generic_write(fifo, &i, sizeof(int), NULL);
}
/*
* 此时fifo中内容为:
* ------------------------------
* |0|1|2|3|4|5|6|7|8|9|10|11|12|
* ------------------------------
*/
/* peek_at at FIFO */
num = av_fifo_size(fifo) / sizeof(int);
for (i = 0; i < num; i++) {
av_fifo_generic_peek_at(fifo, &out, i * sizeof(int), sizeof(out), NULL);
printf("%d: %d\n", i, out);
}
printf("\n");
/* generic peek at FIFO */
num = av_fifo_size(fifo);
p = malloc(num);
if (p == NULL) {
fprintf(stderr, "failed to alloc memory.\n");
av_fifo_freep(&p);
exit(1);
}
(void)av_fifo_generic_peek(fifo, p, num, NULL);
/* read data at p */
num /= sizeof(int);
for (i = 0; i < num; i++) {
printf("%d: %d\n", i, p[i]);
}
printf("\n");
/* test *ndx overflow */
av_fifo_reset(fifo);
fifo->rndx = fifo->wndx = ~(uint32_t)0 - 5;
/* fill data */
for (i = 0; av_fifo_space(fifo) >= sizeof(int); i++) {
av_fifo_generic_write(fifo, &i, sizeof(int), NULL);
}
/* peek_at FIFO */
num = av_fifo_size(fifo) / sizeof(int);
for (i = 0; i < num; i++) {
av_fifo_generic_peek_at(fifo, &out, i * sizeof(int), sizeof(out), NULL);
printf("%d: %d\n", i, out);
}
printf("\n");
/* test fifo_grow */
(void)av_fifo_grow(fifo, 15 * sizeof(int));
/* fill data */
num = av_fifo_size(fifo) / sizeof(int);
for (i = num; av_fifo_space(fifo) >= sizeof(int); i++) {
av_fifo_generic_write(fifo, &i, sizeof(int), NULL);
}
/* peek_at at FIFO */
num = av_fifo_size(fifo) / sizeof(int);
for (i = 0; i < num; i++) {
av_fifo_generic_peek_at(fifo, &out, i * sizeof(int), sizeof(out), NULL);
printf("%d: %d\n", i, out);
}
av_fifo_free(fifo);
free(p);
return 0;
}