H263入门的一些基础知识
h263 是ITU-T用于视频会议的编码标准,最初设计是为了h.324的系统进行传输。后来发现H263也可以用于 H323,H320,RTSP,SIP协议传输。
1998年新增了功能,出现了第二版H263v2,也叫H263+,H263-1998. 2000年出现了第三版,H263v3,也叫H263++,H263-2000.
参考网址
https://www.itu.int/rec/T-REC-H.263-200501-I/en
https://datatracker.ietf.org/doc/html/rfc2190
https://datatracker.ietf.org/doc/html/rfc4629
H263支持的图像格式
| 图像格式 | 亮度行像素数 | 亮度行数目 | 色度行像素数 | 色度行 |
|---|---|---|---|---|
| sub-QCIF | 128 | 96 | 64 | 48 |
| QCIF | 176 | 144 | 88 | 72 |
| CIF | 352 | 288 | 176 | 144 |
| 4CIF | 704 | 576 | 352 | 288 |
| 16CIF | 1408 | 1152 | 704 | 576 |
H263的编码流程
编码过程其实和264异曲同工,主要分为预测变换和熵编码,预测同样是帧内和帧间预测,变换使用DCT变换,量化后进行熵编码

H263句法分级结构
h263 分层4个基本层级。从顶层到底层分别为: 图像,块组或截面或视频图像分段,宏块,块
图像
h263种包含7种图像类型:
1.I帧,INTRA预测
2.P帧, INTER预测
3.PB帧, 表示两个图像,都参考过去的帧
4.改进的PB帧,功能类似PB帧但是效果更好。详细描述在建议书的附件M,没有去深究了
5.B帧,参考时间域前后的两个图像
6.EI帧,在时间域内同时存在多个参考帧图像,参考图像具有相同或者较小的尺寸
7.EP帧,时间域内有2个参考图像,其中一个时间域超前,另外一个时间域同时存在,且具有相同或较小的尺寸
GOB
块组和GOB实质上是将几行的宏块组合在一起,将图像分割成不同的区域。 GOB规定每个块组最多Kx16行构成,若行数小于400,K=1,行数在400到800之间K=2,行数大于800,K=3.

宏块
每个GOB被分成宏块,每个宏块为16x16的亮度分量和 8x8的色度分量
H263支持的高级功能
H263支持 4种可选择的高级功能,标记在H263 header内,提供灵活的开关。
先进的预测模式(AP)Adanced Prediction:
每宏块4个运动矢量
交叠块运动补偿
P-B frames
和H264的B帧一样的功能,猜测就是这个时候H26x系列增加了B帧的功能
基于句法的算法编码模式(SAC) syntax-based Arithmetic Coding
所有相应的ITU建议书的变长编/译码操作均用算术编/译码操作替代
非受限运动矢量模式 unrestricted motion vectors
运动矢量的范围和供编码运动矢量差分所使用的VLC表依赖于图像帧头的PLUSPTYPE场是否存在。当PLUSPTYPE存在时,运动矢量的范围也依赖于图像尺寸和图像帧头中UUI场的值
H263的句法语义
这里仅简单介绍部分后续在rtp封包中有使用的,如果有需要请看ITU官方文档
图像层
每帧图像数据由图像头和跟随的块组或截面数据组成,最后跟随着任选的序列结束码和填充比特。其结构在图7中显示,其中该图像不包括任选的PLUSPTYPE数据场,只要由CPM指示,PSBI就存在。只要PTYPE指示使用“PB帧”模式,TRB和DBQUANT就存在(除非PLUSPTYPE场存在并在那点指示使用
DBQUANT)。
如PTYPE的比特6-8中所指示的那样,任选的PLUSPTYPE场存在。只要存在,比特流中就包括一个附加的数据集,该数据集立即紧随PTYPE并且优先于PQUANT。另外,当PLUSPTYPE存在时,在图像头部中CPM和PSBI场前移,以至它们立即出现在PLUSPTYPE之后,而不是定位在PQUANT之后。跟随PLUSPTYPE的附加数据格式在图8中显示。PLUSPTYPE之后在此附加图像头部数据中所有场均为任选的,依赖于在PLUSPTYPE中它们的存在是否被指明。当使用截面结构模式时(见附件K),对图7中所示的GOB位置以截面替代。
PSUPP和PEI的组合可以不存在,并且一旦存在可以重复。EOS和EOSBS+ESBI可以不存在,而仅当EOS或EOSBS存在时,ESTUF才可以存在。EOS不应被重复,除非每对EOS码之间至少出现一个图像起始码。下线的图像其图像头部不传输。

