H.264句法和语法总结H.264句法和语法总结...........................................................................................................................1(一)句法元素的分层结构..............................................................................................................2(二)NAL层句法.............................................................................................................................4(三)序列参数集层(SPS)句法......................................................................................................6(四)图像参数集语义......................................................................................................................8(五)片头句法................................................................................................................................10(六)参考帧队列重排序(REORDERING)句法............................................................................14(七)加权预测句法........................................................................................................................15(八)参考图像序列标记(MARKING)操作的语义.........................................................................16(九)片层数据句法........................................................................................................................17(十)宏块层句法............................................................................................................................19(十一)宏块层预测句法................................................................................................................19(十二)子宏块预测句法................................................................................................................20(十三)残差句法............................................................................................................................20(十四)CAVLC残差句法.............................................................................................................21NAL技术...........................................................................................................................................23H264基本概念之宏块、片和片组.................................................................................................26H.264起始码.....................................................................................................................................28MPEG4起始码..................................................................................................................................29(一)句法元素的分层结构在H.264定义的码流中,句法元素被组织成有层次的结构,分别描述各个层次的信息,如下图所示在H.264中,句法元素共被组织成序列、图像、片、宏块、子宏块五个层次。在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来,尤其在序列层及图像层。在H.264中,分层结构最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的大部分句法元素游离出来形成序列和图像两级参数集,其余的部分则放入片层。参数集是一个独立的数据单位,不依赖于参数集外的其他句法元素。由于参数集是独立的,可以被多次重发或者采用特殊技术加以保护。复杂通信中的码流中可能出现的数据单位:IDR:一个序列的第一个图像叫做IDR图像(立即刷新图像),IDR图像都是I图像。H.264引入IDR图像是为了解码的重同步,当解码器解码到IDR图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。IDR图像一定是I图像,但I图像不一定是IDR图像。(二)NAL层句法NAL&VCL:H.264的功能分为两层,即视频编码层(VCL)和网络提取层(NAL,NetworkAbstractionLayer)。VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元中。每个NAL单元包括一个原始字节序列负荷(RBSP)、一组对应于视频编码数据的NAL头信息。NAL单元序列的结构如下:RBSP的类型:RBSP类型描述参数集PS序列的全局参数,如图像尺寸、视频格式等等增强信息SEI视频序列解码的增强信息图像定界符PD视频图像的边界编码片片的头信息和数据数据分割DP片层的数据,用于错误恢复解码序列结束符表明下一图像为IDR图像流结束符表明该流中已没有图像填充数据哑元数据,用于填充字节PS:包括序列参数集SPS和图像参数集PPS,SPS包含的是针对一连续编码视频序列的参数,如标识符seq_parameter_set_id、帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符pic_parameter_set_id、可选的seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。数据分割:组成片的编码数据存放在3个独立的DP(数据分割,A、B、C)中,各自包含一个编码片的子集。分割A包含片头和片中每个宏块头数据。分割B包含帧内和SI片宏块的编码残差数据。分割C包含帧间宏块的编码残差数据。每个分割可放在独立的NAL单元并独立传输。NAL层句法:nal_unit(NumBytesInNALunit){//forbidden_zero_bit等于0forbidden_zero_bit//nal_ref_idc指示当前NAL的优先级。取值范围为0-3,值越高,表示当前NAL越重要,需要优先受到保护。H.264规定如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的数据单位时,本句法元素必须大于0。nal_ref_idc//nal_unit_type指明当前NALunit的类型nal_unit_typeNumBytesInRBSP=0/*rbsp_byte[i]RBSP的第i个字节。RBSP指原始字节载荷,它是NAL单元的数据部分的封装格式,封装的数据来自SODB(原始数据比特流)。SODB是编码后的原始数据,SODB经封装为RBSP后放入NAL的数据部分。下面介绍一个RBSP的生成顺序。从SODB到RBSP的生成过程:-如果SODB内容是空的,生成的RBSP也是空的-否则,RBSP由如下的方式生成:1)RBSP的第一个字节直接取自SODB的第1到8个比特,(RBSP字节内的比特按照从左到右对应为从高到低的顺序排列,mostsignificant),以此类推,RBSP其余的每个字节都直接取自SODB的相应比特。RBSP的最后一个字节包含SODB的最后几个比特,及如下的rbsp_trailing_bits()2)rbsp_trailing_bits()的第一个比特是1,接下来填充0,直到字节对齐。(填充0的目的也是为了字节对齐)3)最后添加若干个cabac_zero_word(其值等于0x0000)*/for(i=1;iNumBytesInNALunit;i++){if(i+2NumBytesInNALunit&&next_bits(24)==0x000003){rbsp_byte[NumBytesInRBSP++]rbsp_byte[NumBytesInRBSP++]i+=2//emulation_prevention_three_byteNAL内部为防止与起始码竞争而//引入的填充字节,值为0x03。emulation_prevention_three_byte}elserbsp_byte[NumBytesInRBSP++]}}(三)序列参数集层(SPS)句法seq_parameter_set_rbsp(){//profile_idclevel_idc指明所用profile、levelprofile_idc//constraint_set0_flag等于1时表示必须遵从附录A.2.1所指明的所有制约条件。等于0时表示不必遵从所有条件。constraint_set0_flag//constraint_set1_flag等于1时表示必须遵从附录A.2.2所指明的所有制约条件。等于0时表示不必遵从所有条件。constraint_set1_flag//constraint_set2_flag等于1时表示必须遵从附录A.2.3所指明的所有制约条件。等于0时表示不必遵从所有条件。constr