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得到像素预测值。像素重构值=像素预测值 。
请一定不要把 Direct 类型宏块、Skip 类型宏块、Direct 预测模式这三个混淆了。B_Skip 类型宏块(大小为
16*16)、B_Direct_8*8 类型块(大小为 8*8)和B_Direct 类型宏块(大小为 16*16)都采用的是 Direct
预测模式;可以看到两种skip类型既无残差也无运动矢量差值,B_Direct分为对16*16和8*8,都是无MVD但是带残差。解码时,通过预测计
算MVPred,再依靠帧间运动补偿恢复宏块的亮度色度信息。
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 宏块是没有像素残差的)。
给大家一个直观的理解:
1,在图像序列里确实存在这样的情况:当前MB(或者submb)的数据和以往图像中的某一块完全一样(主要针对视频中的运动物体),所以从理论上完全可以不传输这一块的数据,而有以往的数据。
2.那么这个以往的数据采用哪一帧呢?显然对于运动物体采用紧邻那一帧最好(至少mv最小的可能性大)。
3.采用哪一块呢? 这个有一点麻烦,但是从逻辑上讲如果运动物体的边缘确定了,中间的块和边缘的块的mv应该一致,所以从临近块中得到mv就是很自然的想法了。
以上就是P帧SIKP的想法。当然按照这个想法做,不是所有的运动物体都能很好的找到匹配块,但是视频编码考虑的是效果和算法的平衡。当一个skip宏块在比特流中被申明,就不必为这个宏块传输数据了。解码器会为这个跳过宏块计算向量和利用来自list0的首参考帧的MC预
测去重构这个宏块。普通的(非skip)帧间预测, 先得到MVPRED, 然后搜索得到最佳匹配块.
(判断最佳的方法....是可能使用MAD作为判断标准....) 然后把模式, 运动残差(MVD), CBP, 和像素残差一起编码传输
(或者还有其他一些flags)
那么在编码时怎样判断当前块可以是skip块呢? 没什么好办法,只能先假定它就是,然后算一下参差是否为0。当然你可以用量化后的数值计算,这样会在一定程度上增大找到sikp的概率。
如果满足以下三个条件则将宏块按 Skip 类型进行编码:
(1)最佳模式选择为Inter16×16;
(2)MC得到的最终运动矢量等于预测运动矢量,即运动矢量的残差为0;
(3)变换系数均被量化为0。
B帧和P帧的想法类似,说起来有点累(因为它有2个参考帧,2种所谓的预测模式),大家可以自己想一想。
总结一下:
图
像压缩研究了很久,但是基本思想却没有什么突破:空间的相关性和时间的相关性。在加上要考虑实现的难度,所以基本的思路很简单。不要看264写的那么复
杂,其实每一条的出处的想法都很简单,所以建议大家多考虑一下实际的图形序列是什么样的,再来理解为什么这样做和各种做法的区别,就没那么困难了。
阅读(3521) | 评论(0) | 转发(0) |