HM在帧内预测中如何指定一幅图像作为一个slice,一个CU作为一个PU的

来源:互联网 发布:淘宝搜索白夜追踪 编辑:程序博客网 时间:2024/04/28 00:51

转载:点击打开链接

1,如何指定一幅图像就是一个slice:首先,HM实现slice内CU循环终止的条件就是,判断下一个预测CU的地址有没有超过slice的边界uiBoudingCUAddr,其中slice的边界也是以CU为基础进行定义的,从另一个角度,也就是决定slice是不是一幅图像,也是以这个CU边界进行判决的,这个时候还需要另外一个量来做对比,即定义一个变量表示下一个slice开头的第一个CU的地址startCUAddrSlice,如果这个变量小于uiBoudingCUAddr说明当前的slice只是一幅图像的一部分,如果这个变量大于或者等于uiBoudingCUAddr,则这个slice就代表一幅图像。

这时又出现一个问题,HEVC里面规定了一个slice可以划分为几个sliceSegment,而HM里面sliceSegment就是整个slice,即没有对slice进行向下划分。那这个机制就是怎么执行的呢?在TEncCfg对象里,会有一个变量sliceSegmode,这个变量是在compressGOP函数里的m_pcSliceEncoder->initEncSlice函数里复制给当前pcSlice对象里的sliceSegmentmode的,如果sliceSegmentmode为0,那么就代表sliceSegment就等同于slice,即不对当前slice进行划分;如果sliceSegmentmode FIXED_NUMBER_OF_LCU这个事先定义的常数,那么就代表要对当前slice进行划分,划分还是以CU为单位,即把slice划分成固定LCU数量的sliceSegment,uiCUAddrIncrement就指定了,一个sliceSegment应该包含多少个LCU,如果最后一个sliceSegment按既定CU数量来划分超过了本身图像中LCU的数量,那么最后一个sliceSegment的终止地址就是图像的终止地址。这些操作实在compressSlice函数里开头的xDeterimineStartBoudingCUAddr函数里执行的。如下图所示


2,如何指定当前CU中PU的数目,我们知道,由于CU本身就是递归划分的,所以在帧内预测中,只可能把当前CU划分成1个或者4个,在不论是rpcTempCU和rpcBestCU对象初始化的过程中,都会把CU分成4x4的小块来进行初始化,其中有个m_pePartSize成员数组,就是表示把当前的CU划分成几个PU,但是初始化时,都会被划分成SIZE_NONE这个固定常数。而真正对这个成员进行赋值是在xcompressCU函数里的xCheckRDCostIntra函数里的rpcTempCU->setPartSizeSubParts函数里,用eSize进行赋值的。

这时也出现一个问题,eSize是从哪得来的,这个eSize是从外层函数xCheckRDCostIntra函数里的参数SIZE_2Nx2N复制过来的。而SIZE_2Nx2N又是一个固定常数,从这我们可以看出,HM本身的程序就是固定把CU当成一个PU来预测的,没有给选择的程序,当然,我们肯定也可以直接把这个数改成其他固定常数了。SIZE_2Nx2N是一个枚举类型的量,如下图所示TypeDef.h里面


0 0
原创粉丝点击