=====================================================

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(H.265)解码器的函数调用关系图例如以下所看到的。

 

以下解释一下图中关键标记的含义。

作为接口的结构体
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解码器之间作为接口的结构体

FFmpeg和HEVC解码器之间作为接口的结构体有2个:ff_hevc_parser和ff_hevc_decoder。

ff_hevc_parser

ff_hevc_parser是用于解析HEVC码流的AVCodecParser结构体。

AVCodecParser中包括了几个重要的函数指针:

parser_init():初始化解析器。

parser_parse():解析。
parser_close():关闭解析器。

在ff_hevc_parser结构体中,上述几个函数指针分别指向以下几个实现函数:

hevc_init():初始化HEVC解析器。
hevc_parse():解析HEVC码流。
hevc_close():关闭HEVC解析器。

ff_hevc_decoder

ff_hevc_decoder是用于解码HEVC(H.265)码流的AVCodec结构体。

AVCodec中包括了几个重要的函数指针:

init():初始化解码器。
decode():解码。
close():关闭解码器。

在ff_hevc_decoder结构体中,上述几个函数指针分别指向以下几个实现函数:

hevc_decode_init():初始化HEVC解码器。
hevc_decode_frame():解码HEVC码流。
hevc_decode_free():关闭HEVC解码器。

解析函数(Parser)

解析函数(Parser)用于解析HEVC码流中的一些信息(比如SPS、PPS、Slice Header等)。在parse_nal_units()和decode_nal_units()中都调用这些解析函数完毕了解析。

以下举几个解析函数的样例:

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解码器中还没有进行分类的函数。以下举几个样例。

ff_hevc_decoder中hevc_decode_init()调用的初始化函数:

hevc_init_context():初始化HEVC解码器上下文结构体。
hevc_decode_extradata():解析AVCodecContext中的extradata。
ff_hevc_decoder中hevc_decode_frame()逐层调用的和解码Slice相关的函数:
decode_nal_units()。decode_nal_unit(),hls_slice_data(),hls_decode_entry()等。

ff_hevc_decoder中hevc_parse()逐层调用的和解析Slice相关的函数:

hevc_find_frame_end():查找NALU的结尾。

parse_nal_units():解析一个NALU。

hls_decode_entry()

hls_decode_entry()是FFmpeg的HEVC解码器真正的解码函数。当中调用了解码函数和滤波函数HEVC中的CTU进行处理。在HEVC中CTU(Coding tree unit, 编码树单元)即相应H.264中的MB(Macroblock。 宏块)。

解码函数(Decode)

解码函数(Decode)通过帧内预測、帧间预測等方法解码CTU压缩数据。

CTU解码模块相应的函数是hls_coding_quadtree()。hls_coding_quadtree()用于解析HEVC码流的四叉树结构的句法。是一个递归调用的函数。当解析到单个CU的时候,会调用CU的解码函数hls_coding_unit()。
hls_coding_unit()会调用hls_prediction_unit()和hls_transform_tree()分别对CU中的PU和TU进行处理。hls_prediction_unit()会调用luma_mc_uni()或者调用luma_mc_bi()进行预測。hls_transform_tree()用于解析TU的四叉树结构的句法,是一个递归调用的函数。当解析到单个TU的时候,会调用hls_transform_unit()对TU进行处理。

环路滤波函数(Loop Filter)

环路滤波函数(Loop Filter)对解码后的数据进行滤波,去除方块效应和振铃效应。滤波模块相应的环路滤波函数是ff_hevc_hls_filters()。

ff_hevc_hls_filters()调用了ff_hevc_hls_filter()。而ff_hevc_hls_filter()调用去块效应滤波器函数deblocking_filter_CTB()去除解码过程中的块效应。调用SAO滤波器函数sao_filter_CTB()去除解码过程中的振铃效应。

汇编函数(Assembly)

汇编函数(Assembly)是做过汇编优化的函数。为了提高效率,整个HEVC解码器中包括了大量的汇编函数。实际解码的过程中。FFmpeg会依据系统的特性调用相应的汇编函数(而不是C语言函数)以提高解码的效率。假设系统不支持汇编优化的话。FFmpeg才会调用C语言版本号的函数。

至此FFmpeg的HEVC解码器的结构就大致梳理完毕了。

雷霄骅
leixiaohua1020@126.com
http://blog.csdn.net/leixiaohua1020

FFmpeg的HEVC解码器源码简单分析:概述的更多相关文章

  1. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  2. FFmpeg的HEVC解码器源码简单分析:解码器主干部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  3. FFmpeg源码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  4. FFmpeg源码简单分析:结构体成员管理系统-AVOption

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  5. Django-session中间件源码简单分析

    Django-session中间件源码简单分析 settings里有关中间件的配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlew ...

  6. negroni-gzip源码简单分析解读

    negroni-gzip源码简单分析解读 这是一个为Negroni设计的gzip压缩处理中间件,需要用到已有的compress中的gzip,阅读了不长的源码之后,总结了一些关键要点和注意点. 检查是否 ...

  7. urllib源码简单分析

    对下面这段代码做分析 import urllib params = urllib.urlencode({'wd': 'python'}) f = urllib.urlopen("http:/ ...

  8. CardboardSDK-iOS 源码简单分析

    该项目地址: 地址 克隆地址为 https://github.com/rsanchezsaez/CardboardSDK-iOS.git 目前如果想在iOS设备上实现双目VR的功能,Google 已经 ...

  9. MongoDB 默认写入关注保存数据丢失问题与源码简单分析

    MongoDB 默认写入关注可能保存数据丢失问题分析 问题描述: EDI服务进行优化,将原有MQ发送成功并且DB写入成功,两个条件都达成,响应接收订单数据成功,修改为只有有一个条件成功就响应接收数据成 ...

随机推荐

  1. ansys中的.full文件中如何看刚度矩阵和质量矩阵(转)

    http://fffff-2001.blog.163.com/blog/static/15507529200722492917460 Q:请问ansys中的.full文件中如何看刚度矩阵和质量矩阵? ...

  2. PHP 中 include() 与 require() 的区别说明

    引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. require 的使用方法如 require("MyRequireFile.php"); . ...

  3. tomcat修改编码格式

    在TOMCAT中的conf文件夹下server.xml中的 <Connector中添加两个设置useBodyEncodingForURI="true" //设置POST和GE ...

  4. 10C++类和对象

    类和对象 8.1 面向对象程序设计方法概述 到目前为止,我们介绍的是C++在面向过程的程序设计中的应用.对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时的数据结构及对其 ...

  5. MSYS2 使用

    在Windows下编译mongo-c-driver 1.3.x 在Windows下编译mongo-c-driver 1.3.x 1.安装 MSYS2https://sourceforge.net/pr ...

  6. source collection list

    1.Anaconda:http://www.cnblogs.com/xiaoming123abc/p/6970890.html https://conda.io/docs/help-support.h ...

  7. css一个div设置多个背景图片

    html:定义一个div <div class="item__content"></div> css:样式 .item__content { positio ...

  8. 2019浙师大校赛(浙大命题)(upc复现赛)总结

    2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...

  9. SpringBoot中部署Swagger2和Swagger-UI

    1 Gradle配置在dependencies中添加以下依赖: implementation("io.springfox:springfox-swagger2:2.7.0") im ...

  10. nginx+redis安装配置(内存型数据库)实现session的共享

    注意:借鉴原文章:http://www.cnblogs.com/roy-blog/p/7196054.html 感兴趣的可以加一下481845043 java交流群,共同进步. 1 session的概 ...