HM学习笔记_来自博客
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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以便后续程序能够顺利执行。