Chinaunix首页 | 论坛 | 博客
  • 博客访问: 512936
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: LINUX

2009-04-13 20:38:47

引用自:

http://lamxu.spaces.live.com/blog/cns!925E98EF4CACCF48!133.entry

H.26L中的Access unit结构分析

一帧图像就是一个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分割。

阅读(2172) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~