实现H264恢复点的功能
由 hubdog 于 星期二, 2009-06-16 09:38 发表
恢复点(Recovery Point)的定义参见H264的D.1.7 Recovery point SEI message syntax
对于H264图像恢复容错和恢复来说,通常是基于IDR帧的,但是某些图像生成时的GOP只有第一帧是IDR帧,其它的I帧都是普通的I帧,对于I帧来说,不同于IDR,I帧之后的图像是可以参考到I帧之前的参考帧,这样的话如果从I帧开始恢复的话,I帧之前的帧因为不存在了,会导致之后的图像一部分无法复原。比如下面的图像
I1 P2 P3 I4 P5 P6 I7
当参考帧数=4的时候, P5的参考帧是(P3, I4, P6, P7),当I4之前的图像坏掉的时候,由于P5参考了P3,会导致生成的图像中有坏块。而当插入恢复点信息时,我们就需要注意依据插入点的位置,调整参考帧的引用。对于参考帧的修正,主要是基于两类命令。
一类是MMCO命令(用于DPB的动态内存管理),一类是RPLR命令。前者用于动态的将恢复点钱的参考帧移出DPB,比如在编码P5的时候将上图的P3移出DPB。RPLR命令主要是用来对参考帧进行重排序,原因是解码器通常总是基于编码顺序对参考帧进行管理,但是对于金字塔GOP结构的编码来说,由于B帧可以作为参考帧,而B帧的编码顺序又是在I帧之后,而用MMCO命令时,只能将I帧之前的I或P帧移出,不能将B帧移出DPB,这样仍然会导致I帧之后的帧会参考到B帧,这时就要将DPB进行重排,按照显示顺序参考,因为B帧的显示在I帧之前,这样就可以用MMCO命令将B帧正确的移出了。