您的位置:首页 > 其它

Skip宏块与Direct预测模式浅析

2012-04-19 21:12 357 查看
B_Skip类型宏块(200503版标准,表7-14最后一行): 无像素残差,无运动矢量残差(MVD)。解码时,通过Direct预测模式(时间或空间)计算出前、后向MV后,直接利用前、后向MV得到像素预测值。像素重构值=像素预测值

B_Direct_16*16类型宏块(200503版标准,表7-14第一行):有像素残差,无运动矢量残差(MVD)。解码时,通过Direct预测模式(时间或空间)计算出前、后向MV后,利用前、后向MV得到像素预测值。然后,像素重构值=像素预测值+像素残差解码值

P_Skip类型宏块(200503版标准,表7-13最后一行): 也就是COPY宏块。无像素残差,无运动矢量残差(MVD)。直接利用预测MV得到像素预测值。像素重构值=像素预测值

【特别说明】:

1、有残差就有CBP(表示残差编码状态,详见BBS中我的帖子“CBP详解”),反过来没有残差当然就没有CBP;

2、请一定不要把 Direct 类型宏块、Skip 类型宏块、Direct 预测模式这三个混淆了。B_Skip 类型宏块(大小为 16*16)、B_Direct_8*8 类型块(大小为
8*8)和B_Direct 类型宏块(大小为 16*16)都采用的是 Direct 预测模式;

3、关于时间和空间的Direct 预测模式,请大家参考标准文档的8.4.1.2小节;

4、与本论坛另一篇帖子“请问Skipped
Macroblock是什么意思? ”参照学习;

5、我是跟踪JM86解码过程得出以上结论的。如果某些部分有点错误,请大家指正。

-----------------------------------------------------------------------------------------------------

如果满足以下三个条件则将宏块按
Skip 类型进行编码:

(1)最佳模式选择为Inter16×16;

(2)MC得到的最终运动矢量等于预测运动矢量,即运动矢量的残差为0;

(3)变换系数均被量化为0。

-----------------------------------------------------------------------------------------------------

skip类型块(或宏块)没有运动矢量差,但是有残差,只是在编码的时候扔掉了

对于残差的处理

在rdo和非rdo下的处理是不一样的

在非rdo下,需要对残差进行变化量化,若16x16为最终模式且cbp为0(或者有少量的4x4block为非零),那么该宏块就是skip模式,简单的说,在非rdo情况下,skip模式是16x16模式的一个特殊情况

在rdo情况下,不需要对残差进行变化量化,直接对skip模式计算rdcost(skip的码率即编码所占的比特数,虽然不对残差和矢量差进行编码,但是编码比特数也是不为零的,比如模式所占的比特数、是宏块内第几个skip块等语法元素信息),通过判断rdcost是否最小,来判定宏块是否为skip模式,就是说,在rdo情况下,skip是独立的一种模式

-----------------------------------------------------------------------------------------------------

Skipped
Macroblock 是宏块类型,Direct Prdeiction 是宏块的预测方式

Skipped Macroblock 顾名思义就是跳过不编码的宏块,那么在解码端如何重构这个宏块呢?这就有两种选择:

1、采用 Direct 方式(这是一种特殊的预测方式)先预测出其 MV,后面的处理就跟一般的帧间宏块类似了(根据 MV 获取参考图像,再进行插值重构);

2、不采用 Direct 方式进行预测,而直接 copy 参考宏块。

第一种选择正是 B 片中的 Skip 宏块所采取的方式,同时又分为空间和时间 Direct 预测方式

第二种选择正是 P 片中的 Skip 宏块所采用的方式,也就是直接 copy 参考宏块

现在应该明白 Skip 与 Direct 的联系了吧?但要注意的是 B 片中有一种类型的宏块:B_Direct_16*16,它很特殊,它的名字里有“Direct”这个单词 ,它的预测方式也采用的
Direct 方式。这种类型的宏块即有 B 片中的 Skip 宏块的特性(MV 采用 Direct 预测方式得到),同时又有一般帧间宏块的特性(有像素残差,Skip 宏块是没有像素残差的)

-----------------------------------------------------------------------------------------------------


什么是半像素

所谓整像素是编码有效像素。即物理扫描可能一行扫描300个像素点,但是由于各种编码分辨率的不同可以取不同的像素为整像素。比如:

。。。。。。。。。。。。。

红色点就是输入图像上的点,而蓝色点是利用两个红色点计算得到,黑色点是利用红色和蓝色计算得到。蓝色就是
1/2 像素点(即半像素点),黑色就是 1/4 像素点,他们都是虚拟点,并不实际存在。因为有时候用这些虚拟点进行运动估计会得到比红色点更小的残差,所以就要把他们插出来,并对他们做运动估计。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: