FFmpeg在解码一个视频的时候的函数调用流程。为了保证结构清晰,其中仅列出了最关键的函数,剔除了其它不是特别重要的函数。
下面解释一下图中关键标记的含义。
函数背景色
函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:- 粉红色背景函数:FFmpeg的API函数。
- 白色背景的函数:FFmpeg的内部函数。
- 黄色背景的函数:URLProtocol结构体中的函数,包含处理协议(Protocol)的功能。
- 绿色背景的函数:AVInputFormat结构体中的函数,包含处理封装格式(Format)的功能。
- 蓝色背景的函数:AVCodec结构体中的函数,包含了编解码器(Codec)的功能。
区域
整个架构图可以分为以下几个区域:- 左边区域——架构函数区域:这些函数并不针对某一特定的视频格式。
- 右上方黄色区域——协议处理函数区域:不同的协议(RTP,RTMP,FILE)会调用不同的协议处理函数。
- 右边中间绿色区域——封装格式处理函数区域:不同的封装格式(MKV,FLV,MPEGTS,AVI)会调用不同的封装格式处理函数。
- 右边下方蓝色区域——编解码函数区域:不同的编码标准(HEVC,H.264,MPEG2)会调用不同的编解码函数。
箭头线
为了把调用关系表示的更明显,图中的箭头线也使用了不同的颜色:
黑色箭头线:标志了函数之间的调用关系。
红色的箭头线:标志了解码的流程。
其他颜色的箭头线:标志了函数之间的调用关系。其中:
调用URLProtocol结构体中的函数用黄色箭头线标识;
调用AVInputFormat结构体中的函数用绿色箭头线标识;
调用AVCodec结构体中的函数用蓝色箭头线标识。
函数所在的文件
每个函数旁边标识了它所在的文件的路径。
函数调用关系
下面简单列出几个区域中函数之间的调用关系(函数之间的调用关系使用缩进的方式表现出来)。
左边区域(FFmpeg架构函数)
1. av_register_all()
1) avcodec_register_all()
(a) REGISTER_HWACCEL()
(b) REGISTER_ENCODER()
(c) REGISTER_DECODER()
(d) REGISTER_PARSER()
(e) REGISTER_BSF()
2) REGISTER_MUXER()
3) REGISTER_DEMUXER()
4) REGISTER_PROTOCOL()
2. avformat_alloc_context()
1) av_malloc(sizeof(AVFormatContext))
2) avformat_get_context_defaults()
(a) av_opt_set_defaults()
3. avformat_open_input()
1) init_input()
(a) avio_open2()
a) ffurl_open()
i. ffurl_alloc()
l url_find_protocol()
l url_alloc_for_protocol()
ii. ffurl_connect()
URLProtocol->url_open()
b) ffio_fdopen()
i. av_malloc(buffer_size)
ii. avio_alloc_context()
l av_mallocz(sizeof(AVIOContext))
l