HEVC官方软件HM源代码简单分析-编码器TAppEncoder

原创 2015年11月23日 22:46:49

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

H.264/H.265 官方源代码分析文章:

H.264官方软件JM源代码简单分析-编码器lencod

H.264官方软件JM源代码简单分析-解码器ldecod

HEVC官方软件HM源代码简单分析-编码器TAppEncoder

HEVC官方软件HM源代码简单分析-解码器TAppDecoder

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


上一篇文章总结了HEVC官方参考软件HM中的视频解码器TAppDecoder的结构,本文继续分析HM中的视频编码器TAppEncoder。


函数调用关系图

HM中的HEVC视频编码器TAppEncoder的函数调用关系图如下所示。


单击查看更清晰的大图


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


函数背景色

函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:
白色背景的函数:不加区分的普通内部函数。
黄色背景函数:滤波函数(Filter)。用于环路滤波,半像素插值,SSIM/PSNR的计算。
绿色背景的函数:CU编码函数(Encode)。通过对残差的DCT变换、量化等方式对CU进行编码。
紫色背景的函数:熵编码函数(Entropy Coding)。对CU编码后的数据进行CABAC熵编码。
浅蓝色背景函数:码率控制函数(Rate Control)。对码率进行控制的函数。

箭头线
箭头线标志了函数的调用关系:
黑色箭头线:不加区别的调用关系。
黄色箭头线:滤波函数(Filter)之间的调用关系。
绿色箭头线:CU编码函数(Encode)之间的调用关系。
紫色箭头线:熵编码函数(Entropy Coding)之间的调用关系。
 
函数所在的文件

每个函数标识了它所在的文件路径。


下文记录结构图中的几个关键部分。


普通内部函数

普通内部函数指的是TAppEncoder中还没有进行分类的函数。例如:
编码器的main()函数中调用的TAppEncTop类的配置读取函数parseCfg()、编码函数encode()等。
编码器最主要的函数:TEncTop中的encode()、TEncGOP中的compressGOP()、TEncSlice的compressSlice()等。

CU编码函数

CU编码函数通过运动估计、DCT变换、量化等步骤对图像数据进行编码。编码的工作都是在TEncCu类中的compressCtu()中完成的。compressCtu()调用了xCompressCU()完成了CU的编码工作。xCompressCU()本身是一个递归调用的函数,其中的xCheckRDCostInter()完成了分析帧间CU编码代价的工作;其中的xCheckRDCostIntra()则完成了分析帧内CU编码代价的工作。

熵编码函数

熵编码函数使用CABAC的方式对CU编码后的数据进行熵编码。熵编码的工作都是在TEncCu类中的encodeCtu()中完成的。


环路滤波函数

环路滤波函数对重建帧数据进行滤波,去除方块效应和振铃效应。TComLoopFilter类的loopFilterPic()完成了去块效应滤波器的工作; TComSampleAdaptiveOffset类的SAOProcess()完成了去除振铃效应的SAO滤波器的工作。

码率控制函数

码率控制模块函数分布在lencod源代码不同的地方,包括rc_init_seq()、rc_init_GOP()、rc_init_frame()、rc_handle_mb()等。



雷霄骅

leixiaohua1020@126.com

http://blog.csdn.net/leixiaohua1020


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

HM编码器代码阅读(22)——cabac的流程

TEncSbac::resetEntropy函数详解(熵编码的初始化过程): 这个函数的实质就是初始化各种上下文 // 重置熵编码器 Void TEncSbac::resetEntropy ...

HEVC帧间预测之四——运动估计(一)

其实HM的运动估计这部分与H.264相比基本没有变化,如果看过JMVC运动估计的代码,会发现xTZSearch的结构几乎就是一样的。所以,严格来讲,这部分的东西没有什么太多新鲜的东西,相信以前研究过T...
  • HEVC_CJL
  • HEVC_CJL
  • 2013年03月17日 22:36
  • 13701

HM代码阅读:帧内预测(一)

本文的代码均是TEncSearch::estIntraPredLumaQT函数或被它调用的函数中的代码。在TEncSearch::estIntraPredLumaQT函数中,首先确定RMD(Rough...

HM编码器代码阅读(1)——介绍以及相关知识

HM是HEVC(H.265)的开源实现,可以从网上直接下载。 HEVC(H.265)是新一代的视频编解码标准。 本人目前研究的只是编码器部分,而且还是入门阶段!为了提高自己,边学边记,由于理解不够深入...

HM安装和使用方法

此文为学习JVET参考了HM的安装方法,转载自岳麓吹雪大牛的博客,膜拜。 早期的HM解决方案包含了7个工程:1. TAppCommon 2. TAppDecoder 3. TAppEncoder...

HEVC学习(一) —— HM的使用

从今天开始,会陆续发表HEVC学习过程中的一些总结,主要目的是与大家一起交流学习,由于水平有限,恳请大家能够不吝赐教。   由于这是第一次写博客,而且学习也是个循序渐进的过程,第一篇文章就简单介绍...
  • HEVC_CJL
  • HEVC_CJL
  • 2012年11月10日 15:45
  • 59405

HM13.0 TAppDecoder参数设置

最近研究HEVC,在使用过程中出现如下错误:

HEVC官方软件HM源代码简单分析-解码器TAppDecoder

本文记录HEVC官方参考软件HM的源代码结构。HM相比于JM来说,采用了面向对象的编程方法,因而结构相对更加清晰。HM包含了视频解码器TAppDecoder和视频编码器TAppEncoder。本文记录...

HEVC变换后残差系数编码原理

变换系数熵编码简介: 变换系数的扫描是基于4*4大小的子块进行的,子块和子块内部递归扫描。较大的TB首先被分割为多个4*4子块,扫描一般起始于最后一个系数,终止于DC系数,扫描包括子块的扫描和子...

HEVC残差系数解码代码详解

上一篇中主要介绍了编码中的原理,这里主要是结合HM中的代码介绍读残差系数的方法 HM变换系数熵解码简介:   初始一个TU对象 成员变量介绍:   public:     typedef enum ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HEVC官方软件HM源代码简单分析-编码器TAppEncoder
举报原因:
原因补充:

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