句法和语义可以理解为一个翻译器,他描述的码流的具体含义,让使用者通过一种特定的转译方式在读懂它。
句法分层
H263的视频句法分层4级结构,分别为:图像,块组,宏块,块
标准文档中用这样一张图描述了H263的句法结构,其中用箭头标注的点为每一个层级的交界部分,中间上上下下的很多箭头表示的意思是:可能会跳过这个箭头跨过的所有句法字段,所以每一个层级的句法结构其实都是变长的,下面将会选择一些比较关键的句法结构介绍
图像层
为了更好理解,以一个真实的H263码流为例子,接下来将以下图种的Address为行定位, 0-f位列定位,定位到具体的16进制数上来描述这个码流?
图像层的所有句法标识用一张图展示出来如下
仅选择其中比较重要的部分介绍
PSC
全称是picture start code 顾名思义表示一帧图像的起始位置,它由22个bit构成,固定值为0000 0000 0000 0000 1 00000, 在上图码流中 adresss 00000000 的[0-2]列中一共有24个bit, 故第三个字节的最后2个bit不属于psc,前6个bit属于psc,16进制展开为2进制,正好就是0000 0000 0000 0000 1000 00
TR
时域参考(TR)一般情况下是自加1标识一个帧, 若TR跳跃,则说明中间有帧被漏了。8bit,在CIF图像的标准时钟频率下(29.97Hz)最大就是256,其他情况下则可能有10bit组成,该位置为低8位,在上面图8的第二行从右往左数第三个ETR中会有2个bit表示高2位,组成一个10bit的时域参考。注意:TR在仅在P帧的时候+1, B帧是不加的;
?
其实跟H264的POC类似的意思,直接拿码流的数据看,TR为第三个字节的后两个bit,和第四个字节的前6个bit组成
?
这里截图了第一帧和第二帧的前几个字节的数据
第一帧的TR为 1000 00[00 0000 00]10 = 0
第二帧的TR为 1000 00[00 0000 01]10 = 1
可以看出TR是一个逐帧加1的,看一通过查看TR来判定是否出现了跳帧
PTYPE(变长)
类型信息,这个字段是263码流中非常重要的子一个字段,它携带了这个码流的很多信息
它的前两个bit固定为“10”,接下来三个bit分别表示了3种能力的开关
— 比特3:分屏指示符,“0”断,“1”通。
— 比特4:文件摄像指示符,“0”断,“1”通。
— 比特5:全图像冻结释放,“0”断,“1”通。
第6-8这三个bit非常关键,它表示了这个码流的分辨率
“000”禁用,“001”子QCIF,“010”QCIF,“011”CIF,“100”4CIF,“101”16CIF,“110”保留,“111”扩展的PTYPE。
所以变长就体现在这里, 如果这三个bit是“111”,则后面会跟12或30bit的拓展信息,这个拓展信息就叫PLUSPTYPE,展示在图8里面
这里可以看到PLUSPTYPE也是一个变长码,它有可能有12或者30bit
但是如果这三个bit不是 “111”,则下列五个比特在PTYPE中也存在,但是如果是“111”,那么这5个bit就没有了!!!:
— 比特9:图像编码类型,“0”INTRA(I图像),“1”INTER(P图像)。
— 比特10:任选的非受限运动矢量模式(见附件D),“0”断,“1”通。
— 比特11:任选的基于句法的算术编码模式(见附件E),“0”断,“1”通。
— 比特12:任选的先进的预测模式(见附件F),“0”断,“1”通。
— 比特13:任选的PB帧模式(见附件G),“0”正常的I或P图像,“1”PB帧。
?
其中bit9,标识了这个图像的图像类型,是否为
关键帧!!!!所以这个bit的位置非常重要,如果6-8bit不是“111”,则在bit9可以拿到关键帧信息。
?
以该码流为例子
PTYPE从第四个字节的后2bit开始为 10 0001 1100
前2个bit固定为10,6-8bit为 “111”, 说明其后面跟着为PLUSPTYPE,而不是标识图像类型的bit
?
PLUSPTYPE(变长)
PLUSPTYPE由最多三个子场UFEP、OPPTYPE和MPPTYPE组成。而当UFEP里面存在特殊字时,OPPTYPE才会存在,这就是其变长的原因。
可以以上面例子为例 adrress 0000000 - [4-5]bit为 1c c8
展开为 0001 11][00 1]100 1000
UFEP
3bit, 如果为“000”后面就没有OPPTYPE,如果时“001”后面就跟OPPTYPE; 如果图像为I帧,那么一定为“001”, 在图像中应该至少5s间隔就出现一次UFEP为001的情况
?
如上面展开可以看到0001 11][00 1]100 1000 UFEP为 “001”,那么其后面为OPPTYPE
?
OPPTYPE
一共18个bit
比特1-3
源格式,“000”保留,“001”子QCIF,“010”QCIF,“011”CIF,“100” 4CIF,“101”16CIF,“110”惯例源格式,“111”保留的;
可以看出这里UFEP后面跟着为?0001 11][00 1]【100】 1000,标识这个码流时4CIF的
那如果不是这几个标准分表率,则为 “110”在后续的CPFMT字段中会标识其具体的分辨率
后面4-18bit 内容都不重要在此略过
?
MPPTYPE
如果不存在OPPTYPE,则UFPE直接跟着MPPTYPE,如果存在OPPTYPE,则MPPTYPE跟在OPPTYPE后面。
MPP一共9个bit, 其中1-3bit标识图像类型,后面6个bit都不重要不展开描述了,这里描述了该帧是否为关键帧
图像类型代码:
?
“000”I图像(INTRA),
?
“001”P图像(INTER),
?
“010”改进的PB帧(见附件M),
?
“011”B图像(见附件O),
?
“100”EI图像(见附件O),
?
“101”EP图像(见附件O),
?
“110”保留的,
?
“111”保留的;
?
再以一个例子
PSC 22bit + TR 8bit + PYPE 8bit + UEFP 3bit + OPPTYPE 18bit = 59bit / 8? = 7 也就是说7个字节开始才是MPPTYPE信息
?
将码流第七个字节展开 001【0 00】01 ,从第四个bit,即码流的第60个bit开始是MPPTYPE信息,1-3bit为图像类型,这里为000,代表图像是一个
关键帧
?
?
CPM和PSBI
图像头部CPM(1比特)和PSBI(2比特),在图像头部CPM和PSBI场的定位依赖于PLUSPTYPE是否存在(见5.1.20和5.1.21)。若PLUSPTYPE 存在,那么图像头部中PLUSPTYPE之后CPM立即紧随,若PLUSPTYPE不存在,那么图像头部中PQUANT 之后CPM立即紧随。PSBI总是立即紧随CPM(只要CPM=“1”)。
?
CPFMT
仅当惯例图像格式的使用在PLUSPTYPE中标示且UFEP为“001”时,23比特的固定长度码字才存
在。只要存在,CPFMT构成如下:
— 比特1-4
像素宽高比代码:表5中4比特字指示出PAR值。对于扩展的PAR而言,精确的像素
宽高比应在EPAR(后面的字段)中指明
PAR代码 | 像素宽高比 |
0000 | 禁用 |
0001 | 1:1正方形 |
0010 |
12∶11(4∶3 的 CIF 图像)
|
0011 |
10∶11(4∶3 的 525 类型图像)
|
0100 |
16∶11(16∶9 的 CIF 展宽图像)
|
0101 |
40∶33(16∶9 的 525 类型展宽图像)
|
0110-1110 | 保留的 |
1111 | 扩展的宽高比 |
?
?
— 比特5-13? 图像宽度指示:范围[0,511],每行像素数=(PWI+1)*4;
— 比特14? ?等于“1”防止起始码仿真;
— 比特15-23? ?图像高度指示:范围[1,288],行的数目=PHI*4;
?
再举一个例子
PSC 22bit + TR 8bit + PYPE 8bit + UEFP 3bit + OPPTYPE 18bit + MPPTYPE 9bit + CPM 1bit = 69bit / 8 = 8 字节,也就是说第9个字节开始才是CPFMT信息
?
分析这个码流从PTYPE开始 第4字节开始展开
?
? ? 0? ? ? ?2? ? ? ? ? ?1? ? ? ? C? ? ? ? ?E? ? ? ? ? 8? ? ? ?2? ? ? 1? ? ? ? 0? ? ? ? 0? ? ? ? ?1? ? ? ? ? ?
0000 00][10] [000][1 11][00 1][110] [1000 0010 0001 000][0 00][00 0001]
? ? TR? ? ? ? ? ? ? ? ? ? SRC/UFEP/SRC? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? I帧? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [? ? ? ? ? ? ? ? ? ? ? ? PLUSTYPE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ]
?
? ?0? ? ? ? ? ? F? ? ? ? 7? ? ? ?F? ? ? ? ? ?0? ? ? ?e? ? ? 4
[0][000 1][111 0111 11][1][1? 0000? 1110] 0110
CPM[PAR? ? ? ? PWI? ? ? ? ? ? ? ? ? PHI? ? ? ?]?
[? ? ? ? ? ? ? ? ? ? CPFMT? ? ? ? ? ? ? ? ? ? ?]
?
可以看出第一个SRC为 “1111”, 标识后面跟着PLUSTYPE拓展信息,第二个SRC为“110”标识为自定义的分辨率再CPFMT.
CPM = 0 故后面没有PSBI,直接跟着CPFMT
PWI为 111 0111 11 = (479 +1 ) x 4 = 1920
PHI为??1? 0000? 1110 = (269 +1)x4 = 1080
所以这个码流是一个1080p的码流
?
?
?
块组层
只介绍一些会使用的部分,其他都略过介绍了
GSTUF
填充,由少于8个零比特组成的可变长码字。在GBSC码字之前,编码器可直接插入此码字。若GSTUF存在,GSTUF的最后比特应是字节的最后(最低有效)比特,以致GBSC码字的起始被字节定位。译码器应设计为丢弃GSTUF。
GBSC
块组起始码,为一个17比特字。它的值是0000 0000 0000 0000 1。GOB起始码可以字节定位。通过起始码前插入GSTUF能够实现字节定位以致起始码的首比特是字节的第一(最高有效)比特。
GN
块组编号,会在RTP打包当中使用
?
宏块层
只介绍一些会使用的部分,其他都略过介绍了
?
DQUANT
量化器信息,标识其量化参数大小
MVD,MVD2,MVD3,MVD4
所有inter宏块都有的运动矢量信息,这个部分在RTP打包中会使用到
?