HM学习笔记来自博客整理精品文档.docx

上传人:b****6 文档编号:14109016 上传时间:2023-06-20 格式:DOCX 页数:14 大小:589.83KB
下载 相关 举报
HM学习笔记来自博客整理精品文档.docx_第1页
第1页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第2页
第2页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第3页
第3页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第4页
第4页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第5页
第5页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第6页
第6页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第7页
第7页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第8页
第8页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第9页
第9页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第10页
第10页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第11页
第11页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第12页
第12页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第13页
第13页 / 共14页
HM学习笔记来自博客整理精品文档.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

HM学习笔记来自博客整理精品文档.docx

《HM学习笔记来自博客整理精品文档.docx》由会员分享,可在线阅读,更多相关《HM学习笔记来自博客整理精品文档.docx(14页珍藏版)》请在冰点文库上搜索。

HM学习笔记来自博客整理精品文档.docx

HM学习笔记来自博客整理精品文档

HM学习笔记_来自博客

编辑整理:

 

尊敬的读者朋友们:

这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(HM学习笔记_来自博客)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为HM学习笔记_来自博客的全部内容。

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(PredictUnit预测单元)的相邻样点进行赋值,为接下来进行的角度预测提供参考样点值.

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以便后续程序能够顺利执行。

 二,InitEncSlice创建编码的Slice。

  三,在此函数中,还包括preCompressSlice和CompressSlice两个函数,前者的作用是选择不同的lamuda进行编码(编码是调用了CompressCU函数,后续介绍),后者是在最好的lamuda下进行编码。

  四,循环滤波

 五,……(熵编码等,还没看).

4.在xCompressCU函数中(CompressCU函数的主体也是调用xComprssCU函数),先进行帧间预测xCheckRDCostMerge2Nx2N,xCheckRDCostInter等。

在做完帧间预测后进行阵内预测,这是调用的函数是xCheckRDCostIntra,在xCompressCU函数的后续部分,还递归调用自身以实现对每个CU的编码。

变换编码在encodeCoeff中实现,量化在xCheckIntraPCM完成。

5。

xCheckRDCostIntra函数,主要完成帧内预测的任务,对亮度的预测使用estIntraPredQT,对色度使用estIntraPredChromaQT。

6。

estIntraPredQT函数,在思想对亮度的处理和色度的处理是一样的,所以只介绍亮度的处理函数。

在estIntraPredQT函数中,主要完成了RDCost的选择,在其中predIntraLumaAng函数实现了方向的预测;calcHAD函数计算了SATD;xModeBitsIntra函数计算编码的码率;xUpdateCandList更新了最好的RDCost所使用的模式。

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

实现亮度分量帧内预测的主函数的大体框架

estIntraPredQT函数(实现亮度分量帧内预测)——

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

predIntraLumaAng函数—-Void TComPrediction:

:

predIntraLumaAng

帧内预测的最为重要的函数之一predIntraLumaAng

1.getPreditorPtr函数-—Int* TComPattern:

getPredictorPtr

Int *ptrSrc——获得指向参考样点首地址的指针

数组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.xDCPredFiltering函数—-Void TComPrediction:

:

xDCPredFiltering

xDCPredFiltering( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight)-—sw = 2 * iWidth + 1?

xDCPredFiltering( Int* pSrc, Int iSrcStride, Pel*& rpDst, Int iDstStride, Int iWidth, Int iHeight ) 

对Intra_DC模式的边界进行平滑滤波处理.

Int iSrcStride—-预测模块的

Int* pSrc=ptrSrc+sw+1-—ptrSrc指向当前PU的左上邻点,指向当前PU的首地址,

Q?

