主要包括:
入口点函数main()【创建cTAppEncTop类,解析输入的配置函数,设定时间相关的参数】
cTAppEncTop.encode()【对编码器所使用的几个对象进行初始化,分配YUV数据缓存,循环读取YUV文件】
m_cTEncTop.encode(...)【调用m_cGOPEncoder.compressGOP()实现对一个GOP的实际编码】
m_cGOPEncoder.compressGOP()【调用initGOP设置GOP的参数;调用m_pcSliceEncoder->initEncSlice(),利用SPS和PPS中的信息创建编码的slice对象;调用m_pcSliceEncoder->compressSlice
( pcPic )对一个slice进行编码。】
m_pcSliceEncoder->compressSlice ( pcPic )【设置编码slice的参数,对slice的每一个cu进行处理】
TEncCu::compressCU()【编码一个CU】
以上各个函数分别在前一个函数中调用,形成类似一个反向的call stack的结构。
TEncCu::compressCU()函数的实现如下:
该函数的核心方法为xCompressCU( m_ppcBestCU[0], m_ppcTempCU[0], 0 )。该函数实现了编码一个CU的多种功能,首先判断尝试进行帧间预测,然后尝试进行帧内预测,另外还包括了PCM模式的编码以及一个CU的进一步划分等。这里主要关心的是intra模式,实现的代码为:
该函数调用的xCheckRDCostIntra实现了帧内预测的具体过程: