HM在帧内预测中如何指定一幅图像作为一个slice,一个CU作为一个PU的
2015-10-21 20:15
399 查看
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里面
这时又出现一个问题,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里面
相关文章推荐
- AC多模式匹配算法
- DOM操作html、css
- 如何监控Java垃圾回收机制2
- iO8及以后设置启动图片LaunchImage的方法
- yeoman、bower、grunt 开发收集
- [TwistedFate]程序存储区划分、动态申请内存、内存操作函数
- OC学习笔记之NSString常见处理方法
- Greedy:Protecting the Flowers(POJ 3262)
- 手脱tElock 0.98b1 -> tE!
- 从date中获取相应信息
- 编译maxscale
- Codevs 玛丽卡
- MySql建表与索引
- popupWindow的使用
- WebView注入Javascript的版本兼容问题
- shell脚本批量调用git命令
- Nosql释义
- OC学习笔记之NSString
- 二叉树的先中后序遍历
- iOS 企业证书发布app 流程