第一行的点,利用对应上邻点与其加权平均 (不是与dcValue吗?

HEVC/H。

265参考代码跟踪

跟踪帧内预测:

4.在xCompressCU函数中(CompressCU函数的主体也是调用xComprssCU函数),先进行帧间预测xCheckRDCostMerge2Nx2N,xCheckRDCostInter等。

在做完帧间预测后进行帧内预测,这是调用的函数是xCheckRDCostIntra,在xCompressCU函数的后续部分,还递归调用自身以实现对每个CU的编码。

变换编码在encodeCoeff中实现,量化在xCheckIntraPCM完成。

5.xCheckRDCostIntra函数,主要完成帧内预测的任务,对亮度的预测使用estIntraPredQT,对色度使用estIntraPredChromaQT。

6。

estIntraPredQT函数,在思想对亮度的处理和色度的处理是一样的,所以只介绍亮度的处理函数.在estIntraPredQT函数中,主要完成了RDCost的选择,在其中predIntraLumaAng函数实现了方向的预测;calcHAD函数计算了SATD;xModeBitsIntra函数计算编码的码率;xUpdateCandList更新了最好的RDCost所使用的模式。

HEVC学习(八)——以SAO为例浅析跟踪代码方法

寻找到SAO真正实现功能的代码处

HEVC学习(九)——帧内预测系列之六

xPredIntraPlanar函数——Void TComPrediction:

xPredIntraPlanar

进行Intra_Planar模式预测(对于代码中的某些公式并未深究)

UInt blkSize = offset2D=width——图像2中CurrentPU的宽度

srcStride——图像2的宽

topRow[k]= = pSrc[k-srcStride]——存放上边界那一行的数组

leftColumn[k]=pSrc[k*srcStride—1]——存放左边界那一列的数组

1位置的值等于其上面的点的值

Q?

 UInt shift1D = g_aucConvertToBit[ width ] + 2是什么鬼?

Q?

horPred = leftColumn[k] + offset2D;?

为什么要加offset2D?

Q?

topRow[k]      〈<= shift1D;?

HEVC学习(十一)—-帧内预测系列之七

xPredIntraAng函数——Void TComPrediction:

:

xPredIntraAng

进行Intra_DC、Intra_Angular(有角度的)模式预测

Int blkSize        = width;   //!

< 当前PU的宽度  

Pel* pDst          = rpDst;   //!

< 指向预测样点区域首地址  

Bool modeDC  = dirMode < 2——DC模式为1,若是DC模式则modeDC为真

Bool modeHor= !

modeDC && (dirMode < 18)——modeDC为假且dirMode<18,则为水平模式

Bool modeVer       = !

modeDC && !

modeHor——垂直模式为真

Int intraPredAngle——角度偏移值

PS:

未看完

帧内预测过程:

1.判断当前TU相邻参考像素的可用性,并进行相应的处理

2.对参考像素进行三抽头滤波

3.根据滤波后的参考像素计算当前TU的预测像素值

HEVC学习(十)——与变换有关的几个主要函数及重要变量

在xCompressCU函数中,有这么几个函数值得我们注意的,xCheckRDCostInter、xCheckRDCostMerge2Nx2N、xCheckRDCostIntra.它们分别是实现帧间预测模式、Merge模式、帧内预测式的主函数。

前两个函数的子函数xEstimateResidualQT(实际上通过调用函数encodeResAndCalcRdInterCU)、第三个函数的子函数xRecurIntraCodingQT(实际上通过调用xIntraCodingLumaBlk、xIntraCodingChromaBlk)均会调用函数transformNxN。

函数transformNxN这个函数主要调用了xTransformSkip、xT、xQuant三个函数,分别实现对残差进行TS(TransformSkip)模式、普通变换模式以及量化的功能。

对于第二个函数xT来说,它调用了xTrNxN。

xTrNxN函数对帧内预测模式的4x4块进行DST变换,其余的根据块大小分别做蝶形快速变换(4x4,8x8,16x16,32x32)

HEVC学习(十二)—-CU的最终划分

CU是递归划分的,导致在寻找确定最佳分割位置时比较困难。

参考encodeCU这个函数的实现,因为它是最终将信息编码成码流的函数.该函数调用的是xEncodeCU来完成实际工作,其中调用了Void TEncEntropy:

:

encodeSplitFlag函数(用于编码CU分割信息的函数)——其中又调用了codeSplitFlag( pcCU, uiAbsPartIdx, uiDepth )函数——其中有代码UInt uiCurrSplitFlag = ( pcCU—〉getDepth( uiAbsPartIdx ) 〉 uiDepth ) ?

 1 :

 0; 

通过判断pcCU-〉getDepth(uiAbsPartIdx)是否大于uiDepth来确定当前CU是否还要继续分割,后者我们知道,是当前CU的深度,那么前者呢?

自然就是在xCompressCU中确定下来的当前CU的最佳分割模式。

对compressCU的参数pcCU进行类似语句:

pcCU->getDepth(uiAbsPartIdx),即可获得Zorder为uiAbsPartIdx的4x4块的深度,如果把整个CU每个4x4块的深度确定下来,那么它的划分自然也就确定下来了.

HEVC中SAO—-自适应样点补偿详细分析解读

SAO原理:

   SAO是在DB之后进行,输入是重建帧和原始帧数据,输出是SAO数据和SAO后的重建帧。

自适应样点补偿是一个自适应选择过程,在去块滤波后进行。

下面是整个HEVC的编码框图,可以看到SAO是在整个帧编码完成后得到重建帧后进行的,属于Slice级别(帧级)。

首先把Frame划分为若干LCU,然后对每个LCU中每个像素进行SAO操作。

将根据其LCU像素特征选择一种像素补偿方式,以减少源图像与重构图像之间的失真。

自适应样点补偿方式分为带状补偿(BandOffset,BO)和边缘补偿(EdgeOffset,EO)两大类。

带状补偿将像素值强度等级划分为若干个条带,每个条带内的像素拥有相同的补偿值。

进行补偿时根据重构像素点所处的条带,选择相应的带状补偿值进行补偿。

   边缘补偿主要用于对图像的轮廓进行补偿.它将当前像素点值与相邻的2个像素值进行对比,用于比较的2个相邻像素可以在下图中所示的4种模板中选择,从而得到该像素点的类型.解码端根据码流中标示的像素点的类型信息进行相应的补偿校正。

SAO--自适应样点补偿意义何在:

    SAO意义:

大量模拟测试和资料显示,SAO平均可以节约2%到6%的码率,而编解码的复杂度只增加2%左右!

SAO主要目的和操作原理减少源图像与重构图像之间的失真。

如果只看这点,实际上每帧编码后的码率反而会增加,因为多了SAO的相关语法和语义以及补偿值的编码!

其实不然,虽然当前帧的码率增加了几个字节或者几个bit,但是这点增加码字使得源图像与重构图像的失真减少,使接下来的预测残差更小了,从而大大的降低码率了!

HEVC学习(十三)~(十六)—-SAO函数解析之一~四

HEVC学习(十七)~(十九)—-NALunit的解码过程之一

HEVC学习(二十)——熵编码之一

VoidTAppEncTop:

:

encode(){初始化%//mainencoderloop%//allocateoriginalYUVbuffer%//callencodingfunctionforoneframe}-—

调用VoidTEncTop:

:

encode(初始化、计算图像特征数据)//computeimagecharacteristics//compressfield0//compressGOP——

//callencodingfunctionforoneframe

调用VoidTEncGOP:

compressGOP——

//writebistreamtofileifnecessary

//deletebuffer

HM15。

0结构

TAppCommon和TlibCommon中的函数是编解码公用的应用函数和库函数

'VideoIO'工程主要是实现对YUV文件的读写操作。

从TappEncoder中的encmain。

cpp中的main函数开始编码,调用TlibEncoder项目中的函数,最后输出编码所用时间。

从TappDecoder中的decmain.cpp中的main函数开始解码,调用TlibDecoder项目中的函数,最后输出解码所用时间。

这个是H264到H265的转码,我做的是一进二出。

你先看看结构吧

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2