参考文献:见《High Efficiency Video Coding (HEVC)》High Level Syntax章节
《HEVC标准介绍、HEVC帧间预测论文笔记》系列博客,目录见:http://www.cnblogs.com/DwyaneTalk/p/5711333.html
NAL
NAL:Network Abstract Layer,网络抽象层,编码后的bitstream就是由一个个NAL组成。NAL由一个2 Bytes的NAL header和NAL payload data两部分组成。NAL分为VCL(video coding layer) NAL和non-VCL NAL两类,其中VCL NAL包含一个picture的数据,而non-VCL NAL包含与多个picture相关的控制信息。
slice、segment:编码过程中,视频分为GOP(group of picture),对于每个picture,分成彼此独立的slice(不同slice之间,编码相互独立,不存在相互依赖的关系)。每个slice可以分为一个或多个slice segment,slice segment由header(包含control information)和coded sample,其中slice内第一个segment header为slice header,包含整个slice的control information,之后的slice segment依赖前面的slice segment。
access unit:一般是以picture为单位进行访问的点。
![](https://i-blog.csdnimg.cn/blog_migrate/1a08c01added7db784e1913d330b5170.png)
NAL header(16 bits):如上图,第一bit‘F’固定为0,6-bits NALType 确定NAL的类型,其中VCL NAL和non-VCL NAL各有32类。LayerID表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。TID确定了NAL所在的unit的时域上的层次,如下图:对于a、b而言,虚线下TID都是0,虚线上TID都是1。同一picture内的NAL,TID字段内容相同,作用:TID小的NAL不能依赖TID大的NAL,还可用于控制视频选择部分帧播放。
![](https://i-blog.csdnimg.cn/blog_migrate/5b58ec63d87b4a1e3355af3844f511f5.png)
decoding order VS output order:decoding order就是编解码顺序,也是bitstream中的顺序。output order是视频输出播放的顺序,由POC(picture output count)指定,且每个CVS(coded video sequence)的POC是相互独立的。
VCL NAL
![](https://i-blog.csdnimg.cn/blog_migrate/7c814e871596a2ff58fcac9144a4b482.png)
NAL Type:(如上表2.1)同一个access unit的picture中所有的VCL NAL有相同的NAL Type。对于VCL NAL,包括IRAP(intra random access point,6种)、leading pictures(4种)和trailing pictures(6种)三类和其他16个保留类型。
IRAP:是指使用帧内编码,不参考其他图像。所以IRAP一定是TID为0,编码方式为intra,但是编码方式为intra不一定是IRAP。IRAP解码时不需要依靠其他参考帧,所以在视频随机访问、频道切换、视频编辑等操作时,有重要作用。
![](https://i-blog.csdnimg.cn/blog_migrate/aac3e24a13202baceb63903ebee36eae.png)
Leading pictures VS Trailing pictures:Leading pictures(RASL和RADL) 和 Trailing pictures(TSA、STSA和TRAIL)都是相对于decoding顺序上在前面的一个IRAP,如上图,B2-4和B6-8、P5就associated with I1。Leading pictures是指decoding order在IRAP之后,而output order在IRAP之前的帧,Trailing pictures是指decoding order和output order都在IRAP之后的帧。要求:Trailing pictures只能参考相关的IRAP和相关于同一个IRAP的Trailing pictures,且对于同一个IRAP,必须按照IRAP、Leading pictures、Trailing pictures的顺序进行编解码。
TSA:Temporal Sub-layer Access,时域分层编码,定义了时域分层切换点。TSA帧要满足TSA帧和其编码顺序上随后的TSA帧不会参考TSA帧之前的、TID大于等于TSA帧的任何帧,如上图,P6和P7就是TSA帧。
STSA:Step-wise Temporal Sub-layer Access,步进时域分层编码。STSA帧要满足STSA帧及其编码顺序后面的相同TID的STSA帧不会参考该STSA帧编码顺序前面、有相同TID的帧。如上图,P2属于STSA帧。
TRAIL:Trailing pictures中,除了TSA和STSA之外,其他的都定义为TRAIL帧。
IDR:Instantaneous Decoding Refresh,即刻解码刷新帧,解码时彻底清空解码缓冲区,更新解码过程并重新开始一段新的CSV(coding sequence video),因此IDR及其之后的所有帧都不允许参考IDR之前的帧。根据IDR帧是否有可解码的Leading pictures,IDR可分为IDR_W_RADL和IDR_N_RASL,IDR_W_RADL在解码顺序上有RADL pictures,而IDR_N_RASL帧没有任何Leading pictures。对于IDR,POC一定是0.
CRA:Clean Random Access,对于CRA帧,它的Leading pictures帧可以参考CRA帧之前的帧,所以解码CRA帧时,不会刷新解码器,也不会重新开始一段新的CSV。对于CRA,POC不一定是0.
![](https://i-blog.csdnimg.cn/blog_migrate/d7d5243d206c9f224582cfda160b2e97.png)
RADL:Random Access Decodable Leading,RADL帧是IRAP帧的Leading pictures。对于RADL帧,它只能参考关联的IRAP帧和对应的RADL帧,不能参考关联的IRAP帧解码顺序前面的帧。
RASL:Random Access Skipped Leading,RASL帧是CRA帧的Leading pictures。对于RASL帧,它可以参考关联的CRA帧解码顺序前面帧,因此IDR只能有RADL的Leading pictures,而CRA可以有RADL和RASL的Leading pictures。而且,对于CRA帧,RASL要在RADL之前解码。
BLA:Broken Link Access,针对视频链接所定义的IRAP类型,因为CRA类型相对IDR类型有更高的编码效率,所以视频序列中更多地使用CRA。但是由于CRA的Leading pictures可以是RASL,所以当从CRA帧开始进行视频拼接、访问时,RASL需要参考CRA编码顺序之前的帧,但是这些帧是无法获得的,所以就定义成BLA帧。遇到BLA帧时,对于其编码顺序后与其关联的RASL,直接舍弃。与IDR帧类似,BLA帧解码时从新开始一个新的CSV,但是不同之处在于:BLA并不会把POC设置为0(IDR会),而是设置成BLA header中的值。有三种类型的BLA:BLA_N_LP、BLA_W_RADL和BLA_W_LP,分别代表禁止所有Leading pictures、仅禁止RASL的Leading pictures和RADL、RASL的Leading pictures都允许。
![](https://i-blog.csdnimg.cn/blog_migrate/39992afe094bd24b3be464e3015fbafb.png)
sub-Layer reference VS sub-layer non-reference:如表2.1,对于Leading 和Trailing,每一个种类都有_R和_N两种类型,分别表示sub-Layer reference和sub-layer non-reference。sub-Layer non-reference是指不能够被相同Temporal Layer的帧参考的帧,如上图中B3-4、B6-8和P1;sub-layer reference是指可以被相同Temporal Layer参考的帧,如上图B2。这些在对视频帧进行选择性丢弃时,可以根据这些帧类型进行判断决策。
non-VCL NAL
![](https://i-blog.csdnimg.cn/blog_migrate/555596756180571fe1f2021b95b99730.png)
Non-VCL NAL Type:Non-VCL NAL的种类如上图,Parameter sets包括VPS、SPS和PPS。
Delimiters(分隔符)包括AUD_NUT、EOS_NUT、EOB_NUT,其中AUD_NUT用于指示access unit的边界,所以和access unit内的VCL NAL有相同的TID,是access unit内的第一个NAL。EOS_NUT、EOB_NUT分别表示CVS和bitstream的结束,它们的TID为0,没有payload,只有2-Type的header。
Filler Data对解码过程并没有任何影响,payload就是由一串'11111111'和1-Type的'10000000'组成,主要用来填充数据以满足达到一定的码率。Filler Data要在Access UNIT的第一个VCL NAL之后,并且和access unit有相同的TID。
SEI:supplemental enhancement informatyion,辅助增强信息,提供可选的解码支持元数据。在HEVC中,SEI是prefix(SEI必须在Access unit的所有VCL NAL之前)或者suffix(SEI可以在Access unit的VCL NAL之后)的,而且SEI有些是只对当前Access unit有效,有些作用范围可能是多个Access unit甚至整个SVC。VUI是在SPS中的可选信息,VUI不直接影响解码过程,但是提供两个方面的信息:1、解码图像的展示信息,包括宽高比、扫描、分时等信息;2、限制解码端的一些信息,包括tiles、MV、参考图像等。
![](https://i-blog.csdnimg.cn/blog_migrate/2af248b8befa99be6dd2bdd9674065bf.png)
VPS、SPS、PPS:三者的结构和关系如上图。