美文网首页
FFmpeg笔记1——的常用API解读

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

作者: edison0428 | 来源:发表于2018-09-06 15:29 被阅读28次

    av_register_all

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

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

    • 注册复用器的函数是av_register_output_format
    • 注册解复用器的函数是av_register_input_format
    • 注册协议处理器的函数是ffurl_register_protocol

    avcodec_register_all()

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

    • 硬件加速器注册函数:av_register_hwaccel()
    • 编码器注册函数:avcodec_register()
    • parser注册函数:av_register_parser()
    • Bitstream Filter注册函数:av_register_bitstream_filter()

    内存的分配和释放

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

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

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

    • av_malloc()
      源码也自己去看,除去源码中一大推宏类似于CONFIG_MEMORY_POISONING,因为这个宏默认都是为0的,源码函数可精简为
    
    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(),并且做了一些错误检查的工作

    • av_realloc
      用于对申请的内存的大小进行调整
      av_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()

    • av_mallocz()
      av_mallocz()可以理解为av_mallocz()+zeromemory
      精简后
    
    void *av_mallocz(size_t size)
    {
        void *ptr = av_malloc(size);
        if (ptr)
            memset(ptr, 0, size);
        return ptr;
    }
    

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

    • av_calloc()
      它是简单的封装了av_mallocz()
    
    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个字节的内存

    • av_free()
      用于释放申请的内存,除去没用的宏之外,代码如下
    void av_free(void *ptr)
    {
        free(ptr);
    }
    

    就是封装了free()

    • av_freep()
      简单了封装了av_free(),并且在释放内存之后将目标指针设置为NULL
    
    void av_freep(void *arg)
    {
        void **ptr = (void **)arg;
        av_free(*ptr);
        *ptr = NULL;
    }
    

    相关文章

      网友评论

          本文标题:FFmpeg笔记1——的常用API解读

          本文链接:https://www.haomeiwen.com/subject/bvitgftx.html