HM学习笔记_来自博客

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HEVC学习(二)—— HM的整体结构及一些基本概念

7个工程

1. TAppCommon

2. TAppDecoder

3. TAppEncoder

4. TlibCommon

5. TLibDecoder

6. TLibEncoder

7. TLibVideoIO

'T'代表'Test'(这一个的理解可能有误),'App'代表'Application',表明该工程主要包含一些应

用函数'Lib'代表'Library',表明该工程主要包含一些库函数。'Common'表明该工程包含的一些函数是编码器和解码器共用的,'Decoder'表明该工程包含的函数是解码器使用的,而

'Encoder'表明该工程包含的函数是编码器使用的。'VideoIO'工程主要是实现对YUV文件的读写操作。

编码器和解码器的主函数分别在encmain.cpp和decmain.cpp中,相信光看源文件名都能看

出来了。

(1)类的命名:

(2)变量的命名:

(3)函数的命名:

HEVC学习(三)—— 帧内预测系列之一

fillReferenceSamples函数(填补当前PU周围相关的样本值)——Void TComPattern::fillReferenceSamples

——图像2(左上角为4个像素点,如无强调则以块为单位计算长度等?)PS:此处有两块图像:重建的YUV的大图像1、相对应的专用于预测的PU及其周边的参考样点图像2

Pel*piRoiTemp——指向重建Yuv图像1 的位置(临时使用,指向可随意变动)

Pel*piRoiOrigin——指向重建Yuv图像1对应于当前PU所在位置的首地址(对当前PU固定)Int*piAdiTemp——图像 2 的感兴趣位置(变动的,用于赋值)

iPicStride——重建YUV图像1的宽

iNumIntraNeighbor——指示PU周边可用邻块数

uiWidth= uiCuWidth*2+1——图像2的宽,uiHeight= uiCuHeight*2+1——图像2的高uiCuWidth ——图像2的CurrentPU部分的宽,uiCuHeight——图像2的CurrentPU部分的高iTotalSamples——总样点数

iTotalUnits——以4x4块为单位的块数

iUnitSize——块的大小

主要功能是在真正进行帧内预测之前,使用重建后的Yuv图像对当前PU(Predict Unit预测

单元)的相邻样点进行赋值,为接下来进行的角度预测提供参考样点值。

PS:关于一个PU的相邻点,以及它的相邻点的可用性如何判断的问题,是一个细节问题,

并不会影响我们对这个函数实现功能的理解。

PS:reference samples are partially available部分没看,也看不懂

每个4x4块里的4个样点分别被赋值为对应位置的重建Yuv的样点值?(4*4块中不是16个样点吗)

HEVC学习(四)—— 帧内预测系列之二

CU、PU地址计算方法

光栅扫描,即从左往右,由上往下,先扫描完一行,再移至下一行起始位置继续扫描。H.264使用的主要就是光栅扫描顺序。HEVC里同样也有光栅扫描顺序,但是,由于它对CU采用的是递归划分的方式,如果仍是采用光栅扫描顺序,对CU的寻址会很不方便。

HEVC定义了Z扫描顺序

Z扫描是针对一个CU来说的,它是用于递归扫描CU的分割。定位一幅图像中的一个CU (或其分割)大致是这么个过程,首先,由于CU的尺寸的最大值是已知的,会根据这个定

位到该CU左上角相对于图像左上角的位置,即得到它的坐标,接着,才是对当前块进行Z 扫描,单位是4x4块,换句话说,Z扫描地址是对一个CU有效的,不能直接使用这个地址来确定它在图像中的位置。

HEVC学习(五)—— 帧内预测系列之三

initAdiPattern函数(预测的前期准备,得到PU的过程)——Void TComPattern::initAdiPattern

获得iNumIntraNeighbor、bNeighborFlags等——将参数传入(一)中的fillReferenceSamples 函数赋值——对周围样点进行3抽头的平滑滤波

主要功能有三个

(1)检测当前PU的相邻样点包括左上、上、右上、左、左下邻域样点值的可用性,或者

说检查这些点是否存在;

(2)参考样点的替换过程;(二)中已介绍过

(3)相邻样点即参考样点的平滑滤波。

Bool bNeighborFlags[4*MAX_NUM_SPU_W+1]——指示4个方向上相邻样点值的可用性piAdiBuf= piAdiTemp

iNumUnitsInCu=uiCuWidth/iUnitSize;——CurrentPU宽(以块为单位,暂时理解4*4块宽4)iTotalUnits=(iNumUnitsInCu<<2)+1——左下、左、上、右上、1左上角

isAboveAvailable函数——计算返回左边可用邻块数

Int iBufSize =uiCuHeight2+uiCuWidth2+1;——滤波缓存区的大小,相邻块的个数

UInt uiWH= uiWidth*uiHeight——一个缓存区中的元素个数,图像2中块的总总个数piAdiBuf——指向滤波前的参考样点的首地址

piFilterBuf——将piAdiBuf所有参考样点拷贝到此区域——经过滤波后所得值保存在

piFilterBufN中——存放滤波后样点值的区域

piFilterBuf1——经过滤波的样点值(与piAdiBuf相差uiWH,因为滤波前后的值顺序存放)

存放顺序:piAdiBuf—大小uiWH—piFilterBuf1—uiWH—piFilteredBuf2—uiWH—piFilterBuf—iBufSize(周边样本块数,只有这些才参与滤波)—piFilterBufN

PS:piAdiBuf、piFilterBuf1按照图像顺序存放,piFilterBuf、piFilterBufN将周边样点顺序存放,

方便滤波

Q:获取当前PU左上角LT,右上角RT以及左下角LB以4x4块为单位的Zorder?不懂HEVC参考软件代码总结

1.编码器程序从"TAppEncoder"工程中的encmain.cpp文件开始的,此文件中包含程序运行的

入口函数"main",在main函数中主要做了编码器对象的创建、分析配置文件,初始化配置

参数,和编码器最重要的功能"encode"。

2.在"encode"函数中,主要实现了读取YUV文件的数据、初始化工具对象例如:GOPEncoder、SliceEncoder、CUEncder……。在此函数里,还包括一个encode函数,调用CompressGOP 函数来具体执行编码任务。

3.在CompressGOP函数中,完成了以下的功能:

一,InitGOP将文件的码流分成若干GOP以便后续程序能够顺利执行。

相关文档
最新文档