FFmpeg笔记1——的常用API解读

2018-09-06  本文已影响28人  edison0428

av_register_all

该函数在所有基于FFmpeg的应用程序中几乎都是第一个被调用的
这个函数把全局的解码器,编码器等结构体注册到一些全局的对象表里,以便后面跑表调用
注册的类型:复用器,解复用器,编码器,解码器,包解析器,BitStreamFilter(位流处理器)等
av_register_all调用了avcodec_register_allavcodec_register_all注册了和编解码器有关的组件:硬件加速器,解码器,编码器,Parser,Bitstream Filter。av_register_all除了调用avcodec_register_all之外,还注册了复用器,解复用器,协议处理器

下面附上复用器,解复用器,协议处理器的代码

avcodec_register_all()

avcodec_register_all注册了和编解码器有关的组件:硬件加速器,解码器,编码器,Parser,Bitstream Filter。

内存的分配和释放

内存操作的几个常见函数位于 libavutil\mem.c

先说下size_t,这个类型在FFmpeg中多次出现,它的作用其实就是为了增强程序的可移植性而定义的,不同系统上,定义size_t可能不一样,它实际上就是unsigned int

为什么要内存对齐:内存对齐是什么就不说了,c语言的,很多也有点忘记了,直接看结论吧:内存不对齐对cpu对性能是有影响的


void *av_malloc(size_t size)
{
    void *ptr = NULL;
    /* let's disallow possibly ambiguous cases */
    if (size > (max_alloc_size - 32))
        return NULL;
    ptr = malloc(size);
    if(!ptr && !size) {
        size = 1;
        ptr= av_malloc(1);
    }
    return ptr;

所以可以看出来,av_malloc()只是封装了系统的malloc(),并且做了一些错误检查的工作


void *av_realloc(void *ptr, size_t size)
{
    /* let's disallow possibly ambiguous cases */
    if (size > (max_alloc_size - 32))
        return NULL;
    return realloc(ptr, size + !size);
}

可以看出来,av_realloc()其实就是封装系统的realloc()


void *av_mallocz(size_t size)
{
    void *ptr = av_malloc(size);
    if (ptr)
        memset(ptr, 0, size);
    return ptr;
}

可以看出来就是调用了av_malloc(size)之后,又调用memset()将分配的内存设置为0


void *av_calloc(size_t nmemb, size_t size)
{
    if (size <= 0 || nmemb >= INT_MAX / size)
        return NULL;
    return av_mallocz(nmemb * size);
}

从代码中可以看出,它调用av_mallocz()分配了nmemb * size个字节的内存

void av_free(void *ptr)
{
    free(ptr);
}

就是封装了free()


void av_freep(void *arg)
{
    void **ptr = (void **)arg;
    av_free(*ptr);
    *ptr = NULL;
}
上一篇下一篇

猜你喜欢

热点阅读