=====================================================
HEVC源代码分析文章列表:
【解码 -libavcodec HEVC 解码器】
FFmpeg的HEVC解码器源代码简单分析:概述
FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分
FFmpeg的HEVC解码器源代码简单分析:解码器主干部分
FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-PU
FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-TU
FFmpeg的HEVC解码器源代码简单分析:环路滤波(LoopFilter)
=====================================================
从这篇文章开始,简单分析记录FFmpeg中libavcodec的HEVC(H.265)解码器(HEVC Decoder)的源代码。本文综述整个解码器的框架,后续几篇文章再对解码器的内部模块进行分析。
下面解释一下图中关键标记的含义。
作为接口的结构体
FFmpeg和HEVC解码器之间作为接口的结构体有2个:ff_hevc_parser:用于解析HEVC码流的AVCodecParser结构体。ff_hevc_decoder:用于解码HEVC码流的AVCodec结构体。
函数背景色
函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:白色背景的函数:普通内部函数。粉红色背景函数:解析函数(Parser)。这些函数用于解析SPS、PPS等信息。绿色背景的函数:解码函数(Decode)。这些函数通过帧内预测、帧间预测、DCT反变换等方法解码压缩数据。黄色背景的函数:滤波函数(Filter)。这些函数对解码后的数据进行滤波,去除方块效应。蓝色背景函数:汇编函数(Assembly)。这些函数是做过汇编优化的函数。图中主要画出了这些函数的C语言版本,此外这些函数还包含MMX版本、SSE版本、NEON版本等。
箭头线
箭头线标志了函数的调用关系:黑色箭头线:不加区别的调用关系。粉红色的箭头线:解析函数(Parser)之间的调用关系。绿色箭头线:解码函数(Decode)之间的调用关系。黄色箭头线:环路滤波函数(Loop Filter)之间的调用关系。
函数所在的文件每个函数标识了它所在的文件路径。
下文简单记录几个关键的部分。
FFmpeg和HEVC解码器之间作为接口的结构体有2个:ff_hevc_parser和ff_hevc_decoder。
parser_init():初始化解析器。在ff_hevc_parser结构体中,上述几个函数指针分别指向下面几个实现函数:
parser_parse():解析。
parser_close():关闭解析器。
hevc_init():初始化HEVC解析器。
hevc_parse():解析HEVC码流。
hevc_close():关闭HEVC解析器。
init():初始化解码器。在ff_hevc_decoder结构体中,上述几个函数指针分别指向下面几个实现函数:
decode():解码。
close():关闭解码器。
hevc_decode_init():初始化HEVC解码器。
hevc_decode_frame():解码HEVC码流。
hevc_decode_free():关闭HEVC解码器。
ff_hevc_decode_nal_vps():解析VPS。
ff_hevc_decode_nal_sps():解析SPS。
ff_hevc_decode_nal_pps():解析PPS。
ff_hevc_decode_nal_sei():解析SEI。
hevc_init_context():初始化HEVC解码器上下文结构体。ff_hevc_decoder中hevc_parse()逐层调用的和解析Slice相关的函数:
hevc_decode_extradata():解析AVCodecContext中的extradata。
ff_hevc_decoder中hevc_decode_frame()逐层调用的和解码Slice相关的函数:
decode_nal_units(),decode_nal_unit(),hls_slice_data(),hls_decode_entry()等。
hevc_find_frame_end():查找NALU的结尾。
parse_nal_units():解析一个NALU。