ITU-T H.264 _2005.03_ 标准导读_Part 8.4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ITU-T H.264(2005.3) 标准导读
――Part 8.4:Inter prediction process
Author:airland
8.4 Inter prediction process
H.264中帧间预测主要由3部分组成:
- 首先,计算当前单元的运动向量(可以表示出多部分的和)。
这里所谓的“单元”可以是宏块、宏块分割、子宏块分割,下同。
- 根据运动向量以及其他的一些参数,计算出当前单元各个像素的预测值。
- 根据预测值和残差计算出各个像素的解码后的值。
由于最后一步只需要执行加法,本章主要介绍前两步。
这两步分别在8.4.1和8.4.2种介绍。
8.4在baseline中不需要。
在阅读本章时,会涉及到以下一些函数MbPartWidth( ), MbPartHeight( ), SubMbPartWidth( ), and SubMbPartHeight( )。
这些函数表示的是宏块划分、子宏块划分的宽度和高度。
它们的定义参见Table 7-13, Table 7-14, Table 7-17, and Table 7-18。
进一步的,本章还定义了如下函数:
partWidth、partHeight、partWidthC、partHeightC。
它们分别指的是当前亮度(色度)单元的宽度和高度。
它们的定义很简单,参见标准P-152~153。
这里需要声明:
- 由于baseline中不需要后项预测,所以和list1相关的操作全部不需要;和list1相关的参数全部置于无效。
- 这里的帧间预测操作是以宏块为周期的。
也就是所在一个宏块内对各个子单元进行补偿。
到了下个宏块,一些参数是要被复位的。
比如MvCnt,表示每个宏块内总共需要多少个运动向量。
8.4.1 Derivation process for motion vector components and reference indices
这部分负责计算出当前单元对应的运动向量和运动补偿需要的其他参数。
这个过程的输入:
- mbPartIdx, 当前宏块划分索引。
- subMbPartIdx,当前子宏块划分索引。
这个过程的输出:
- mvL0、mvCL0,亮度、色度前向预测的运动向量。
后项预测的运动向量不需要。
- refIdxL0,前向参考帧号。
后项参考帧号不需要。
- predFlagL0=1、predFlagL1=0(predFlagL1也可以不需要);
- subMvCnt,用于累加计算MvCnt。
每生成一个运动向量加一个。
该节包含4小节。
其中8.4.1.2baseline中不需要。
8.4.1.3介绍了运动向量预测值的生成。
8.4.1.1介绍了P帧相关的运动向量的生成。
由于它要调用8.4.1.3,所以放到8.4.1.3之后介绍。
8.4.1.4介绍了色度运动向量的生成。
之前介绍的全都只和亮度相关。
8.4.1.3 Derivation process for luma motion vector predict
这部分介绍了运动向量预测值的生成。
生成的思路如下:
-找到当前单元相邻单元的运动向量(8.4.1.3.2)。
-根据找到的运动向量,做简单的处理,即可得到运动向量预测值(8.4.1.3.1)。
这部分具体介绍包含在P-163~164。
由于比较直白,不再详述。
8.4.1.1 Derivation process for luma motion vectors for skipped macroblocks in P and SP slices
本部分计算P_skip宏块的运动向量。
本部分以mvL0,refIdxL0=0为输出。
本部分计算流程如下:
-调用8.4.1.3.2找到当前单元相邻单元的运动向量。
这一步的输出为:mbAddrA, mbAddrB, mvL0A, mvL0B, refIdxL0A和refIdxL0B。
-如果一下情况出现,则mvL0被赋为0。
- mbAddrA is not available
- mbAddrB is not available
- refIdxL0A is equal to 0 and both components of mvL0A are equal to 0
- refIdxL0B is equal to 0 and both components of mvL0B are equal to 0
-否则,调用8.4.1.3得到运动向量的预测值。
由于skip快的运动向量等于其预测值,直接将运动向量的预测值赋给mvL0即可。
8.4.1.4 Derivation process for chroma motion vectors
色度的运动向量可以由亮度的运动向量导出。
色度的运动向量精度为1/8像素。
在baseline中,令
mvCLX[ 0 ] = mvLX[ 0 ]
mvCLX[ 1 ] = mvLX[ 1 ]
即可。
8.4.2 Decoding process for Inter prediction samples
当所需要的运动向量被导出之后,就可以利用运动向量,计算得到当前单元的各个像素的预测值。
本章计算得到的预测值同样以单元的形式给出。
也就是说predPartL1x 是(partWidth)x(partHeight)的一个阵列。
对于亮度和两个色度单元都有对应的预测阵列。
主要分两步:
-找到对应的参考图象。
(8.4.2.1)
-利用参考图象求出预测值阵列。
(8.4.2.2)
8.4.2.1 Reference picture selection process
在这部分中,baseline的情况异常简单。
直接找到refIdxLX.对应的帧图,即是参考图象。
8.4.2.2 Fractional sample interpolation process
对于一个像素而言,用( xInt L, yInt L )表示它的一个整象素单位的亮度位置,( xFrac L, yFrac L )表示一个1/4单位的偏移量。
这些变量仅用于该子条款中,用于表示在参考阵列refPicLX L, refPicLX Cb, and refPicLX Cr内的分数采样位置。
与此同时,用( xA L, yA L )来表示在由mbPartIdx*subMbPartIdx给出的当前划分的左上角的亮度采样值给出的,并且是整象素的坐标。
mbPartIdx*subMbPartIdx是相对于给出的二维亮度采样值阵列的左上角的亮度采样值位置而言。
则如下关系成立:
xIntL = xAL + ( mvLX[ 0 ] >> 2 ) + xL
yIntL = yAL + ( mvLX[ 1 ] >> 2 ) + yL
xFracL = mvLX[ 0 ] & 3
yFracL = mvLX[ 1 ] & 3
类似的,对于色度像素,有:
xInt C = ( xA L / SubWidthC ) + ( mvCLX[ 0 ] >> 3 ) + x C
yInt C = ( yA L / SubHeightC ) + ( mvCLX[ 1 ] >> 3 ) + y C
xFrac C = mvCLX[ 0 ] & 7
yFrac C = mvCLX[ 1 ] & 7
8.4.2.2.1,8.4.2.2.2分别叙述了亮度和色度像素进行1/4像素插值的算法。
虽然篇幅不小,但是叙述异常清晰直白,为本标准中所罕见。
随意建议直接看标准即可。