ffmpeg源码简析(二)av_register_all(),avcodec_register_all()

原创 2017年04月24日 16:00:03

av_register_all()

该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用复用器,编码器等。

av_register_all()调用了avcodec_register_all()。avcodec_register_all()注册了和编解码器有关的组件:硬件加速器,解码器,编码器,Parser,Bitstream Filter。av_register_all()除了调用avcodec_register_all()之外,还注册了复用器,解复用器,协议处理器。

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

注册复用器的函数是av_register_output_format()。


    void av_register_output_format(AVOutputFormat *format)  
    {  
        AVOutputFormat **p;  
        p = &first_oformat;  
        while (*p != NULL) p = &(*p)->next;  
        *p = format;  
        format->next = NULL;  
    }  

注册解复用器的函数是av_register_input_format()。

//遍历链表并把当前的Input Format加到链表的尾部。
    void av_register_input_format(AVInputFormat *format)  
    {  
        AVInputFormat **p;  
        p = &first_iformat;  
        while (*p != NULL) p = &(*p)->next;  
        *p = format;  
        format->next = NULL;  
    } 

注册协议处理器的函数是ffurl_register_protocol()。

   int ffurl_register_protocol(URLProtocol *protocol)  
    {  
        URLProtocol **p;  
        p = &first_protocol;  
        while (*p)  
            p = &(*p)->next;  
        *p             = protocol;  
        protocol->next = NULL;  
        return 0;  
    } 

下面贴出它的源代码(allformats.c)

#include "avformat.h"  
#include "rtp.h"  
#include "rdt.h"  
#include "url.h"  
//定义的宏?宏的速度会快一点?注册AVOutputFormat  
//define中,#用来把参数转换成字符串,##则用来连接前后两个参数,把它们变成一个字符串。    
#define REGISTER_MUXER(X,x) { \  
    extern AVOutputFormat ff_##x##_muxer; \  
    if(CONFIG_##X##_MUXER) av_register_output_format(&ff_##x##_muxer); }  
//注册AVInputFormat  
#define REGISTER_DEMUXER(X,x) { \  
    extern AVInputFormat ff_##x##_demuxer; \  
    if(CONFIG_##X##_DEMUXER) av_register_input_format(&ff_##x##_demuxer); }  
//注册函数av_register_input_format  

//两个一起注册!  
#define REGISTER_MUXDEMUX(X,x)  REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)  
//注册URLProtocol  
//extern URLProtocol ff_##x##_protocol;  
//在librtmp中,对应的就是ff_rtmp_protocol  
//这样就把librtmp整合起来了  
//由此可见URLProtocol的名字是固定的  
#define REGISTER_PROTOCOL(X,x) { \  
    extern URLProtocol ff_##x##_protocol; \  
    if(CONFIG_##X##_PROTOCOL) ffurl_register_protocol(&ff_##x##_protocol, sizeof(ff_##x##_protocol)); }  
//注册函数ffurl_register_protocol  
void av_register_all(void)  
{  
    static int initialized;  

    if (initialized)  
        return;  
    initialized = 1;  
    //注册所有的codec  
    avcodec_register_all();  
    //注册所有的MUXER(复用器和解复用器)  
    /* (de)muxers */  
    REGISTER_MUXER    (A64, a64);  
    REGISTER_DEMUXER  (AAC, aac);  
    REGISTER_MUXDEMUX (AC3, ac3);  
    REGISTER_DEMUXER  (ACT, act);  
    REGISTER_DEMUXER  (ADF, adf);  

avcodec_register_all()

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

avcodec_register()的源代码:

//注册所有的AVCodec  遍历链表并把当前的AVCodec加到链表的尾部。
void avcodec_register(AVCodec *codec)  
{  
    AVCodec **p;  
    //初始化  
    avcodec_init();  
    //从第一个开始  
    p = &first_avcodec;  
    while (*p != NULL) p = &(*p)->next;  
    *p = codec;  
    codec->next = NULL;  

    if (codec->init_static_data)  
        codec->init_static_data(codec);  
} 

下面附上硬件加速器,编码器/解码器,parser,Bitstream Filter的注册代码。

硬件加速器注册函数是av_register_hwaccel()。


    void av_register_hwaccel(AVHWAccel *hwaccel)  
    {  
        AVHWAccel **p = last_hwaccel;  
        hwaccel->next = NULL;  
        while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, hwaccel))  
            p = &(*p)->next;  
        last_hwaccel = &hwaccel->next;  
    }  

编解码器注册函数是avcodec_register()。

    av_cold void avcodec_register(AVCodec *codec)  
    {  
        AVCodec **p;  
        avcodec_init();  
        p = last_avcodec;  
        codec->next = NULL;  

        while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, codec))  
            p = &(*p)->next;  
        last_avcodec = &codec->next;  

        if (codec->init_static_data)  
            codec->init_static_data(codec);  
    } 

