HEVC的帧内预测(1)
来源:互联网 发布:mac 10.11.6 双系统 编辑:程序博客网 时间:2024/04/30 15:12
HEVC的帧内预测(intra prediction),即intra块的预测过程,为intra块解码提供预测值(predSamples[ x ][ y ])。
首先要确定当前块和邻块的关系。
1.z-scan order block availability
z-scan order block availability,就是在Z顺序扫描下的availability。
首先介绍计算MinTbAddrZs的方法
数组MinTbAddrZs表示以最小块(minimum blocks)为单位的z-scan 顺序地址,最小块的尺寸由变量Log2MinTrafoSize决定。
由以下公式得到:
看着是不是很头疼?有没有想死的感觉?
其中:CtbLog2SizeY为ctb(coding tree block)的尺寸对数,MinTbLog2SizeY为最小的Tb(transform block变换块)的尺寸对数。ctbAddrRs为当前ctb的raster扫描地址,CtbAddrRsToTs[ ctbAddrRs ]就是将ctbAddrRs转化为了Ts(tiles)扫描地址(详见HEVC标准中的图像分割(1))。
其实这公式表达的意思就是当前以最小块为单位的坐标(x,y)的地址,此地址的寻址顺序在CTB内部为z-scan,在跨越CTB时为tile扫描顺序。
举个例子,如图:
在图(1)中,黄色块代表当前的ctb,粗黑线标出了tile的边界,小方块代表ctb,黄色块代表(x,y)所在的ctb,即当前ctb,虚线箭头就是ts扫描的方向。则根据公式,当前ctb的ts扫描地址为24。
图(2)中,大的黄色块代表当前ctb,阴影块代表(x,y)所在的tb,假设CtbLog2SizeY = 4,MinTbLog2SizeY = 3,一个ctb中包含4个tb。(x,y)在当前ctb的地址为2。
所以MinTbAddrZs = 24 + 2 = 26吗?错!!!
因为前面扫描过的ctb都有4个tb,所以MinTbAddrZs = 24*4 + 2 = 98.
当前块左上角像素坐标(xCurr, yCurr),由以上MinTbAddrZs步骤计算出其最小块地址minBlockAddrCurr。
再计算左上角坐标为(xNbY, yNbY)的相邻块的最小块地址,minBlockAddrN
当相邻块位于图像范围外时,minBlockAddrN为-1,否则根据MinTbAddrZs方法进行计算。
如果有一个或者多个下列条件为真时,availableN 为FALSE
1. minBlockAddrN 小于0
2. minBlockAddrN 比 minBlockAddrCurr大
3. 相邻块所在的slice segment对应的SliceAddrRs和当前块所在的slice segment对应的SliceAddrRs不同。
4. 相邻块和当前块处于不同的tile。
否则, availableN为TRUE。
在HEVC标准中的图像分割(2)中我们介绍过ctb的分块,其中提到
在intraSplitFlag为1时,要把当前的色度块分成4个块进行处理。
2.帧内预测模式计算
HEVC的帧内预测有34中模式,比H264的帧内预测更加精细。如下图的对比H.264的intra预测模式HEVC的intra预测模式
引入HEVC的帧内预测模式值与名称的对应
0:INTRA_PLANAR
1:INTRA_DC
2~34:INTRA_ANGULAR2~INTRA_ANGULAR34
帧内预测模式的值可以下步骤得出:
1. 用A表示当前块左边邻块,B表示当前快上边邻块。
2.计算备选帧内预测模式(candIntraPredModeX,X可以为A或者B),有下列步骤:
if(availableX==false){ candIntraPredModeX = INTRA_DC;}else if((CuPredMode[ xNbX][ yNbX ]!=INTRA)||( pcm_flag[ xNbX ][ yNbX ]==1)){ candIntraPredModeX = INTRA_DC;}else if(B位于另外一个coding tree unit){ candIntraPredModeX = INTRA_DC;}else{ candIntraPredModeX= IntraPredModeY[ xNbX ][ yNbX ]}
其中,availableX表示邻块的是否可用,由第1部分介绍的过程得出。
CuPredMode[ xNbX ][ yNbX ]指相邻块的预测模式,可为INTRA(1)或INTER(0)。
pcm_flag[ xNbX ][ yNbX ]指相邻块的pcm标志。
IntraPredModeY[ xNbX ][ yNbX ]指相邻块的帧内预测模式(范围:0~34)。
3. 备选模式表(candModeList[ x ], x = 0~2)的计算过程如下:
if (candIntraPredModeB==candIntraPredModeA){ if(candIntraPredModeA<2) { candModeList[0]=0, candModeList[1]=1,candModeList[2]=26; } else { candModeList[0] = candIntraPredModeA candModeList[1] = 2 + ( ( candIntraPredModeA + 29 ) % 32 ) candModeList[2] = 2 + ( ( candIntraPredModeA −2 + 1 ) % 32 ) }}else{ candModeList[0] = candIntraPredModeA candModeList[1] = candIntraPredModeB if((candModeList[0]!=0)&&( candModeList[1]!=0)) candModeList[2] =0; elseif((candModeList[0]!=1)&&( candModeList[ 1 ]!=1)) candModeList[2] =1; else candModeList[2] =26;}
完成此步骤后,得到备选模式表candModeList[x ]。
4.当前帧的亮度帧内预测解码模式(IntraPredModeY[ xPb ][ yPb ]),由以下步骤得出:
if(prev_intra_luma_pred_flag[ xPb ][ yPb ] ==1){ IntraPredModeY[ xPb ][ yPb ] = candModeList[ mpm_idx ]}else{ if(candModeList[ 0 ]>candModeList[ 1 ]) Swap( candModeList[ 0 ], candModeList[ 1 ] ) if(candModeList[ 0 ]>candModeList[ 2 ]) Swap( candModeList[ 0 ], candModeList[ 2 ] ) if(candModeList[ 1 ]>candModeList[ 2 ]) Swap( candModeList[ 1 ], candModeList[ 2 ] ) IntraPredModeY[ xPb ][ yPb ] =rem_intra_luma_pred_mode[ xPb ][ yPb ]; for(i=0;i<2;i++) { if(IntraPredModeY[ xPb ][ yPb ] >= candModeList[ i ]) IntraPredModeY[ xPb ][ yPb ]++; }}
其中,prev_intra_luma_pred_flag,mpm_idx和rem_intra_luma_pred_mode都是coding_uint中的语法元素,可由cabac解码得到。
至此,得到亮度的帧内预测模式(IntraPredModeY)。
- HEVC的帧内预测(1)
- HEVC的帧内预测(2)
- HEVC帧内预测
- hevc帧内预测
- Duanxx的HEVC学习(三)HEVC编码框架(二)帧内预测
- HEVC帧内预测总结
- HEVC中的帧内预测
- HEVC中的帧内预测
- HEVC 帧内预测xPredIntraAng
- HEVC的帧内预测模式的底层计算
- HEVC之帧内预测的predIntraAng讲解
- (HEVC)帧内预测:fillReferenceSamples函数讲解
- (HEVC)帧内预测:predIntraLumaAng; getPreditorPtr; xDCPredFiltering
- HEVC的帧间预测解码(1)
- HEVC-帧内预测2: initAdiPattern 函数
- HEVC帧内DC预测函数predIntraGetPredValDC()
- HEVC帧内DC预测函数predIntraGetPredValDC()
- Overview of HEVC帧内预测
- 汇编笔记整理
- 如何实现viewpager自动轮播
- 服务器安装字体库解决出现xx问题
- 关于shared_ptr
- 采购组织0001不对工厂1000负责
- HEVC的帧内预测(1)
- 购物商城shopping连载(9)
- MATLAB Support Package for Arduino Hardware 安装当中的一些问题
- 从B树、B+树、B*树谈到R 树
- Java线程池
- 设计模式之 原型(Prototype)模式(使用智能指针避免浅拷贝时内存泄露)
- 常用正则表达式
- Android线程间通信机制之Handler Looper
- php composer Mac 全局 中国镜像