H.264 中的相关问题

来源:百度文库 编辑:神马文学网 时间:2024/04/20 07:06:00
中的相关问题
H.264帧内、帧间解码... 1
RDO.. 1
T264中的slice type decision. 2
帧内解码时,在解码端,首先通过当前宏块左边、上边已经解码完成的宏块使用当前宏块的预测模式(预测模式计算过程请参见我的论文《H.264数字视频差错控制技术的研究》,在群FTP“本群原创资料”目录中)得到当前宏块的像素预测值。然后通过对码流进行解码得到当前宏块的像素残差。最后将残差和预测值加在一起就得到重构的像素值。如果当前宏块的左边或者右边的宏块不存在(即当前宏块为图像边界上的宏块),那么其预测值全部为128。
帧间解码时,在解码端,首先对码流进行解码得到当前宏块的参考帧,然后通过当前宏块周围宏块计算运动矢量预测值(具体方法见毕厚杰书99页,标准中也有,但我一时不知道在什么地方了)。然后通过对码流进行解码得到当前宏块的运动矢量残差。将运动矢量残差与运动矢量预测值相加得到实际的运动矢量。然后通过对码流进行解码得到当前宏块的像素残差(如果当前宏块有像素残差的话)。然后通过参考帧与上面计算得到的MV计算出当前宏块的像素预测值。再将像素预测值与像素残差相加就得到当前宏块的重构。
说明:
1、以上过程为 JM86 的解码过程。并不一定所有代码都按照这个流程;
2、上面说的运动矢量预测值的计算过程实际是以4*4块为单位,参考帧也是针对4*4块做的。这里写成宏块主要是方便大家理解。
Rate-Distortion Optimization 是视频编码中最优选择mode的一种方法。比如h.264里好多mode 8x8 16x16 I4x4 I16 在给定的条件下,哪个是最好的?
Distortion 是指选用candidate mode产生的失真,rate是用这个mode需要的rate.他们换算成RDCost = Distortion + lamda * rate. 两个mode谁的rdcost 低就选谁,其中的数学原理是条件极值转非条件极值。
JM 里用的RDO是比较经典的方法。最早是Gary J.Sullivan做的 参见 IEEE Signal Processing Magazine 1998 Nov.  "Rate-Distortion Optimization for video compression" rdo的经典。 h264里的rdo还可参考CSVT H.264 special issue.
在H.264里面当前帧属于哪个slice的决定形式是多种多样的,对于JM中的码流中,一般一帧图象就认为是一个slice,那么如果当前帧是一个I帧,那么它就属于一个I slice.这时整个frame的为一个slice.但是具体我们用什么样的方式来进行slice type的决策呢,这也是一个问题。我们看一下T264里面是如何处理这个问题的。
在T264中,如果我们设定了,USE_SCENEDETECT的话,当前的slice种类是由当前帧的帧号与设定的idrframe,iframe跟bframe相关的,如果frame_no%idrframe==0的话,那么说明当前帧是属于一个IDR slice的,如果frame_no%iframe==0的话,该帧属于一个I slice.如果上面的情况不满足那么是属于P slice或B slice.由于码流中只有如下几种类型:0) I P P P ..... I P P P  1) I B P B P.....B P B P   2) I B B P B B P.....B B P I B B P,所以如果frame_no%(bframe+1)==0的话,就属于P slice,如果不是的话属于B slice.
如果没有使用USE_SCENEDETECT的话,是用MeAnalysis来决定当前属于什么slice的。这种形式是动态式地决定是不是要加入一个I slice。决定流程如下:如果我们达到了我们在config里面设定的iframe interval的话,当前帧就是一个I slice.我们设定一个INTRA_THRESHOLD,对帧中的每一个宏块进行预测,来计算sad.这个过程因为计算量比较大,所以使用了简化算法,首先用前一帧的mv做预测值,计算sad,如果这个值大于我们设定的SEARCH_THRESHOLD的话,说明上一帧的mv已不适合做当前帧的预测,我们会使用一个简化的diamond search来简单地找一下当前宏块的mv,进行sad计算。整个帧的sad计算结束之后,我们与INTRA_THRESHOLD进行比较,如果sad大的话,这一帧为I slice中的一帧,如果小的话,我们认为它是一个P或B帧。对于当前帧是P还是B帧还是用上面的方法进行。