各种计算的说明
SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和
SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和
SATD(Sum of Absolute Transformed Difference)即hadamard变换后再绝对值求和
MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均绝对差值
MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方误差
·SAD和SATD的区别
Q:如果不用率失真最优化,为什么选择SATD+delta×r(mv,mode)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?为什么帧内模式选择要用SATD?
A:
SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。
一般帧内要对所有的模式进行检测,帧内预测选用SATD的原因同上。
在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。
AVC1 与H264
FOURCC:AVC1 描述:H.264 bitstream without start codes.
FOURCC:H264 描述:H.264 bitstream with start codes.
h264的特色
1 多帧参考;2 帧内预测;3 划分更小的宏块。
帧,场
视频的一场或一帧可用来产生一个编码图像。通常,视频帧可分成两种类型:连续或隔行视频帧。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。显然,这时场内邻行之间的空间相关性较强,而帧内邻近行空间相关性强,因此活动量较小或静止的图像宜采用帧编码方式,对活动量较大的运动图像则宜采用场编码方式。
片组,片,宏块
片组是一个编码图像中若干宏块的一个子集,包含一个或若干个片。
一般一个片组中,每片的宏块是按扫描次序进行编码的,除非使用任意片次序(Arbitrary Slice Order, ASO)一个编码帧中的片之后可以跟随任一解码图像的片。
另外一种片组,灵活宏块次序(Flexible Macroblock Ordering, FMO)用灵活的方法,把编码的宏块宏块映射到相应的片组中。
片(Slice):一帧视频图像可编码成一个或者多个片,每片包含整数个宏块,即每片至少一个宏块,最多时包含整个图像的宏块。片(slice)的概念不同与帧(frame),帧(frame)是用作描述一张图片的,一帧(frame)对应一张图片,而片(slice),是 H.264 中提出的新概念,是通过编码图片后切分通过高效的方式整合出来的概念,一张图片至少有一个或多个片(slice)。片(slice)都是又 NALU 装载并进行网络传输的,但是这并不代表 NALU 内就一定是切片,这是充分不必要条件,因为 NALU 还有可能装载着其他用作描述视频的信息。
片的目的:为了限制误码的扩散和传输,使编码片相互间保持独立(每个片(slice)都应该是互相独立被传输的,某片的预测(片(slice)内预测和片(slice)间预测)不能以其它片中的宏块(Macroblock)为参考图像。)。片共有5种类型:I片(只包含I宏块)、P片(P和I宏块)、B片(B和I宏块)、SP片(用于不同编码流之间的切换)和SI片(特殊类型的编码宏块)。
一个编码图像通常划分成若干宏块组成,一个宏块由一个16×16 亮度像素和附加的一个8×8 Cb和一个8×8 Cr 彩色像素块组成。每个图象中,若干宏块被排列成片的形式。
16x16, 16x8, 8x16(,8×8)被称为宏块级,而8×8,8×4,4×8,4×4被称为亚宏块级。
宏块
对于块匹配算法中宏块大小的选择,如果尺寸太大,那么同一宏块内可能包含多个对象,宏块内像素的位移一致的假设就不成立,从而影响运动估计的准确性。如果宏块尺寸太小,会导致运动矢量数量增加,从而造压缩效率的降低,还容易受到噪声的影响。做为运动估计准确性和运动矢量开销的折中,一般采用16X16大小的宏块座位基本单位。
// 0:16X16 Direct模式,在B帧中有效
// 1:Inter16X16,在帧间有效
// 2:Inter16X8,在帧间有效
// 3:Inter8X16,在帧间有效
// P8X8:帧间有效:包括Inter8x8,Inter8x4,Inter4x8,Inter4x4
// I16MB:Intra16X16帧内有效
// I4MB:Intra有效
// I8MB:Intra有效
// IPCM:Intra有效,不要预测,直接对RAW数据编码.
运动矢量
前一帧f(x,y)经f(x+i,y+j)后的到当前帧,此(i,j)即为运动矢量。
树状运动补偿
每个宏块(16×16)的亮度,可以按4种方式分割:1个16×16,2个16×8,2个8×16,4个8×8。8×8模式的子块可以继续划分:1个8×8,2个4×8,2个8×4,4个4×4。这种分割的运动补偿,称为树状运动补偿。树状运动补偿,灵活和细致的划分,大提高了运动估计的精确程度块的大小可变。
h264提出了树状结构运动补偿,进一步采用7种不同尺寸的宏块分割,这极大地增大了块匹配法的灵活性,既可以适应图像中的平坦区域,又可以适应细节较复杂的区域。H.264 标准中提供的块尺寸有16×16,8×16,16×8,8×8,8×4,4×8,4×4。
16x16, 16x8, 8x16被称为宏块级,而8×8,8×4,4×8,4×4被称为亚宏块级。
RDO
首先以RDO为例,模式对应的代价:J(mode)=SSD+λ*R(ref,mode,mv,residual)
这里,SSD是指重建块与源图像的差值均方和;λ是拉格朗日乘子,就当是权值吧;R就是该模式下宏块编码的实际码流,包括对参考帧、模式、运动矢量、残差等的比特总和。当然如果是帧内模式,就只有R(mode,residual)。
前已所述,RDO包含各模式的实际编码过程,也就是变换量化、熵编码、反变换反量化、重建等,计算量是相当大的,实时编码领域不可能直接使用。因此,就有了下面的替代公式:
J(mode)=SAD+λ*R(ref,mode,mv)
J(mode)=SATD+λ*R(ref,mode,mv)
这里SAD就是该模式下预测块与源图像的绝对误差和。比特R中少了对residual的编码,也就是运动估计后就可以直接得到该模式的J(mode)值,极大的减少了运算复杂度。
SATD就是对残差进行哈德曼变换后的系数绝对和,在大多数情形下,SATD比SAD评价效果更好些,我对foreman CIF图像的测试,psnr增加了约0.2db,码流差不多。当然,SATD比SAD多了个变换,计算量大些。
注意:SAD和SATD对应的λ与RDO的λ取值是不一样的。
预测模式
7种帧间模式包括:16x16,16x8,8x16,8x8,8x4,4x8,4x4,分别对应模式编号1~7。值得注意的是,在进行帧间预测的时候,只有在选择了把一个宏块划分成4个8x8的块之后,才能进一步选择8x4,4x8和4x4的分块,因此,在JM模型中把4~7的4种帧间模式统称为P8x8。
17种帧内模式包括:以4x4块为单位进行亮度分量预测的9种模式(统称为I4MB),以宏块为单位进行亮度分量预测的4种模式(统称为I16MB)和以宏块为单位进行色度分量预测的4种模式。
多帧参考
在h264中使用的多帧运动估计技术是对单帧运动估计技术的简单扩展,即在多个参考帧中找到一个使预测误差达到最小的运动矢量。使用5个参考帧和1个参考帧相比可以节省5-10%的码率。多个参考帧存放于帧缓存中,在帧缓存中包括短期参考帧和长期参考帧两种参考类型。为了有效的利用多参考帧,必须采用合理的内存管理方法。在h264中允许采用两种帧缓存管理方案,即自适应缓存管理模式和滑动窗口帧缓存管理模式。
参考队列
H264中允许从多至15个帧里面选择1帧或者2帧出来作为参考进行预测,所以必须引入一个列表来管理这些参考图像,对 与P slice而言,对应 list0,对于 B slice 而言,还需要多一个 list1,因为 B slice 是进行的两次预测!List0:最近前向图像(基于POC)标为index0,接着是其余前向图像(POC 递增顺序),及后向图像(从当前图像POC 递增顺序)。List1:最近后向图像标为index0,接着是其余后向图像(POC 递增顺序),及前向图像(从当前图像POC 递增顺序)。
什么时候用帧内编码
有如下几种情况:
1 视频的第一帧;2视频变化剧烈而导致帧间编码代价过高;3 场景切换后的第一帧。

1万+

被折叠的 条评论
为什么被折叠?