parser注册函数是av_register_codec_parser()。


    void av_register_codec_parser(AVCodecParser *parser)  
    {  
        do {  
            parser->next = av_first_parser;  
        } while (parser->next != avpriv_atomic_ptr_cas((void * volatile *)&av_first_parser, parser->next, parser));  
    } 

Bitstream Filter注册函数是av_register_bitstream_filter()。


    void av_register_bitstream_filter(AVBitStreamFilter *bsf)  
    {  
        do {  
            bsf->next = first_bitstream_filter;  
        } while(bsf->next != avpriv_atomic_ptr_cas((void * volatile *)&first_bitstream_filter, bsf->next, bsf));  
    } 

后两个函数中的avpriv_atomic_ptr_cas()定义如下。


    void *avpriv_atomic_ptr_cas(void * volatile *ptr, void *oldval, void *newval)  
    {  
        if (*ptr == oldval) {  
            *ptr = newval;  
            return oldval;  
        }  
        return *ptr;  
    }  

图结:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ffmpeg实战教程(十二)为视频添加/更换背景音乐

2017年,各种关于视频处理的功能层出不穷,现在基本上大多APP都有视频上传播放功能。 然而上传,播放可用的优秀框架有很多,我们在此就不说了。 本篇我们就做一个用ffmpeg给视频添加/更换背景音...

FFmpeg学习—Android 编译x264 库

android 编译x264

[9]【ffmpeg源码分析 1】av_register_all()和avcodec_register_all()

日期:2016.10.18 作者:isshe github:github.com/isshe 邮箱:i.sshe@outlook.com 前言接下来打算学习一下编解码,不过好...

ffmpeg源码分析之av_register_all()

1.muxer/demuxer使用的结构是AVOutp

ffmpeg 源代码简单分析 : avcodec_register_all()

本文分析一下ffmpeg注册编解码器等的函数avcodec_register_all()(注意不是av_register_all(),那是注册所有东西的)。该函数在所有基于ffmpeg的应用程序中几乎...

ffmpeg 源代码简单分析 : av_register_all()

前一阵子看了一下ffmpeg的源代码,并且做了一些注释,在此贴出来以作备忘。 本文分析一下ffmpeg注册复用器,编码器等的函数av_register_all()。该函数在所有基于ffmpeg的应用程...

qt 工程添加 ffmpeg(undefined reference to av_register_all() 和 “UINT64_C” was not declared in this scope)

前提是 已经安装好qt 环境 步骤一: 到ffmpeg官网 下载 win平台 编译好的 shared+dev 版本的开发包,获取到  ffmpeg的头文件和 lib ,dll 步骤二: 添加ffmpe...

ffmpeg源码简析(八)解码 av_read_frame(),avcodec_decode_video2(),avformat_close_input()

1.av_read_frame()av_read_frame()的作用是读取码流中的音频若干帧或者视频一帧。例如,解码视频的时候,每解码一个视频帧,需要先调用 av_read_frame()获得一帧视...

FFmpeg源代码简单分析:libavdevice的avdevice_register_all()

本文记录一下FFmpeg中libavdevice注册设备的函数avdevice_register_all()。avdevice_register_all()的注册方式和av_register_all(...

FFmpeg源代码简单分析:libavdevice的avdevice_register_all()

转载:http://blog.csdn.net/leixiaohua1020/article/details/41211121 ====================================...
  • flyztek
  • flyztek
  • 2017年06月30日 15:55
  • 150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ffmpeg源码简析(二)av_register_all(),avcodec_register_all()
举报原因:
原因补充:

(最多只允许输入30个字)