PSC:
PSC是22比特字。它的值为0000 0000 0000 0000 1 00000。所有图像起始码应字节定位。
PTYPE(变长):
— 比特1:总是“1”,为避免起始码仿真。
— 比特2:总是“0”,为同ITU-T H.261建议书区分。
— 比特3:分屏指示符,“0”断,“1”通。
— 比特4:文件摄像指示符,“0”断,“1”通。
— 比特5:全图像冻结释放,“0”断,“1”通。
— 比特6-8:源格式,“000”禁用,“001”子QCIF,“010”QCIF,“011”CIF,“100”4CIF,“101”16CIF,“110”保留,“111”扩展的PTYPE。若比特6-8不等于指示扩展的PTYPE(PLUSPTYPE)的“111”,则下列五个比特在PTYPE中也存在:
— 比特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帧。
ESTUF:
填充,由少于8个零比特组成的可变长码字。编码器可在EOS码字之前直接插入此码字。若必要,编码器应插入该码字以实现EOSBS码字之前的直接强制字节定位。若ESTUF存在,则ESTUF的最后比特应是字节的最后(最低有效)比特,以致EOS或EOSBS码字的起始被字节定位。
EOS:
序列结束,22比特码字。它的值是0000 0000 0000 0000 1 11111。编码器决定是否插入此码字。EOS可以被字节定位。这可通过EOS码之前插入ESTUF来实现,以致EOS码的首比特是字节的第一(最高有效)比特。EOS不应重复除非每对EOS代码之间至少出现一个图像起始码。
PSTUF:
填充,由少于8个零比特组成的可变长码字。编码器插入此码字可供下一个PSC的字节定位。PSTUF的最后比特应是字节的最后(最低有效)比特,以致H.263比特流中包括PSTUF的视频比特流从第一比特起是8比特的一个倍数。译码器应设计丢弃PSTUF。
若为了某种理由,在某个确定的时间周期编码器停止编码图像并在以后恢复编码,则编码器停止之前应传输PSTUF,以防止先前图像的最后的最多7比特未被发送,直到编码器恢复编码时为止。
块组层

GSTUF:
填充,由少于8个零比特组成的可变长码字。在GBSC码字之前,编码器可直接插入此码字。若GSTUF存在,GSTUF的最后比特应是字节的最后(最低有效)比特,以致GBSC码字的起始被字节定位。译码器应设计为丢弃GSTUF。
GBSC:
块组起始码,为一个17比特字。它的值是0000 0000 0000 0000 1。GOB起始码可以字节定位。通过起始码前插入GSTUF能够实现字节定位以致起始码的首比特是字节的第一(最高有效)比特。
GN:
块组编号
宏块层

DQUANT:
量化器信息
MVD,MVD2,MVD3,MVD4:
所有inter宏块都有的运动矢量信息,在payload head当中有使用,但不是直接使用数值,有经过一定的转化
H263的PAYLOAD HEAD
当将H263的流打包发送时,需要将比特流打包成RTP协议,此时需要将H263流之前增加一个payload header标识一些数据,再添加RTP header进行rtp封包。
1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
h263+
1 |
|
h263+ 的包头如上,其中
RR:5bit
预留位,需要被设成0
P:1bit
表示视频开始或者视频结束,需要被置1
V:1bit
表示 video redundancy coding 功能的开启,如果开启会有8bit的VRC信息紧跟payload header
PLEN:6bit
附加信息的长度,如果携带附件信息,如果便宜这个长度的地址才能找到图像的start code,如果没有附件信息PLEN设成0
PEBIT:3bit
表示 picture head最后一个字节需要忽略的bit数,如果PLEN是0的话,这个也是0
H263
H263 有3种payload header,分别教Mode A,B和C
当一个rtp包从一个图像头开始的时候,使用Mode A; 当RTP包从图像中间开始,且不支持PB帧的时候,使用Mode B; 当RTP包从图像中间开始,又支持PB帧的时候,使用ModeC
Mode A
1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
F: 1bit
F=0, Mode A; F=1. Mode B 或者 C
P: 1bit
P=0, ModeB; P=1 ,Mode C
SBIT: 3bit
第一个字节需要忽略的位数
EBIT:3bit
最后一个字节需要忽略的位数
SRC:3bit
源图像的格式,为H263 图像层句法的6,7,8位
I:1bit
I=0, 帧内编码; I=1,帧间编码
U:1bit
是否使用了非受限的运动矢量功能,四种高级高能之一
S:1bit
是否使用了SAC功能,4种高级功能之一
A: 1bit
是否使用了AP功能,4种高级功能之一
R:4bit
预留,需要设成0
DBQ: 2bit
PB帧没有使用的话设0, PB帧使用的话设置成DBQUANT句法的数值
TRB: 3bit
PB帧没有使用的话设0, PB帧使用的话设置B帧的时域参考信息
TR:3bit
PB帧没有使用的话设0, PB帧使用的话设置P帧的时域参考信息
Mode B
1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
QUANT: 5bit
这个包起始的宏块句法GQUANT 的量化信息,如果起始位是GOB头的话就设成0
GOBN:5bit
这个包起始位置的GOB序号
MBA: 9bit
第一个MB在当前GOB的地址
HMV1,VMV1,HMV2,VMV2: 每个都是7bit
这个包第一个宏块的对应MVD,MVD1,MVD2,MVD3的信息
Mode C
1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
是Mode A和Mode B的结合,所有的信息在前面的介绍都能找到