




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、HEVC学习(二) HM的整体结构及一些基本概念 7个工程1. TAppCommon 2. TAppDecoder 3. TAppEncoder4. TlibCommon 5. TLibDecoder 6. TLibEncoder 7. TLibVideoIOT代表Test(这一个的理解可能有误),App代表Application,表明该工程主要包含一些应用函数Lib代表Library,表明该工程主要包含一些库函数。Common表明该工程包含的一些函数是编码器和解码器共用的,Decoder表明该工程包含的函数是解码器使用的,而Encoder表明该工程包含的函数是编码器使用的。VideoIO工程
2、主要是实现对YUV文件的读写操作。编码器和解码器的主函数分别在encmain.cpp和decmain.cpp中,相信光看源文件名都能看出来了。(1) 类的命名:(2) 变量的命名:(3) 函数的命名:HEVC学习(三) 帧内预测系列之一 fillReferenceSamples函数(填补当前PU周围相关的样本值)VoidTComPattern:fillReferenceSamples图像2(左上角为4个像素点,如无强调则以块为单位计算长度等?)PS:此处有两块图像:重建的YUV的大图像1、相对应的专用于预测的PU及其周边的参考样点图像2Pel*piRoiTemp指向重建Yuv图像1 的位置(临
3、时使用,指向可随意变动)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块为单位的块数iUnitSi
4、ze块的大小主要功能是在真正进行帧内预测之前,使用重建后的Yuv图像对当前PU(Predict Unit预测单元)的相邻样点进行赋值,为接下来进行的角度预测提供参考样点值。PS:关于一个PU的相邻点,以及它的相邻点的可用性如何判断的问题,是一个细节问题,并不会影响我们对这个函数实现功能的理解。PS:referencesamplesarepartiallyavailable部分没看,也看不懂每个4x4块里的4个样点分别被赋值为对应位置的重建Yuv的样点值?(4*4块中不是16个样点吗)HEVC学习(四) 帧内预测系列之二 CU、PU地址计算方法光栅扫描,即从左往右,由上往下,先扫描完一行,再移至
5、下一行起始位置继续扫描。H.264使用的主要就是光栅扫描顺序。HEVC里同样也有光栅扫描顺序,但是,由于它对CU采用的是递归划分的方式,如果仍是采用光栅扫描顺序,对CU的寻址会很不方便。HEVC定义了Z扫描顺序Z扫描是针对一个CU来说的,它是用 于递归扫描CU的分割。定位一幅图像中的一个CU(或其分割)大致是这么个过程,首先,由于CU的尺寸的最大值是已知的,会根据这个定位到该CU左上角相 对于图像左上角的位置,即得到它的坐标,接着,才是对当前块进行Z扫描,单位是4x4块,换句话说,Z扫描地址是对一个CU有效的,不能直接使用这个地址 来确定它在图像中的位置。HEVC学习(五) 帧内预测系列之三
6、initAdiPattern函数(预测的前期准备,得到PU的过程)VoidTComPattern:initAdiPattern获得iNumIntraNeighbor、bNeighborFlags等将参数传入(一)中的fillReferenceSamples函数赋值对周围样点进行3抽头的平滑滤波主要功能有三个(1)检测当前PU的相邻样点包括左上、上、右上、左、左下邻域样点值的可用性,或者说检查这些点是否存在;(2)参考样点的替换过程;(二)中已介绍过(3)相邻样点即参考样点的平滑滤波。BoolbNeighborFlags4*MAX_NUM_SPU_W+1指示4个方向上相邻样点值的可用性piAdi
7、Buf= piAdiTempiNumUnitsInCu=uiCuWidth/iUnitSize;CurrentPU宽(以块为单位,暂时理解4*4块宽4)iTotalUnits=(iNumUnitsInCu2)+1左下、左、上、右上、1左上角isAboveAvailable函数计算返回左边可用邻块数IntiBufSize =uiCuHeight2+uiCuWidth2+1;滤波缓存区的大小,相邻块的个数UIntuiWH= uiWidth*uiHeight一个缓存区中的元素个数,图像2中块的总总个数piAdiBuf指向滤波前的参考样点的首地址piFilterBuf将piAdiBuf所有参考样点拷贝
8、到此区域经过滤波后所得值保存在piFilterBufN中存放滤波后样点值的区域piFilterBuf1经过滤波的样点值(与piAdiBuf相差uiWH,因为滤波前后的值顺序存放)存放顺序:piAdiBuf大小uiWHpiFilterBuf1uiWHpiFilteredBuf2uiWHpiFilterBufiBufSize(周边样本块数,只有这些才参与滤波)piFilterBufNPS:piAdiBuf、piFilterBuf1按照图像顺序存放,piFilterBuf、piFilterBufN将周边样点顺序存放,方便滤波Q:获取当前PU左上角LT,右上角RT以及左下角LB以4x4块为单位的Zor
9、der?不懂HEVC参考软件代码总结 1.编码器程序从TAppEncoder工程中的encmain.cpp文件开始的,此文件中包含程序运行的入口函数main,在main函数中主要做了编码器对象的创建、分析配置文件,初始化配置参数,和编码器最重要的功能encode。2.在encode函数中,主要实现了读取YUV文件的数据、初始化工具对象例如:GOPEncoder、SliceEncoder、CUEncder。在此函数里,还包括一个encode函数,调用CompressGOP函数来具体执行编码任务。3.在CompressGOP函数中,完成了以下的功能:一,InitGOP将文件的码流分成若干GOP以便
10、后续程序能够顺利执行。 二,InitEncSlice创建编码的Slice。三,在此函数中,还包括preCompressSlice和CompressSlice两个函数,前者的作用是选择不同的lamuda进行编码(编码是调用了CompressCU函数,后续介绍),后者是在最好的lamuda下进行编码。四,循环滤波 五,(熵编码等,还没看)。4.在xCompressCU函数中(CompressCU函数的主体也是调用xComprssCU函数),先进行帧间预测xCheckRDCostMerge2Nx2N,xCheckRDCostInter等。在做完帧间预测后进行阵内预测,这是调用的函数是xCheckRD
11、CostIntra,在xCompressCU函数的后续部分,还递归调用自身以实现对每个CU的编码。变换编码在encodeCoeff中实现,量化在xCheckIntraPCM完成。5.xCheckRDCostIntra函数,主要完成帧内预测的任务,对亮度的预测使用estIntraPredQT,对色度使用estIntraPredChromaQT。6.estIntraPredQT函数,在思想对亮度的处理和色度的处理是一样的,所以只介绍亮度的处理函数。在estIntraPredQT函数中,主要完成了RDCost的选择,在其中predIntraLumaAng函数实现了方向的预测;calcHAD函数计算了
12、SATD;xModeBitsIntra函数计算编码的码率;xUpdateCandList更新了最好的RDCost所使用的模式。HEVC学习(六) 帧内预测系列之四 实现亮度分量帧内预测的主函数的大体框架estIntraPredQT函数(实现亮度分量帧内预测)HEVC学习(七) 帧内预测系列之五 predIntraLumaAng函数VoidTComPrediction: predIntraLumaAng帧内预测的最为重要的函数之一predIntraLumaAng1. getPreditorPtr函数Int*TComPattern:getPredictorPtrInt*ptrSrc获得指向参考样点
13、首地址的指针数组m_aucIntraFilter里面存放了不同PU尺寸下滤波的阈值getAdiOrgBuf函数返回指向未经滤波的参考样点的首地址sw=2*iWidth+1?(ptrSrc指向的是当前PU的左上邻点,故加上2*iWidth指向下一行即当前PU的左邻点,加1指向当前PU的首地址)PS:若帧内预测模式满足滤波的条件,则返回的指针要加上uiWH(详见(五)2. 根据帧内预测模式调用以下函数xPredIntraPlanar函数进行Intra_Planar模式预测xPredIntraAng函数进行Intra_DC、Intra_Angular(有角度的)模式预测3. xDCPredFilte
14、ring函数VoidTComPrediction:xDCPredFilteringxDCPredFiltering(ptrSrc+sw+1,sw,pDst,uiStride,iWidth,iHeight)sw=2*iWidth+1?xDCPredFiltering(Int*pSrc,IntiSrcStride,Pel*&rpDst,IntiDstStride,IntiWidth,IntiHeight)对Intra_DC模式的边界进行平滑滤波处理。IntiSrcStride预测模块的Int*pSrc=ptrSrc+sw+1ptrSrc指向当前PU的左上邻点,指向当前PU的首地址,Q?:第一行的点
15、,利用对应上邻点与其加权平均(不是与dcValue吗?)HEVC/H.265参考代码跟踪 跟踪帧内预测:4.在xCompressCU函数中(CompressCU函数的主体也是调用xComprssCU函数),先进行帧间预测xCheckRDCostMerge2Nx2N,xCheckRDCostInter等。在做完帧间预测后进行帧内预测,这是调用的函数是xCheckRDCostIntra,在xCompressCU函数的后续部分,还递归调用自身以实现对每个CU的编码。变换编码在encodeCoeff中实现,量化在xCheckIntraPCM完成。5.xCheckRDCostIntra函数,主要完成帧内
16、预测的任务,对亮度的预测使用estIntraPredQT,对色度使用estIntraPredChromaQT。6.estIntraPredQT函数,在思想对亮度的处理和色度的处理是一样的,所以只介绍亮度的处理函数。在estIntraPredQT函数中,主要完成了RDCost的选择,在其中predIntraLumaAng函数实现了方向的预测;calcHAD函数计算了SATD;xModeBitsIntra函数计算编码的码率;xUpdateCandList更新了最好的RDCost所使用的模式。HEVC学习(八) 以SAO为例浅析跟踪代码方法 寻找到SAO真正实现功能的代码处HEVC学习(九) 帧内预
17、测系列之六 xPredIntraPlanar函数VoidTComPrediction:xPredIntraPlanar进行Intra_Planar模式预测(对于代码中的某些公式并未深究)UIntblkSize=offset2D=width图像2中CurrentPU的宽度srcStride图像2的宽topRowk= =pSrck-srcStride存放上边界那一行的数组leftColumnk= pSrck*srcStride-1存放左边界那一列的数组1位置的值等于其上面的点的值Q?:UIntshift1D=g_aucConvertToBitwidth+2是什么鬼?Q?:horPred=leftC
18、olumnk+offset2D;?为什么要加offset2D?Q?:topRowk=shift1D;?HEVC学习(十一) 帧内预测系列之七 xPredIntraAng函数VoidTComPrediction:xPredIntraAng进行Intra_DC、Intra_Angular(有角度的)模式预测IntblkSize=width;/!当前PU的宽度Pel*pDst=rpDst;/!指向预测样点区域首地址BoolmodeDC=dirMode2DC模式为1,若是DC模式则modeDC为真BoolmodeHor=!modeDC&(dirMode18)modeDC为假且dirModegetDep
19、th(uiAbsPartIdx)uiDepth)?1:0;通过判断pcCU-getDepth( uiAbsPartIdx )是否大于uiDepth来确定当前CU是否还要继续分割,后者我们知道,是当前CU的深度,那么前者呢?自然就是在xCompressCU中确定下来的当前CU的最佳分割模式。对compressCU的参数pcCU进行类似语句: pcCU-getDepth( uiAbsPartIdx ),即可获得Z order为uiAbsPartIdx的4x4块的深度,如果把整个CU每个4x4块的深度确定下来,那么它的划分自然也就确定下来了。HEVC中SAO-自适应样点补偿 详细分析解读SAO原理:
20、 SAO是在DB之后进行, 输入是重建帧和原始帧数据, 输出是SAO数据和SAO后的重建帧. 自适应样点补偿是一个自适应选择过程,在去块滤波后进行。下面是整个HEVC的编码框图, 可以看到SAO是在整个帧编码完成后得到重建帧后进行的,属于Slice级别(帧级).首先把Frame划分为若干LCU, 然后对每个LCU中每个像素进行SAO操作.将根据其LCU像素特征选择一种像素补偿方式,以减少源图像与重构图像之间的失真。自适应样点补偿方式分为带状补偿(Band Offset,BO)和边缘补偿(Edge Offset,EO)两大类。带状补偿将像素值强度等级划分为若干个条带,每个条带内的像素拥有相同的补
21、偿值。进行补偿时根据重构像素点所处的条带,选择相应的带状补偿值进行补偿。 边缘补偿主要用于对图像的轮廓进行补偿。它将当前像素点值与相邻的2个像素值进行对比,用于比较的2个相邻像素可以在下图中所示的4种模板中选择,从而得到该像素点的类型。解码端根据码流中标示的像素点的类型信息进行相应的补偿校正。SAO-自适应样点补偿意义何在: SAO意义:大 量模拟测试和资料显示, SAO平均可以节约2%到6%的码率, 而编解码的复杂度只增加2%左右!SAO主要目的和操作原理减少源图像与重构图像之间的失真。如果只看这点,实际上每帧编码后的码率反而会增加,因为多了 SAO的相关语法和语义以及补偿值的编码!其实不然,虽然当前帧的码率增加了几个字节或者几个bit, 但是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制作胶板鱼池合同范例
- 浙江新高考2024-2025学年高中政治第一单元文化与生活第一课周练过关一新人教版必修3
- 公路路牌采购合同范例
- 宁波品质冷库施工方案
- 屋面彩板施工方案
- 石拱涵施工方案
- 乡镇道路清扫合同范例
- 山坡管线施工方案
- 净化车间改造合同范例
- 个人私有房屋购买合同范例
- (二模)长春市2025届高三质量监测(二)地理试卷(含答案)
- 2025天津市建筑安全员-C证考试题库
- 2025年河南省高职单招计算机类职业技能测试题(附答案)
- GB/T 18936-2025禽流感诊断技术
- 《主题四 鸡蛋撞地球》教学设计-2023-2024学年六年级下册综合实践活动辽师大版
- 2025年北京控股集团招聘笔试参考题库含答案
- 2025年国航机务系统AMECO工程师岗位校园招聘笔试参考题库附带答案详解
- 巨量千川中级营销师认证考试题(附答案)
- 2025中智集团招聘高频重点提升(共500题)附带答案详解
- 《公路工程造价标准高海拔高寒地区补充规定》
- 金融公司早会内容
评论
0/150
提交评论