H.264中的一些问题总结

在H.264中衡量失真(distortion)的方法

主要有:SAD,SATD和SSD三种方法,即:

这三种失真计算方法使用的场合是不一样的.

(1)SAD/SATD主要用于在帧间预测中, 进行运动搜索的时候,计算块匹配之间的代价的时候,

在进行模式选择的时候, 使用的是SAD, 或者SATD

(2) SSD 计算的失真比较精确, 主要是在真正的编码过程中所使用的. 在进行模式选择的时候, 如何使用RDO的话, 也要计算SSD

(3)对于整象素点的 MV 搜索,Distortion 采用 SAD,对于亚(分数)象素点的 MV 搜索,

Distortion 采用 SATD。

 

H.264编码后码流的生成

H.264 比较全的编码框架

 

H.264中的ASO与FMO

ASO指的是片在传输时的先后顺序可以随意变化, 而FMo是指在一帧图像中宏块的属于不同的片的次序比较灵活

H.264中的重要概念:档次(Profile)和等级(Level)

H.264的语法单元:H.264中没有I图像,P图像和B图像的概念,取而代之的是I片,P片和B片:

H.264的码率封装格式:

H2.64中I帧和IDR帧的区别

IDR(Instantaneous Decoding Refresh)--即时解码刷新。

I 和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码 中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播, 从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。IDR 会 导致DPB(参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像 之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。

 对 于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位 于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR 帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。

 

Skip宏块与Direct预测模式浅析

预测方式

类型

特点

算方式

Direct预测方式得到MV

B_Direct_16x16

B_Direct_8x8 

有残差, MVD

码时,通Direct预测模式(时间或空算出前、后向MV后,利用前、后向MV得到像素预测值。然后,像素重构=像素预测值+像素残差解码值

B_Skip(大小16x16)

无残差, MVD

码时,通Direct预测模式(时间或空算出前、后向MV后,直接利用前、后向MV得到像素预测值。像素重构=像素预测值 

使用预测MV(Copy)

P_Skip 

直接利用预测MV得到像素预测值。像素重构=像素预测值  

 

首先Skipped Macroblock 是宏块类型,Direct Prdeiction 是宏块的预测方式
Skipped Macroblock 顾名思义就是跳过不编码的宏块,那么在解码端如何重构这个宏块呢?这就有两种选择:1、采用 Direct 方式(这是一种特殊的预测方式)先预测出其 MV,后面的处理就跟一般的帧间宏块类似了(根据 MV 获取参考图像,再进行插值重构);
2、不采用 Direct 方式
, 而是直接利用预测得到的MV, 进行 copy 参考宏块。
第一种选择正是 B 片中的 Skip 宏块所采取的方式,同时又分为空间和时间 Direct 预测方式
第二种选择正是 P 片中的 Skip 宏块所采用的方式,也就是直接 copy 参考宏块

所以, 对于没有MVD的这几种特殊的宏块, 根据其不同类型(B帧中还是P帧中的宏块)来使用不同的预测方式得到MV,这样就造成了预测方式的差别

其次,Direct类型的宏块其实是一种比较特殊的宏块类型, 即有 B 片中的 Skip 宏块的特性(MV 采用 Direct 预测方式得到),同时又有一般帧间宏块的特性(有像素残差,Skip 宏块是没有像素残差的)

还有: 对于mb_typeP8*816*16宏块,里面可能存在B_Direct模式的8*8子块。跟B_Direct_16*16类型宏块一样有像素残差,无运动矢量残差(MVD) 区别是对于B_Direct_16*16,48*8子块都采用direct模式;但对于B_Direct_8*8,其所属的16*16宏块中剩余的8*8块却不一定要采用direct模式。

 

最后

如何判断是否使用skip模式?

那么在编码时怎样判断当前块可以是skip块呢? 没什么好办法,只能先假定它就是,然后算一下参差是否为0。当然你可以用量化后的数值计算,这样会在一定程度上增大找到sikp的概率。

如果满足以下三个条件则将宏块按 Skip 类型进行编码:
(1)最佳模式选择为Inter16×16;
(2)MC得到的最终运动矢量等于预测运动矢量,即运动矢量的残差为0;
(MVD)
(3)变换系数均被量化为0。
(无残差)

skip类型块(或宏块)没有运动矢量差,但是有残差,只是在编码的时候扔掉了 对于残差的处理, rdo和非rdo下的处理是不一样的:

(1) 在非rdo,需要对残差进行变化量化,16x16为最终模式且cbp0(或者有少量的4x4block为非零),那么该宏块就是skip模式,简单的说,在非rdo情况下,skip模式是16x16模式的一个特殊情况 (2) rdo情况下,不需要对残差进行变化量化,直接对skip模式计算rdcost(skip的码率即编码所占的比特数,虽然不对残差和矢量差进行编码,但是编码比特数也是不为零的, 比如模式所占的比特数、是宏块内第几个skip块等语法元素信息),通过判断rdcost是否最小,来判定宏块是否为skip模式,就是说,rdo情况下,skip是独立的一种模式 补充一点关于B宏块的direct16x16模式和skip模式选择。在JM中这两种模式都对应0。因此无法分开成两种模式去计算rdcost。即使是RDO开的情况下,也是计算残差变换量化。。。最后根据cbp是否为0 决定是direct16x16模式还是skip模式。

posted @ 2012-07-31 15:12  Mr.Rico  阅读(...)  评论(...编辑  收藏