DC和AC预测

8×8块经过DCT和量化后,系数排列呈现以下的规律,即非零系数集中在左上角,大部分的0系数集中在偏离DC系数向右和向下的位置上。特别是DC系数、第一行和第一列AC系数,数值非零且较大,如果能用较小的数值代替它们,会减少编码后的位流数,于是产生DC和AC预测。

在MPEG-4中,通常把一个宏块分为6个8×8块进行DC和AC预测。

首先对8×8块进行DC预测。如图2所示,X表示当前的8×8块;A,B和C表示X的相邻8×8块,其位置分别位于X的左边、左上角和上边。对X进行DC预测就是采用相邻块的DC系数值预测X的DC系数值,关键是选择哪个相邻块的DC系数。

 

程序采用了以下策略选取相邻块。定义块A,B,C,X的DC系数值分别为DC_A,DC_B,DC_C,DC_X。
如果DC_A与DC_B的差小于DC_B与DC_C的差,则DC_A与DC_B在数值上比较接近,即在垂直方向上的数值比水平方向上更接近,所以采用DC_C来预测DC_X;反之,在水平方向的数值比较接近,即采用DC_A来预测DC_X。

将当前块的DC系数与用来预测的相邻块的DC系数,经过特定处理后做差,其差存放到当前块的DC位置上,同时记录此DC系数的预测方向。

AC预测主要是针对8×8块的第一行或者第一列AC系数,其预测方向取决于当前块DC系数的预测方向。如图2所示,如果之前DC预测为水平预测,则当前块X的第一列AC系数采用A块的第一列AC系数预测,同时将X的第一列7个AC系数各自取绝对值后相加到变量S1(S1的初始值为0)上。将当前块第一列AC系数与用来预测的相邻块A的第一列AC系数做差,其7个差值存放到当前块的第一列AC系数的位置上,同时将7个差值各自取绝对值后相加到变量S2(S2的初始值为0)上。如果之前的DC预测为垂直预测,则只进行当前块X的第一行AC系数预测,其预测步骤同第一列AC系数的预测一样。

有时AC预测会产生较大的预测误差,并没有达到节省位流的目的,因此必须判断AC预测的有效性。在单个8×8小块的AC预测中,用S1记录了此小块的第一行或第一列AC系数的绝对值之和,用S2记录了第一行或第一列预测后7个差值的绝对和。以一个宏块的6个8×8小块为单位,将各个小块的S1与S2之差相加,得到值S。如果S非零,则此宏块进行AC预测,其标志ACpred_flag置1,否则此宏块不进行AC预测,ACpred_flag置0
发布了2 篇原创文章 · 获赞 0 · 访问量 1303

猜你喜欢

转载自blog.csdn.net/losss/article/details/17452831
DC