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-QCIF128966448
QCIF1761448872
CIF352288176144
4CIF704576352288
16CIF14081152704576

H263的编码流程

编码过程其实和264异曲同工,主要分为预测变换和熵编码,预测同样是帧内和帧间预测,变换使用DCT变换,量化后进行熵编码

asdsa

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.

image-20210812145340036

宏块

每个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码之间至少出现一个图像起始码。下线的图像其图像头部不传输。

image-20210812160422880

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比特未被发送,直到编码器恢复编码时为止。

块组层

image-20210812161034995

GSTUF:

填充,由少于8个零比特组成的可变长码字。在GBSC码字之前,编码器可直接插入此码字。若GSTUF存在,GSTUF的最后比特应是字节的最后(最低有效)比特,以致GBSC码字的起始被字节定位。译码器应设计为丢弃GSTUF。

GBSC:

块组起始码,为一个17比特字。它的值是0000 0000 0000 0000 1。GOB起始码可以字节定位。通过起始码前插入GSTUF能够实现字节定位以致起始码的首比特是字节的第一(最高有效)比特。

GN:

块组编号

宏块层

image-20210812161237410

DQUANT:

量化器信息

MVD,MVD2,MVD3,MVD4:

所有inter宏块都有的运动矢量信息,在payload head当中有使用,但不是直接使用数值,有经过一定的转化

H263的PAYLOAD HEAD

当将H263的流打包发送时,需要将比特流打包成RTP协议,此时需要将H263流之前增加一个payload header标识一些数据,再添加RTP header进行rtp封包。

1
2
3
4
5
6
7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: RTP Header :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: H.263+ Payload Header :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: H.263+ Compressed Data Stream :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

h263+

1
2
3
4
5

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RR |P|V| PLEN |PEBIT|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

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
2
3
4
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|P|SBIT |EBIT | SRC |I|U|S|A|R |DBQ| TRB | TR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

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
2
3
4
5
6
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|P|SBIT |EBIT | SRC | QUANT | GOBN | MBA |R |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|I|U|S|A| HMV1 | VMV1 | HMV2 | VMV2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

QUANT: 5bit

这个包起始的宏块句法GQUANT 的量化信息,如果起始位是GOB头的话就设成0

GOBN:5bit

这个包起始位置的GOB序号

MBA: 9bit

第一个MB在当前GOB的地址

HMV1,VMV1,HMV2,VMV2: 每个都是7bit

这个包第一个宏块的对应MVD,MVD1,MVD2,MVD3的信息

Mode C

1
2
3
4
5
6
7
8
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|P|SBIT |EBIT | SRC | QUANT | GOBN | MBA |R |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|I|U|S|A| HMV1 | VMV1 | HMV2 | VMV2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RR |DBQ| TRB | TR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

是Mode A和Mode B的结合,所有的信息在前面的介绍都能找到