ffmpeg----avfifo.h

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;
}

你可能感兴趣的:(ffmpeg,音视频)