分类:
2012-06-26 21:48:41
原文地址:H.264 数据分割 作者:seuzw
一帧图像就是一个Access unit,一个图像序列由几个Access unit组成。其中第一个Access unit就是IDR帧,其他的Access unit是非IDR帧(B帧或者P 帧)。I帧的Access unit包括的SEI nalu可以被一个序列的其他p帧或者B帧access unit共享。一组非参数集NALU被称为一个接入单元(Access Unit),delimiter定界后加上定时信息(SEI),后面紧跟基本编码图像(PCP,primary coded picture)。PCP后面是冗余编码图像(CRP,corresponding redundant picture),用于解码中PCP丢失情况下恢复信息。冗余分片允许编码器把在同一个码流中添加同一MB的一个或更多冗余表示。需要注意的是这些冗余片 的编码参数与非冗余片的编码参数不同,例如主片可用低QP(高质量)来编码,而冗余信息中能用一个高QP(低质量)的方式来编码,这样质量粗糙一些但码率 更低。解码器在重构时,首先使用主片,如果它可用就抛弃冗余片;而如主片丢失(比如因为包的丢失)冗余片也能被用于重构。冗余片主要用于支持高误码的移动 环境。 冗余编码图像的计数器redundant_pic_cnt是递增的。序列结束nalu标志着一个Access unit的结束。Nalu type=0,12,19~31不能出现在PCP前面。
一个primary coded picture结束以后,如果紧接着出现了下列Nalu之一则标志着新的一个Access unit开始了:
1. access unit delimiter,这是access unit的第一个nalu,一个access unit只能有一个access unit delimiter定界nalu
2. 序列参数集
3. 图像参数集
4. 定时信息SEI,SEI出现于primary之前。如果SEI包含缓冲期的消息,则应该出现在第一个SEI nalu包的第一个消息。
5. 类型为13~18的Nalu
6. 另一个primary coded picture的第一个VCL nalu,如何判断PCP中的第一个VCL nalu请看下文。
一个PCP 包括一个或者几个slice,第一个VCL nalu有如下特征:
1. Slice header中的frame_num不一样
2. 使用的pic_parameter_set_id不一样
3. field_pic_flag不一样
4. bottom_field_flag不一样
5. nal_ref_idc不一样,其中一个nal_ref_idc=0
6. pic_order_cnt_type=0:pic_order_cnt_lsb不一样,或者delta_pic_order_cnt_bottom不一样
7. pic_order_cnt_type:delta_pic_order_cnt[ 0 ]不一样,或者delta_pic_order_cnt[ 1 ]不一样
8. nal_unit_type不一样,其中一个nal_unit_type=5
9. nal_unit_type=5:idr_pic_i不一样
一幅图像由若干片组成,每片包含一系列的宏块(MB)。MB的排列可按光栅扫描顺序,也可不按扫描顺序。每个片独立解码,不同片的宏块不能 用于自身片中作预测参考。因此,片的设置不会造成误码扩散。灵活的宏块排序FMO是H.264的一大特色,适用于H.264的基本档次和扩展档次的应用。 图像内部预测机制,例如帧内预测或运动矢量预测,仅允许用同一片组里的空间相邻的宏块。FMO通过宏块分配映射技术,把每个宏块分配到不按扫描顺序的片 中。FMO模式划分图像的模式各种各样,重要的有棋盘模式、矩形模式等。当然FMO模式也可以使一帧中的宏块顺序分割,使得分割后的片的大小小于无线网络 的MTU尺寸,经过FMO模式分割后的图像数据分开进行传输。使用FMO的代价是稍微降低了编码效率(因为它打破了原先非邻居MB之间的预测),而且在高 度优化的环境中,有较高的时延。
通常情况下,一个宏块的数据是存放在一起而组成片的,数据划分使得一个片中的宏块数据重新组合,把宏块语义相关的数据组成一个划分,由划分来组装片。H.264视频编码标准使用了三种不同类型的数据分割:
1. A型分割 :A型分割是头信息划分,包括宏块类型、量化参数和运动矢量,这个信息是最重要的。
2. B型分割 :B型分割是帧内信息划分,包括帧内CBPs和帧内系数。帧内信息可以阻止错误的传播,该型数据分割要求给定分片的A型分割有效,相对于帧间信息,帧内信息能更好地阻止漂移效应,因此它比帧间分割更为重要。
3. C型分割:C型分割是帧间信息划分,包括帧间CBPs和帧间系数,一般情况下它是编码分片的最大分区。帧间分割是最不重要的,它的使用要求A型分割有效。
当使用数据分割时,源编码器把不同类型的分割安排在3个不同的缓冲器中,同时分片的尺寸必须进行调整以保证小于MTU长度,因此是编码器而 不是NAL来实现数据分割。在解码器上,所有分割用于信息重建。这样,如果帧内或帧间信息丢失了,有效的帧头信息仍然能用来提高错误隐藏效率,即有效的宏 块类型和运动矢量,保留了宏块的基本特征,从而仍可获得一个相当高的信息重构质量,而仅仅丢失了细节信息。
如果profile/level中规定允许乱序slice(FMO),则I帧可以随意顺序(棋盘模式、矩形模式等等)传输,而B、P帧中的coded slice以及A分割slice data可以随意顺序传输。相同slice_id的A分割slice data优先于B分割,而B分割又优先于C分割。
如果profile/level中规定不允许乱序slice(FMO),则I帧的VCL nalu顺序应该按照MB地址递增(光栅扫描)的顺序进行传输。B、P帧的coded以及A分割slice data按照MB地址递增(光栅扫描)顺序传输。同样的,相同slice_id的A分割slice data优先于B分割,而B分割又优先于C分割。