本文将对 MPEG4标准中的Advanced Simple Profile(ASP)做一个完整的说明,我并不
打算只是对标准进行翻译,而是根据我当初读标准时遇到的问题,给出一个更容易理解的阅
读标准的途径。需要指出的是,虽然本文给出了标准中的绝大部分,但本文并不是一个标准,
而只是对标准的个人理解,遇到真正有疑问的地方,还是需要参考标准中的相应描述,毕竟
只有正式的标准才是最标准的。
我将按下面的方式组织本文的内容:
第一部分,给出标准定义的内容,即标准究竟规定了什么,没规定什么,它的Profile
和level究竟是怎么一回事,具体到我们目前做的ASP又是怎么一回事。
第二部分,给出阅读标准需要的一些基础知识。
第三部分,给出标准的码流语法和语义,注意我并不会给出所有的语法语义,而只是给
出跟我们需要实现的ASP密切相关的部分,如果需要了解其他部分,可以参考标准。
第四部分,给出解码流程,同样,我也只是给出ASP的解码流程。
第五部分,参考文献。
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 3 页共 99页
第一章 MPEG4标准的内容
1.1 什么是 MPEG4标准?
MPEG4 标准是国际标准化组织下面的一个标准,它包含了系统层,视频层,音频层三
个部分,并且MPEG4是基于对象的。在这里我们不打算对MPEG4作完整的介绍,我们只
介绍其中的视频层。MPEG4视频层实际上也是挺复杂的,由于我们只讨论ASP,所以我们
不必要对整个的视频层作全面的介绍,而只是介绍跟我们相关的部分,这样它同h.263 标准
是很类似的,只是多了一些特殊的技术,这些技术可以大大提高编码效率。
1.2 标准定义了什么?
假如给我一个标准的MPEG4 码流(二进制码流),我如何对它进行解码呢?显然,我
需要知道这个码流中的每一位究竟是什么含义,只有这样,我才能对它进行解码,MPEG4
标准就是定义了一个标准MPEG4 码流中的每一位的具体含义。MPEG4 码流的组织形式如
下(其实对很多标准的码流都是这样的):
图1.1 码流的分层组织
如图1.1 所示,MPEG4 的码流就是按照这种分层的形式组织起来的,码流头首先是一
个在码流中其它地方不会出现的一个比较长的特殊序列,又叫起始码字,然后是具体的头信
息,它定义了整个码流的一些特征,这些特征将会对你如何对这个码流进行解码产生影响。
例如,帧的长度和宽度,该码流用到哪些技术,没用哪些技术等。帧头首先是帧起始码字,
然后是具体的帧头信息,它定义了当前帧的一些特征,例如当前帧使用的量化值等,这些信
息决定了你该如何解码当前帧。从宏块头开始就是具体的数据了,宏块头并没有一个宏块起
始码字,它紧跟在帧头信息后面。
按照上面给出的定义,只要给我一个符合MPEG4 标准的码流,我就能按照标准定义的
码流形式对这个码流解析并进行解码。首先,搜索码流起始码字,由于起始码字唯一,只要
码流正确,肯定能搜索到,找到起始码字后,就可以对码流头信息进行解析,并把对后面的
解码有影响的码字保存下来;接着,寻找帧头起始码字,找到后,对帧头信息进行解析,并
存储对解码过程有影响的码字;最后,从码流中读出宏块数据,并进行解码,恢复为原来的
图像。对这个过程可以暂时不用深究,只要大体知道这么一个概念就好了。
码流头按帧组织的数据流
帧头 按宏块组织的帧数据
宏块头 按块形式组织的帧数据
1.3 标准没定义什么
我当初看标准的时候常常有一个错误的认识,以为标准既然规定了什么,那么编码器就
应该照做。实际上这个理解是错误的,标准规定了符合这个标准的码流应该是按照什么样的
形式组织的,但是这个码流中的好多地方仍然是可选的,譬如,一个码流可以支持1/4 像
素运动补偿,也可以不支持,因此,编码器对原始图像进行编码的时候是有很大的灵活性的,
它可以只是编码当前标准码流的一个子集,当然这个子集,肯定也是符合标准的。
还有其他一些特性,在标准中也只是作为一个建议给出来的,并没有强调一定要这样做,
这里我不再详细一一列出,在你看标准的时候可以注意到,如果文章标题下面有normative
字样,则表示本章内容是标准的,必须遵守,如果标题下面有informative 字样,则表示该
章内容只是用来参考的,并不一定要照做。
1.4 ASP 是什么意思?
不用的应用要求不同的技术,例如对于视频会议,只要用最基础的那些技术就可以了,
而对于高清电视,由于图像质量要求较高,因此需要用到一些复杂的技术,例如1/4 像素
运动补偿,无限制运动补偿等等。MPEG4就定义了Profile&level来适应不同的应用,Profile
定义了一个码流可以使用哪些技术,而level 则规定了复杂度,譬如支持多大的图像格式,
需要多少缓存等等。
Advanced Simple Profile 是为了适应因特网上流媒体应用的需求而新增加的。它可以在
很大码率范围内发布只有一层的基于帧结构的数字视频信号。采用AS Profile,在大约
1~2Mbits/s的码率下,即可达到数字电视的质量。这使得AS Profile在第三代移动可视电话
和Internet上的视频服务等领域有很好的应用前景。为实现高效编码,在AS Profile中引入
了Advanced Coding Efficiency Profile中所定义的工具。具体而言,即先进补偿工具,包括:
1/4 像素运动补偿(QMC),全局运动补偿(GMC)。另一方面,为满足较低码率下应用的
要求,提供了Error Resilience 工具。同时,提供了后处理可选工具:Deblocking Tool 和
Deringing Tool。与Simple Profile相比,AS Profile具有更高的编码效率;另一方面,由于只
支持单层和矩形VO,因而其实现复杂性低于Advanced Coding Efficiency Profile。正因为此,
基于MPEG-4 AS profile的硬件系统,以及ASIC实现,具有很好的应用前景。
一个特定的profile支持一个到几个视频对象类型,例如simple profile支持Simple object,
Main profile 支持simple,core,main 三种类型的对象。每一种对象类型都决定了符合该对
象类型的码流应该使用那些规定的技术,对编码器来说,它不能使用这个对象不支持的技术,
对解码器来说,这个对象规定的技术它都需要支持。
Advanced Simple Profile支持simple object和Advanced simple object两种类型的对象,
这两种对象需要支持的技术见表1-1:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 5 页共 99页
表 1-1 视频对象类型所支持的工具集合
Visual Object Types
Visual Tools Advanced
Simple
simple
I-VOP X X
P-VOP X X
B-VOP X
DC Prediction X X
AC Prediction X X
4-MV, UnrestrictedMV X X
Slice Resynchronization X X
Data Partitioning X X
Reversible VLC X X
Short Header X X
Method 1/Method 2 Quantization X
Interlace X
Global Motion Compensation X
Quarter-pel Motion Compensation X
说明 1 —隔行扫描工具在AS Profiles的L0,L1,L2,L3级别不使用;
每个profile还分不同的级别,表示不同的复杂度,如表1-2 和表1-3 所示:
关于表中每一项的具体含义,以后再补充。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 6 页共 99页
表 1-2 simple profile中定义的级别
Visual Profile
Level
Typical Visual Session
Size
Max ob-jects 1
Maximum number
per type
Max unique Quant Tables
Max. VMV buffer size
(MB units)2
Max VCV buffer size
(MB)8
VCV decoder rate
(MB/s) 4
VCV Bound-ary MB
decoder rate (MB/s)9
Max total VBV buffer size
(units of 16384 bits)5
Max vbv buffer size
(units of 16384 bits)
Max. video packet length
(bits)6
Max sprite size
(MB units)
Wavelet restrictions
Max bitrate
(kbit/s)
Max. enhance-ment
layers
per object
Simple L3 CIF 4 4 x
Simple
1 792 396 11880 N. A. 40 40 8192 N. A. N. A. 384 N. A.
Simple L2 CIF 4 4 x
Simple
1 792 396 5940 N. A. 40 40 4096 N. A. N. A. 128 N. A.
Simple L1 QCIF 4 4 x
Simple
1 198 99 1485 N.A. 10 10 2048 N. A. N. A. 64 N. A.
Simple L0 QCIF 1 1 x
Simple
1 198 99 1485 N.A. 10 10 2048 N. A. N. A. 64 N. A.
对simple profile中的L0 级别,有下列限制:
a) 最大帧率只能为每秒15 帧
b) 最大的f_code值为1
c) intra_dc_vlc_threshold 只能为0
d) 亮度的水平宽度最大为176 像素
e) 亮度的垂直高度最大为144 个像素
f) 如果使用了AC 预测,则有下列限制:QP 值在一个VOP 中不能发生变化 (或者在
一个视频包中不能发生变化,如果视频包使用了的话).如果AC 预测没有使用,对
QP值的变化没有限制。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 7 页共 99页
表 1-2 定义在Advanced Simple Profile中的级别
Visual Profile
Level
Typical Visual Session Size
Max. objects
Maximum number
per type
Max. unique Quant Tables
Max. VMV buffer size (MB
units)
Max VCV buffer size (MB)
VCV decoder rate (MB/s)
Max. Percentage of Intra
MBs with AC prediction in
VCV buffer
Max total VBV buffer size
(units of 16384 bits)
Maximum VBV Buffer Size
(units of 16384 bits)
Max. video packet length
(bits)
Maximum Bitrate (kbits/s)
(Note 2)
Maximum number of coded
vop-bps (Note 3)
AS L
0
176x144 1 1x AS or
Simple
1 297 99 2970 100 10 10 2048 128 N.A.
AS L
1
176x144 4 4x AS or
Simple
1 297 99 2970 100 10 10 2048 128 N.A.
AS L
2
352x288 4 4x AS or
Simple
1 1188 396 5940 100 40 40 4096 384 N.A.
AS L
3
352x288 4 4x AS or
Simple
1 1188 396 11880 100 40 40 4096 768 N.A.
AS L
4
352x576 4 4x AS or
Simple
1 2376 792 23760 50 80 80 8192 3000 N.A.
AS L
5
720x576 4 4x AS or
Simple
1 4860 1620 48600 25 112 112 16384 8000 N.A.
说明 1: 下列限制应用于AS profile的L0 级别:
l 如果使用了AC预测, 量化值在一个VOP中应该保持不变 (或者在一个视频包中保持
不变,如果视频包在一个VOP 中使用的话). 如果AC 预测没有使用,对QP 值的变化
没有限制。
说明 2: The maximum number of coded vop-bps takes into consideration the shifted bits after
applying frequency weighting and/or selective enhancement.
说明3: 隔行扫描工具不用在AS Profile的L0,L1,L2,L3 级别中。
为了进一步理解,我把profile和level已经object type的概念再整理一次:
Mpeg4 的码流语法是很庞大的,通常来说,我们某种应用不需要用到整个语法,语法中
存在很多可选项,不用的应用对这些可选项的选择是不一样的。Mpeg4 中的profile 就是定
义了如何去选择这些可选项,一个特定的Profile 就决定了哪些项是你应该选的,哪些项不
应该选。既然有了profile,为什么还有引入什么对象类型的概念呢?这是因为一个profile
它不仅仅只支持一个对象类型,它可以兼容使用的技术是它的子集的那些对象类型。譬如我
们的advanced simple profile就支持simple object和Advanced simple object两种对象类型,
这两种对象所规定的语法是不一样的,如表1 所示。
在 MPEG4 码流中,Profile&level 信息是在最上层给出的,解码器接收到这个信息后可
以决定要不要继续解码,假设码流中的Profile 是simple profile,而我们的解码器支持
Advanced Simple Profile,我们就知道我们的解码器可以解这个码流,因此继续往下解;然
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 8 页共 99页
而如果码流中的profile是main profile,那我们的解码器就不一定能解了。
对象类型的信息在紧接着的VOL层头信息里面,它的取值必须在前面的profile规定的
范围里面。譬如,对simple profile,只能支持simple object;对于Advanced simple profile,
就可以支持simple object和Advanced simple object两种对象类型。
第二章 基础知识
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 9 页共 99页
为了能够更好的理解标准,在这一章将会给出一些视频的基本概念以及在标准中经常出
现的一些术语和语法的含义。
2.1 视频的基本概念
2.1.1 帧
一帧图像有三个整数矩阵构成:一个亮度矩阵(Y),两个色度矩阵(一个U,一个V)。
亮度矩阵的大小也被称为当前帧的大小,而色度矩阵的大小为亮度矩阵的1/4,即长度和
宽度都为色度的一半。下面我们简单说说Y,U,V的由来:
一个原始的彩色图像可以由R,G,B三个矩阵合成而来,这三个矩阵大小都等于当前
图像的大小。由这三个矩阵经过一个变换可以得到Y’,U’,V’,这三个矩阵的大小也是原
始图像的大小。经过从RGB到Y’U’V’的变换后,图像中比较重要的信息,也就是对人类视
觉影响比较大的信息都集中在Y’矩阵中,而U’V’矩阵中的图像信息比较小,因此,为了节
约比特数,我们可以不用对整个的U’V’矩阵进行编,可以对U’V’矩阵首先进行一个下采样,
使得U’V’图像的长度宽度都为原来的一般,这样就得到我们视频编码时常常看到的4:2:0 的
YUV图像格式。我们对标准的码流进行解码之后得到也是4:2:0的YUV矩阵,当然还需
要对这个矩阵进行上采样,使得YUV 矩阵都为原始图像大小,然后再变换到RGB 就可以
显示了。
2.1.2 逐行扫描图像和隔行扫描图像
通过摄像头进来的图像是模拟的,我们要对它进行采样,并把它转化为数字信号。通常,
采样是按行进行的,有两种方式,一种是从上到下,逐行采样,得到的图像称为逐行扫描图
像;还有一种是隔行进行的,即首先采样奇数行(或者偶数行),接着再采样奇数行,这样
得到的图像成为隔行图像。注意,这两种采样方式得到的图像是不一样的,因为摄像头进来
的图像是动态变化的。对逐行图像,第一行图像和第二行图像之间的采样时间差别很少;而
对隔行图象,第一行采样和第二行采样之间,已经相差了半帧的时间。对隔行图像,如果图
像运动比较厉害的话,图像会走样。
有两点,在这里提一下:
对隔行扫描的图像的任一个宏块,即可以用帧DCT编码,也可以用场DCT编码,相应
的在码流中可以用一个dct_type来表示DCT编码方式;
对隔行扫描的图像的任一个宏块,运动补偿即可以用帧运动补偿也可以用场运动补偿,
这个在码流中也有一个相应的标志field_prediction来表示。
2.1.3 VOP 编码类型
这里的VOP 我们就可以把它等同于上面提到的帧的概念(标准里面实际上不是同一个
概念)。VOP编码类型有四种:
Ø 内部VOP(I-VOP),只用到当前帧的信息编码;
Ø 单向预测VOP(P-VOP),利用它前面的I或者P-VOP利用运动补偿技术来编码;
Ø 双向预测 VOP(B-VOP),利用前面和后面的I或者P-VOP利用运动补偿技术来编
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 10 页共 99页
码。
Ø 全景 VOP(S-VOP)用来编码sprite对象,这个我们不讨论。
2.1.4 宏块
一个宏块包括亮度成分和对应的色度成分。对我们上面说到4:2:0 格式的帧,亮度块
的大小为16*16,色度块的大小为8*8,如下图所示:
1
2
4
3
5
0
Y Cb Cr
图 2.1 4:2:0 宏块结构
为了统一起见,我们把亮度块分成四个块,大小为8*8,这样一个宏块就由六个块组成,
每个块的大小都为8*8,并且在编码时用到的DCT变换,量化等都是基于块来实现的。
对隔行扫描的图像,亮度块有两种组织方式:
Ø 在帧DCT编码情形,每一个亮度块被逐行放在一起,如图2.2 所示;
Ø 在场DCT编码情形,每一个亮度块被隔行放在一起,如图2.3 所示。
图 2.2 帧DCT编码时亮度块组织
图 2.3 场DCT编码是亮度块组织
所以,对场DCT 编码后的图像,对一个亮度块解码之后,要按照隔行的方式去存放,
才能恢复出原始的图像。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 11 页共 99页
2.2 编码流程
我们将在这一节里面对编码过程做一个非常简单的介绍,主要目的是让我们对我们需要
解码的码流究竟是如何形成的有一个概念,对编码的细节,不过多涉入。
输入的文件就是我们上面反复提到的4:2:0 格式的yuv 文件。YUV 文件按照下面的
形式组织的,我们以cif格式(352*288)的文件new_cif.yuv来说明:
文件是按照帧格式组织的,对第一帧,首先是352*288大小的亮度矩阵,注意是按行组
织的,接着是176*144 大小的色度矩阵U,也是按行组织的,最后是176*144大小的色度矩
阵V;第一帧结束后,马上就是第二帧,组织形式仍然同第一帧完全一样,就这样一帧一帧
的存放,直到文件结束。
读取一帧
数据
取一个
宏块DCT 量化AC/DC VLC
反量化
反DCT
VOP
Memory 运动估计
运动补偿
bitstream forming
VLC
图 2.4 MPEG4 编码流程
图 2.4 给出了基本的编码流程,每个模块的功能简要介绍如下。
1. 从 news_cif.yuv中读取一帧图像,大小为352*288*1.5,包含了亮度和色度。
2. 编码是按宏块进行的,对一帧图像中所有宏块编码完成,也就完成了对当前帧的编码。
从当前原始图像中取出一个宏块用于编码,注意原始图像是按行组织的,因此,注意读
指针位置的调整。
3. 对当前宏块进行运动估计,如果是I帧,就不用了。所谓运动估计就是从上一帧图像中
找出一个同当前宏块的数据最接近的宏块,也成为当前宏块的参考宏块。参考宏块同当
前宏块的位置的相对值被称为运动矢量,它也将进行VLC 编码,然后再写到码流中,
解码器根据这个矢量就可以找到当前宏块的参考宏块。
4. 接下来就是按块进行编码了,按照宏块中块排列的顺序进行。首先将当前宏块同参考宏
块作差值,然后再对差分值进行编码。
5. 对当前编码块(或者经过运动补偿的差分值)进行DCT变换。DCT变换的主要目的是
使得能量主要集中在低频部分。对高频部分,可以不编码,或者花较小的代价进行编码。
6. 量化模块就是对DCT 变换后的系数进行量化,也就是给它除以一个固定值,这样使得
高频部分很多很小的系数变成0,也使得其它系数变小,可以用较少的bit 编码。当然
这个量化值也需要在码流中给出,以便解码器可以进行相应的反量化,恢复出原始值。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 12 页共 99页
7. 反量化模块是量化模块的逆过程。
8. 反 DCT模块是DCT模块的你过程。
9. ACDC是对当前宏块的第一行或者第一列系数同它周围的某一块做一个差分值,进一步
减少系数值,同样可以降低比特率。
10. 反 DCT 后的宏块还需要做一个运动补偿得到一个当前宏块的重建值,成为重建宏块。
注意重建宏块的值同原始宏块之间是有一定误差的。运动估计的时候,是为当前宏块在
前一个重建帧中寻找一个最匹配宏块,这样做的目的是为了能跟解码端统一起来。因为
解码端得到的只能是重建帧。
11. Bitstream forming模块。我们来仔细看看这个模块,看看我们需要的码流究竟是如何形
成的。码流是由一个码流头开始的,然后才是具体的帧。因此,在具体编码之前,Bitstream
forming 模块首先向输出流文件中写入码流头信息。然后开始写入第一帧的内容,每一
帧开始也有一个帧头信息,帧头信息同当前的编码内容是紧密相关的,后面的帧数据必
须完全符合帧头信息中规定的一些特性。譬如当前帧的量化值,运动补偿的搜索范围等。
接下来就是具体的帧数据了,帧数据是按照宏块组织的。宏块内容包含当前宏块的编码
信息,例如当前宏块是否编码,宏块编码类型等,接着是运动矢量的数据,最后是具体
的6 个块的数据。当前帧所有宏块的信息都写入到输出流文件后,紧接着是下一个帧的
数据,如是循环,直到所有帧编码完成。
以上是编码的大致过程,看了之后我们对MPEG4的标准码流有一个比较基本的认识,
对我们理解后面的码流的语法语义可能会有比较大的帮助。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 13 页共 99页
第三章 ASP码流语法和语义
3.1. 准备知识
3.1.1 MPEG4码流中的术语和函数
bslbf:Bit string, left bit first。比特串,左边的bit 在前。
Uimsbf:Unsigned integer, most significant bit first.无符号整数,最有意义的bit在前。
Simsbf:Signed integer, in twos complement format, most significant (sign) bit first.有符号整数,
以二进制补码形式表示,最后意义的bit 在前。
Vlclbf:Variable length code, left bit first。变长码字,左边的bit在前。
next_bits():返回码流中下面的一定数量的bit,一般用于寻找起始码字。
例如,while(next_bits() == user_data_start_code) { user_data() }
bytealigned():判断当前位置是否字节对齐的函数。如果当前位置在字节的结尾,即下一个
bit属于下一个新的字节,返回1;否则,返回0。
nextbits_bytealigned():返回码流中从下一个字节对齐的位置开始的一定数量的bit,一般用
于搜索起始码字。注意如果下一个字节对齐的位置开始第一个字节为
0111111,则表示该字节为填充码字,应该直接扔掉该码字,继续从下一个
字节开始取一定数量的bit。例如,
while(nextbits_bytealigned() == resync_marker) { video_packet_header() }
next_start_code():
next_start_code() { Bit 数存储方法
zero_bit 1 ‘0’
while (!bytealigned())
one_bit 1 ‘1’
}
如果编码时,往输出流文件中写如码流信息时,当下一个需要写入的码字是一个起始码,
而当前位置不是字节对齐时,需要写入填充bit,直到下一个字节对齐的位置,具体在后面
进一步说明。next_start_code()函数就是从码流中读出这些填充bit,并舍弃。
next_resync_marker():
next_resync_marker() { No. of bits Mnemonic
zero_bit 1 ‘0’
while (!bytealigned())
one_bit 1 ‘1’
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 14 页共 99页
}
这个函数同next_start_code()类似,只不过是为resync_marker 服务的。
Reserved, forbidden and marker_bit:
Reserved表示这个码字可能用来作为标准将来的扩展。
Forbidden 表示表示这个码字是被标准禁止的,为了防止起始码字的竞争,也就是防止码流中可
能出现的起始码字。
Marker_bit表示这个bit为1,为了防止出现起始码竞争而定义的。
Zero_bit表示这个bit为0。
整数的除法的定义比较多,也比较烦,下面归纳一下:
/ 整数除法,结果往绝对值等于0 的方向截取。例如, 7/4 和-7/-4 等于1 , -7/4
和7/-4 等于-1.
// 整数除法,取最接近的整数。如果小数部分为0.5,则往绝对值大的方向取。例
如3//2 等于2,-3//2 等于-2。
/// 整数除法,取最接近的整数。如果小数部分为0.5,往实际值大的方向取,即如
果结果大于0,往背离0的方向取;而如果结果小于0,往靠近0 的方向取。例
如3///2 等于2,而-3///2 等于-1。
整数除法,往负无穷大的方向截取。例如7/4 等于1,-7/4 等于-2。
÷ 没有截取和舍入的精确除法运算。
3.1.2 起始码:
起始码是一些在视频流的其它部分不会出现的特殊的比特组合。
每一个起始码由起始码前缀和跟在它后面的起始码值组成。起始码前缀是一个由23 个
0 和1 个1 组成的比特序列,也就是“0000 0000 0000 0000 0000 0001”。
起始码值是一个8bit 整数,它来指示起始码类型大多数类型起始码使用唯一的起始码
值。但是,video_object_start_code和video_object_layer_start_code可以有多个起始码字。
所有起始码字都是字节对齐的。这可以通过在起始码前缀前先插入一个0再插入若干个
1 来实现。表2-1 给出了填充1~8 比特时的填充码字。
表 3-1 填码充字
填充的比特数 填充码字
1 0
2 01
3 011
4 0111
5 01111
6 011111
7 0111111
8 01111111
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 15 页共 99页
表 3-2 给出了起始码的值。仅仅只给出我们用到的部分。
表 3-2 起始码值
名称 起始码值
(16 进制)
video_object_start_code 00 through 1F
video_object_layer_start_code 20 through 2F
reserved 30 through 3F
reserved 60 through AF
visual_object_sequence_start_code B0
visual_object_sequence_end_code B1
user_data_start_code B2
group_of_vop_start_code B3
video_session_error_code B4
visual_object_start_code B5
vop_start_code B6
slice_start_code B7
extension_start_code B8
Stuffing_start_code C3
reserved C4-C5
System start codes (see note) C6 through FF
NOTE System start codes are defined in ISO/IEC 14496-1
3.1.3 码流的分层结构
/* 这一层给出profile&level信息*/
VisualObjectSequence() {
………..
VisualObject()
………..
}
/* 给出视频对象的版本和优先级*/
VisualObject() {
………….
VideoObjectLayer()
………….
}
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 16 页共 99页
/* 当前视频流的一些特性*/
VideoObjectLayer() {
………..
do{
if (next_bits() == group_of_vop_start_code)
Group_of_VideoObjectPlane()
VideoObjectPlane()
}while ((next_bits() == group_of_vop_start_code) || (next_bits() == vop_start_code))
………..
/* 如果使用短头格式(可以通过起始码字来判断) */
{
short_video_header = 1
do{
video_plane_with_short_header()
}while(next_bits() == short_video_start_marker)
}
}
/* 视频图像组头信息,包含时间基准信息,第一个B帧能不能正确显示等*/
Group_of_VideoObjectPlane() {
………….
}
/* 当前帧的头信息*/
VideoObjectPlane()
{
…………
Motion_shape_texture()
While (nextbits_bytealighed() == resync_marker) {
Video_packet_header()
Motion_shape_texture()
}
…………
}
/* 视频包头信息*/
Video_packet_header()
{
……….
}
Motion_shape_texture()
{
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 17 页共 99页
if (data_partitioned) //如果使用数据分割的话,即很多宏块运动信息和纹理数据分开
data_partitioned_motion_shape_texture()
else
combined_motion_shape_texture()
}
/* 运动信息和纹理数据联合编码,放在一个宏块层中*/
combined_motion_shape_texture()
{
do{
Macroblock()
} while (nextbits_bytealigned() != resync_marker
&& nextbits_bytealigned() != ‘000 0000 0000 0000 0000 0000’)
}
/* 宏块数据,包括运动矢量和纹理数据*/
Macroblock()
{
……..
motion_vector()
for (I=0; I<6; I++)
if (!transparent_block(I))
block()
}
3.2 语法
这里给出的语法并不是标准的语法,而是ASP 中需要用到的,对我们不需要用到的,
尽量不给出来,使得问题简单化。
3.2.1 Visual Object Sequence and Visual Object
VisualObjectSequence() { No. of bits Mnemonic
visual_object_sequence_start_code 32 bslbf
profile_and_level_indication 8 uimsbf
while ( next_bits()== user_data_start_code){
user_data()
}
VisualObject()
visual_object_sequence_end_code 32 bslbf
}
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 18 页共 99页
VisualObject() { No. of bits Mnemonic
visual_object_start_code 32 bslbf
is_visual_object_identifier 1 uimsbf
if (is_visual_object_identifier) {
visual_object_verid 4 uimsbf
If (visual_object_verid != ‘0001’ || visual_object_verid != ‘0101’) {
Error()
}
visual_object_priority 3 uimsbf
}
visual_object_type 4 uimsbf
if (visual_object_type == “video ID”)
{
video_signal_type()
}
else {
Error()
}
next_start_code()
while ( next_bits()== user_data_start_code){
user_data()
}
if (visual_object_type == “video ID”) {
video_object_start_code 32 bslbf
VideoObjectLayer()
}
if (next_bits() != “0000 0000 0000 0000 0000 0001”)
next_start_code()
}
video_signal_type() { No. of bits Mnemonic
video_signal_type 1 bslbf
if (video_signal_type) {
video_format 3 uimsbf
video_range 1 bslbf
colour_description 1 bslbf
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 19 页共 99页
if (colour_description) {
colour_primaries 8 uimsbf
transfer_characteristics 8 uimsbf
matrix_coefficients 8 uimsbf
}
}
}
User data
user_data() { No. of bits Mnemonic
user_data_start_code 32 bslbf
while( next_bits() != ‘0000 0000 0000 0000 0000 0001’ ) {
user_data 8 uimsbf
}
}
3.2.2 Video Object Layer
VideoObjectLayer() { No. of bits Mnemonic
if(next_bits() == video_object_layer_start_code) {
short_video_header = 0
video_object_layer_start_code 32 bslbf
random_accessible_vol 1 bslbf
video_object_type_indication 8 uimsbf
If (video_object_type_indication != (“simple ”|| “Advanced simple”)) {
Error()
}
is_object_layer_identifier 1 uimsbf
if (is_object_layer_identifier) {
video_object_layer_verid 4 uimsbf
If (visual_object_verid != ‘0001’ || visual_object_verid != ‘0101’) {
Error()
}
video_object_layer_priority 3 uimsbf
}
aspect_ratio_info 4 uimsbf
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 20 页共 99页
if (aspect_ratio_info == “extended_PAR”) {
par_width 8 uimsbf
par_height 8 uimsbf
}
vol_control_parameters 1 bslbf
if (vol_control_parameters) {
chroma_format 2 uimsbf
low_delay 1 uimsbf
vbv_parameters 1 blsbf
if (vbv_parameters) {
first_half_bit_rate 15 uimsbf
marker_bit 1 bslbf
latter_half_bit_rate 15 uimsbf
marker_bit 1 bslbf
first_half_vbv_buffer_size 15 uimsbf
marker_bit 1 bslbf
latter_half_vbv_buffer_size 3 uimsbf
first_half_vbv_occupancy 11 uimsbf
marker_bit 1 blsbf
latter_half_vbv_occupancy 15 uimsbf
marker_bit 1 blsbf
}
}
video_object_layer_shape 2 uimsbf
If (video_object_layer_shape != “rectangular”) {
Error()
}
marker_bit 1 bslbf
vop_time_increment_resolution 16 uimsbf
marker_bit 1 bslbf
fixed_vop_rate 1 bslbf
if (fixed_vop_rate)
fixed_vop_time_increment 1-16 uimsbf
marker_bit 1 bslbf
video_object_layer_width 13 uimsbf
marker_bit 1 bslbf
video_object_layer_height 13 uimsbf
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 21 页共 99页
marker_bit 1 bslbf
interlaced 1 bslbf
obmc_disable 1 bslbf
If( !obmc_disable) {
Error()
}
if (video_object_layer_verid == ‘0001’)
sprite_enable 1 bslbf
else
sprite_enable 2 uimsbf
If (sprite_enable != 0 || sprite_enable != 00) {
Error()
}
not_8_bit 1 bslbf
if (not_8_ bit) {
Error()
}
quant_type 1 bslbf
if (quant_type) {
load_intra_quant_mat 1 bslbf
if (load_intra_quant_mat)
intra_quant_mat 8*[2-64] uimsbf
load_nonintra_quant_mat 1 bslbf
if (load_nonintra_quant_mat)
nonintra_quant_mat 8*[2-64] uimsbf
}
if (video_object_layer_verid != ‘0001’)
quarter_sample 1 bslbf
complexity_estimation_disable 1 bslbf
If (complexity_estimation_disable != 1) {
Error()
}
resync_marker_disable 1 bslbf
data_partitioned 1 bslbf
if(data_partitioned)
Error() 1 bslbf
if(video_object_layer_verid != ’0001’) {
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 22 页共 99页
newpred_enable 1 bslbf
if (newpred_enable)
Error()
reduced_resolution_vop_enable 1 bslbf
If (reduced_relution_vop_enable)
Error()
}
scalability 1 bslbf
If (scalablity)
Error()
}
next_start_code()
while ( next_bits()== user_data_start_code){
user_data()
}
do {
if (next_bits() == group_of_vop_start_code)
Group_of_VideoObjectPlane()
VideoObjectPlane()
if ((preceding_vop_coding_type == "B") &&
next_bits() == stuffing_start_code) {
stuffing_start_code 32 bslbf
while (next_bits() != ‘0000 0000 0000 0000 0000 0001’)
stuffing_byte 8 bslbf
}
} while ((next_bits() == group_of_vop_start_code) ||
(next_bits() == vop_start_code))
} else {
short_video_header = 1
do {
video_plane_with_short_header()
} while(next_bits() == short_video_start_marker)
}
}
NOTE — preceding_vop_coding_type has the same value as vop_coding_type in the immediately preceding
VideoObjectPlane() in the decoding order.
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 23 页共 99页
3.2.3 Group of Video Object Plane
Group_of_VideoObjectPlane() { No. of bits Mnemonic
group_of_vop_start_code 32 bslbf
time_code 18
closed_gov 1 bslbf
broken_link 1 bslbf
next_start_code()
while ( next_bits()== user_data_start_code){
user_data()
}
}
3.2.4 Video Object Plane and Video Plane with Short Header
VideoObjectPlane() { No. of bits Mnemonic
vop_start_code 32 bslbf
vop_coding_type 2 uimsbf
If (vop_coding_type == ‘s-vop’)
Error()
}
do {
modulo_time_base 1 bslbf
} while (modulo_time_base != ‘0’)
marker_bit 1 bslbf
vop_time_increment 1-16 uimsbf
marker_bit 1 bslbf
vop_coded 1 bslbf
if (vop_coded == ’0’) {
next_start_code()
return()
}
if (vop_coding_type == “P” )
vop_rounding_type 1 bslbf
intra_dc_vlc_thr 3 uimsbf
if (interlaced) {
top_field_first 1 bslbf
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 24 页共 99页
alternate_vertical_scan_flag 1 bslbf
}
vop_quant 3-9 uimsbf
if (vop_coding_type != “I”)
vop_fcode_forward 3 uimsbf
if (vop_coding_type == “B”)
vop_fcode_backward 3 uimsbf
motion_shape_texture()
while (nextbits_bytealigned() == resync_marker) {
video_packet_header()
motion_shape_texture()
}
next_start_code()
}
Video Plane with Short Header
video_plane_with_short_header() { No. of bits Mnemonic
short_video_start_marker 22 bslbf
temporal_reference 8 uimsbf
marker_bit 1 bslbf
zero_bit 1 bslbf
split_screen_indicator 1 bslbf
document_camera_indicator 1 bslbf
full_picture_freeze_release 1 bslbf
source_format 3 bslbf
picture_coding_type 1 bslbf
four_reserved_zero_bits 4 bslbf
vop_quant 5 uimsbf
zero_bit 1 bslbf
do{
pei 1 bslbf
if (pei == “1”)
psupp 8 bslbf
} while (pei == “1”)
gob_number = 0
for(i=0; i<num_gobs_in_vop; i++)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 25 页共 99页
gob_layer()
if(next_bits() == short_video_end_marker)
short_video _end_marker 22 uimsbf
while(!bytealigned())
zero_bit 1 bslbf
}
gob_layer() { No. of bits Mnemonic
gob_header_empty = 1
if(gob_number != 0) {
if (next_bits() == gob_resync_marker) {
gob_header_empty = 0
gob_resync_marker 17 bslbf
gob_number 5 uimsbf
gob_frame_id 2 bslbf
quant_scale 5 uimsbf
}
}
for(i=0; i<num_macroblocks_in_gob; i++)
macroblock()
if(next_bits() != gob_resync_marker &&
nextbits_bytealigned() == gob_resync_marker)
while(!bytealigned())
zero_bit 1 bslbf
gob_number++
}
video_packet_header() { No. of bits Mnemonic
next_resync_marker()
resync_marker 17-23 uimsbf
macroblock_number 1-14 vlclbf
quant_scale 5 uimsbf
header_extension_code 1 bslbf
if (header_extension_code) {
do {
modulo_time_base 1 bslbf
} while (modulo_time_base != ‘0’)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 26 页共 99页
marker_bit 1 bslbf
vop_time_increment 1-16 bslbf
marker_bit 1 bslbf
vop_coding_type 2 uimsbf
intra_dc_vlc_thr 3 uimsbf
if (vop_coding_type != “I”)
vop_fcode_forward 3 uimsbf
if (vop_coding_type == “B”)
vop_fcode_backward 3 uimsbf
}
}
Motion Shape Texture
motion_shape_texture() { No. of bits Mnemonic
combined_motion_shape_texture()
}
combined_motion_shape_texture() { No. of bits Mnemonic
do{
macroblock()
} while (nextbits_bytealigned() != resync_marker &&
nextbits_bytealigned()
!= ‘000 0000 0000 0000 0000 0000’)
}
3.2.5 Macroblock
macroblock() { No. of bits Mnemonic
if (vop_coding_type != “B”) {
if (vop_coding_type == “P”)
not_coded 1 bslbf
if (!not_coded || vop_coding_type == “I)
mcbpc 1-9 vlclbf
if (!not_coded || vop_coding_type == “I”) {
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 27 页共 99页
if (!short_video_header &&
(derived_mb_type == 3 ||
derived_mb_type == 4))
ac_pred_flag 1 bslbf
if (derived_mb_type != “stuffing”)
cbpy 1-6 vlclbf
else
return()
if (derived_mb_type == 1 ||
derived_mb_type == 4)
dquant 2 bslbf
if (interlaced)
interlaced_information()
if ((derived_mb_type == 0 || derived_mb_type == 1)
&& (vop_coding_type == “P”)) {
motion_vector(“forward”)
if (interlaced && field_prediction)
motion_vector(“forward”)
}
if (derived_mb_type == 2) {
for (j=0; j < 4; j++)
motion_vector(“forward”)
}
for (i = 0; i < block_count; i++)
block(i)
}
}
else {
if (co_located_not_coded != 1) {
modb 1-2 vlclbf
if (modb != ‘1’) {
mb_type 1-4 vlclbf
if (modb == ‘00’)
cbpb 6 vlclbf
if (mb_type != “1” && cbpb!=0)
dbquant 1-2 vlclbf
if (interlaced)
interlaced_information()
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 28 页共 99页
if (mb_type == ‘01’ ||
mb_type == ‘0001’) {
motion_vector(“forward”)
if (interlaced && field_prediction)
motion_vector(“forward”)
}
if (mb_type == ‘01’ || mb_type == ‘001’) {
motion_vector(“backward”)
if (interlaced && field_prediction)
motion_vector(“backward”)
if (mb_type == “1”)
motion_vector(“direct”)
for (i = 0; i < block_count; i++)
block(i)
}
}
}
NOTE: The value of block_count is 6 in the 4:2:0 format.
Motion vector
motion_vector ( mode ) { No. of bits Mnemonic
if ( mode == „direct“ ) {
horizontal_mv_data 1-13 vlclbf
vertical_mv_data 1-13 vlclbf
}
else if ( mode == „forward“ ) {
horizontal_mv_data 1-13 vlclbf
if ((vop_fcode_forward != 1) && (horizontal_mv_data != 0))
horizontal_mv_residual 1-6 uimsbf
vertical_mv_data 1-13 vlclbf
if ((vop_fcode_forward != 1) && (vertical_mv_data != 0))
vertical_mv_residual 1-6 uimsbf
}
else if ( mode == „backward“ ) {
horizontal_mv_data 1-13 vlclbf
if ((vop_fcode_backward != 1) && (horizontal_mv_data != 0))
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 29 页共 99页
horizontal_mv_residual 1-6 uimsbf
vertical_mv_data 1-13 vlclbf
if ((vop_fcode_backward != 1) && (vertical_mv_data != 0))
vertical_mv_residual 1-6 uimsbf
}
}
Interlaced Information
interlaced_information( ) { No. of bits Mnemonic
if ((derived_mb_type == 3) || (derived_mb_type == 4) ||
(cbp != 0) )
dct_type 1 bslbf
if ( ((vop_coding_type == “P”) &&
((derived_mb_type == 0) || (derived_mb_type == 1)) ) ||
((vop_coding_type == “B”) && (mb_type != “1”)) ) {
field_prediction 1 bslbf
if (field_prediction) {
if (vop_coding_type == “P” ||
(vop_coding_type == “B” &&
mb_type != “001”) ) {
forward_top_field_reference 1 bslbf
forward_bottom_field_reference 1 bslbf
}
if ((vop_coding_type == “B”) &&
(mb_type != “0001”) ) {
backward_top_field_reference 1 bslbf
backward_bottom_field_reference 1 bslbf
}
}
}
}
3.2.6 Block
The detailed syntax for the term “DCT coefficient” is fully described in clause 7.
block( i ) { No. of bits Mnemonic
last = 0
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 30 页共 99页
if(derived_mb_type == 3 || derived_mb_type == 4) {
if(short_video_header == 1)
intra_dc_coefficient 8 uimsbf
else if (use_intra_dc_vlc == 1) {
if ( i<4 ) {
dct_dc_size_luminance 2-11 vlclbf
if(dct_dc_size_luminance != 0)
dct_dc_differential 1-12 vlclbf
if (dct_dc_size_luminance > 8)
marker_bit 1 bslbf
} else {
dct_dc_size_chrominance 2-12 vlclbf
if(dct_dc_size_chrominance !=0)
dct_dc_differential 1-12 vlclbf
if (dct_dc_size_chrominance > 8)
marker_bit 1 bslbf
}
}
}
if ( pattern_code[i] )
while ( ! last )
DCT coefficient 3-24 vlclbf
}
NOTE : “last” is defined to be the LAST flag resulting from reading the most recent DCT coefficient.
3.3. 语义
3.3.1 Visual Object Sequence 和Visual Object
Visual_object_sequence_start_code:00 00 01 B0。
Profile_and_level_indication:8 比特整数,用来指示profile和level信息。如表3-2 所示:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 31 页共 99页
我们只给出我们需要的部分,如果码流中解出的profile和level信息不符合我们解码器的要
求,将会停止解码。
表 3-2 profile和level信息的码表
Profile/Level Code
Simple Profile/Level 1 00000001
Simple Profile/Level 2 00000010
Simple Profile/Level 3 00000011
Simple Profile/Level 0 00001000
Advanced Simple Profile/Level 0 11110000
Advanced Simple Profile/Level 1 11110001
Advanced Simple Profile/Level 2 11110010
Advanced Simple Profile/Level 3 11110011
Advanced Simple Profile/Level 4 11110100
Advanced Simple Profile/Level 5 11110101
Reserved for Escape 11111111
Visual_object_sequence_end_code:00 00 01 B1
is_visual_object_identifier:这是一个1 比特码,当它被置为1 时,表明码流后面有版本和优
先级信息;当它被置为0 时,没有版本和优先级信息。
Visual_object_verid:这是一个4 比特码,用来指示视觉对象(visual object)的版本号,它的含
义见表3-3,如果这个码字不存在,visual_object_verid的值为‘0001’。
一个版本号对应了在某个表格中所定义的对象类型。例如版本号为’0001’就对应表9-1 中
所定义的对象类型,包括simple,core,main等;我们的Advanced Simple Profile支持simple
object和Advanced Simple Object两种类型,对应的版本号分别为‘0001’和‘0101’,即在
表9-1 中定义了simple object,在表AMD4-13 中定义了Advanced Simple Object。所以我们
遇到的版本号只可能是这两种,如果不是,则要么该码流我们不可解,要么码流发生错误,
我们只能停止解码。
对其他几个版本号对应的表格定义了哪些对象类型这里就不再给出了。
表 3-3 视觉对象版本的含义
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 32 页共 99页
Visual_object_verid Meaning
0000 reserved
0001 object type listed in Table 9-1
0010 object type listed in Table V2-39
0011 reserved
0100 object type listed in Table AMD3-40
0101 object type listed in Table AMD4-13
0110 - 1111 reserved
Visual_object_priority:这是一个3 比特码,用来指示视觉对象的优先级。我们可以忽略这个
码字。
Visual_object_type:这是一个4 比特码,用来指示视觉对象的类型,如表3-4 所示:我们
只用到video ID,遇到视频类型,我们就不继续解码。
表 3-4 视觉对象类型的含义
code visual object type
0000 reserved
0001 video ID
0010 still texture ID
0011 mesh ID
0100 FBA ID
0101 3D mesh ID
01101 reserved
: :
: :
1111 reserved
Video_object_start_code:这是一个32 比特的起始码字,前27 位是‘0000 0000 0000 0000 0000
0001 000’,剩下的5 个比特从‘00000’到‘11111’。本来剩下的5 个比特用来给视频对象
做标记用的,这里我们用不上。因此我们寻找video_object_start_code 时,可以把最后5 个
比特首先置为0,再去判断,这样这个起始码字就唯一了,我们就可以把它看成一个取值唯
一的起始码字。
Video_signal_type:当此标志设为1,指示了视频信号类型的存在。这些信息是在做格式转
换的时候用的。
Video_format:这是一个3 比特整数,它指示了图像在被编码前的格式。它的含义见下表。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 33 页共 99页
如果 video_signal_type()不存在,则视频格式被假定为“unspecified video format”。
Video_format的含义
video_format Meaning
000 Component
001 PAL
010 NTSC
011 SECAM
100 MAC
101 Unspecified video format
110 Reserved
111 Reserved
Video_range:这是一个1 比特标志,用来指示黑色的值和亮度以及色差信号的范围。
Colour_description:这是一个1 比特标志,置为1 时指示了colour_primaries,
transfer_charateristics 和matrix_coefficients在码流中存在。
Colour_primaries:这是一个8 比特整数,定义了源图像基色(source primaries)的色度坐标
(chromaticity coordinates)。如下表所示:
Colour Primaries
Value Primaries
0 (forbidden)
1 ITU-R Recommendation BT.709
primary x y
green 0,300 0,600
blue 0,150 0,060
red 0,640 0,330
white D65 0,3127 0,3290
2 Unspecified Video
Image characteristics are unknown.
3 Reserved
4 ITU-R Recommendation BT.470-2 System M
primary x y
green 0,21 0,71
blue 0,14 0,08
red 0,67 0,33
white C 0,310 0,316
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 34 页共 99页
5 ITU-R Recommendation BT.470-2 System B, G
primary x y
green 0,29 0,60
blue 0,15 0,06
red 0,64 0,33
white D65 0,3127 0,3290
6 SMPTE 170M
primary x y
green 0,310 0,595
blue 0,155 0,070
red 0,630 0,340
white D65 0,3127 0,3290
7 SMPTE 240M (1987)
primary x y
green 0,310 0,595
blue 0,155 0,070
red 0,630 0,340
white D65 0,3127 0,3290
8 Generic film (colour filters using Illuminant C)
primary x y
green 0,243 0,692 (Wratten 58)
blue 0,145 0,049 (Wratten 47)
red 0,681 0,319 (Wratten 25)
9-255 Reserved
如果码流中不存在video_signal_type()或者color_description 是0,那么色度坐标被假设为与
colour_primaries 等于1 时一致。
Transfer_characteristics:这个8 比特整数描述了源图象的变换特征,见下表。
变换特征
Value Transfer Characteristic
0 (forbidden)
1 ITU-R Recommendation BT.709
V = 1,099 Lc0,45 - 0,099
for 1³ Lc ³ 0,018
V = 4,500 Lc
for 0,018> Lc ³ 0
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 35 页共 99页
2 Unspecified Video
Image characteristics are unknown.
3 reserved
4 ITU-R Recommendation BT.470-2 System M
Assumed display gamma 2,2
5 ITU-R Recommendation BT.470-2 System B, G
Assumed display gamma 2,8
6 SMPTE 170M
V = 1,099 Lc0,45 - 0,099
for 1³ Lc ³ 0,018
V = 4,500 Lc
for 0,018> Lc ³ 0
7 SMPTE 240M (1987)
V = 1,1115 Lc0,45 - 0,1115
for Lc³ 0,0228
V = 4,0 Lc
for 0,0228> Lc
8 Linear transfer characteristics
i.e. V = Lc
9 Logarithmic transfer characteristic (100:1 range)
V = 1.0-Log10(Lc)/2
for 1= Lc = 0.01
V= 0.0
for 0.01> Lc
10 Logarithmic transfer characteristic (316.22777:1 range)
V = 1.0-Log10(Lc)/2.5
for 1= Lc = 0.0031622777
V= 0.0
for 0.0031622777> Lc
11-255 reserved
当码流中不存在video_signal_type()或者colour_description 为0 时,变换特征假定为同
transfer_charateristics 等于1 时一致。
Matrix_coefficients:这个8 比特整数描述了从红、绿、蓝三原色产生亮度和色度信号时使用
的矩阵系数,它的定义见下表:
在这个表中:
E’Y 是一个 0~1之间的模拟量;
E’PB 和 E’PR 是-0.5~0.5之间的模拟量;
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 36 页共 99页
E’R, E’G和 E’B 是0~1之间的模拟量;
白色定义为 E’y=1, E’PB=0, E’PR=0; E’R =E’G =E’B=1.
Y, Cb 和Cr 同 E’Y, E’PB和E’PR 的相关性用下面的式子计算:
对 n比特视频:
如果video_range=0:
Y = ( 219 * 2n-8 * E’Y ) + 2n-4.
Cb = ( 224 * 2n-8 * E’PB ) + 2n-1
Cr = ( 224 * 2n-8 * E’PR ) + 2n-1
如果 video_range=1:
Y = ((2n -1) * E’Y )
Cb = ((2n -1) * E’PB ) + 2n-1
Cr = ((2n -1) * E’PR ) + 2n-1
以8比特视频为例:
video_range=0 给出Y的范围为16到235,Cb和Cr 的范围从16到240;
video_range=1 给出Y的范围为0到255,Cb和Cr 的范围从06到255。
矩阵系数
Value Matrix
0 (forbidden)
1 ITU-R Recommendation BT.709
E’Y = 0,7152 E’G + 0,0722 E’B + 0,2126 E’R
E’PB = -0,386 E’G + 0,500 E’B -0,115 E’R
E’PR = -0,454 E’G - 0,046 E’B + 0,500 E’R
2 Unspecified Video
Image characteristics are unknown.
3 reserved
4 FCC
E’Y = 0,59 E’G + 0,11 E’B + 0,30 E’R
E’PB = -0,331 E’G + 0,500 E’B -0,169 E’R
E’PR = -0,421 E’G - 0,079 E’B + 0,500 E’R
5 ITU-R Recommendation BT.470-2 System B, G
E’Y = 0,587 E’G + 0,114 E’B + 0,299 E’R
E’PB = -0,331 E’G + 0,500 E’B -0,169 E’R
E’PR = -0,419 E’G - 0,081 E’B + 0,500 E’R
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 37 页共 99页
6 SMPTE 170M
E’Y = 0,587 E’G + 0,114 E’B + 0,299 E’R
E’PB = -0,331 E’G + 0,500 E’B -0,169 E’R
E’PR = -0,419 E’G - 0,081 E’B + 0,500 E’R
7 SMPTE 240M (1987)
E’Y = 0,701 E’G + 0,087 E’B + 0,212 E’R
E’PB = -0,384 E’G + 0,500 E’B -0,116 E’R
E’PR = -0,445 E’G - 0,055 E’B + 0,500 E’R
8-255 reserved
当码流中不存在video_signal_type()或者colour_description 为0,矩阵系数被假设为与
matrix_coefficient 等于1 时一样;
当 video_signal_type()在码流中不存在时,video_range 被假设为0(对8 比特视频,Y 从16
到235)。
对于上面的和video_signal_type相关的信号,我只是按照标准翻译,它的具体含义我现在也
不明白,大概与显示有关系,当以后需要涉及到显示的时候,可以进一步加深理解。
User_data_start_code:32 比特的起始码字‘00 00 01 B2’。它指示了用户数据的开始,用户
数据持续到出现下一个起始码字为止。
User_data:这个8 比特整数可以为任意值。用户数据由用户定义,用来指明某种特殊应用,
对我们来说,除非是我们自己定义的信息,否则直接扔掉,对解码不会有影响。
3.3.2 Video Object Layer
video_object_layer_start_code:这是一个32 比特的码字,前28 个比特为‘0000 0000 0000 0000
0000 0001 0010’,后4 个比特从‘0000’到‘1111’,后面4 个比特用来标识一个视频层。
我们不管那么多,我们把后面四位全部认为是0 好了,在码流解析的时候,从码流中读取
32 比特码字,在判断它是不是video_object_layer_start_code之前,首先把它的最后四位全部
置为0,再去同我们定义的起始码字进行比较。
Short_video_header:这个码字在码流中是不存在的,我们只能通过起始码字来判断,如果我
们搜索到起始码字为video_object_layer_start_code,那就表明当前码流不是短头格式的码流,
short_video_header 码字为1。短头格式是为了兼容263 编码的,它的详细内容在后面再给出。
Video_plane_with_short_header():这是一个压缩视频平面的语法层,它只包含使用短头格式
时所能使用的有限的语法子集,这个在后面再详细给出。
Random_accessible_vol:这个标志为1 用来指示vol 中每一个vop 都是可以单独解码的。如
果vol中所有的vop都是内部编码的vop,那么上述条件可以满足,于是random_accessible_vol
就可以被设置为1。Random_accessible_vol对解码过程没有帮助,我们把它直接扔掉即可。
这个码字为了协助随机访问和编辑而特意设计的。如果vol中任何一个vop不是内部编码的,
或者其他一些条件不能满足,那么此标志必须设置为0。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 38 页共 99页
Video_object_type_indication:指示当前码流所使用的对象类型,它决定了后面的码流所能使
用的工具,见表3-5:
表 3-5 视频对类象型指示
Video Object Type Code
Reserved 00000000
Simple Object Type 00000001
Simple Scalable Object Type 00000010
Core Object Type 00000011
Main Object Type 00000100
N-bit Object Type 00000101
Basic Anim. 2D Texture 00000110
Anim. 2D Mesh 00000111
Simple Face 00001000
Still Scalable Texture 00001001
Advanced Real Time Simple 00001010
Core Scalable 00001011
Advanced Coding Efficiency 00001100
Advanced Scalable Texture 00001101
Simple FBA 00001110
Simple Studio 00001111
Core Studio 00010000
Advanced Simple 00010001
Fine Granularity Scalable 00010010
Reserved 00010011 - 11111111
我们只可能支持simple 和advanced simple,遇到其它类型的视频对象类型,我们就停
止解码。
Is_video_object_identifyier:这是一个1比特标志,当它设置为1指示版本和优先权将在后面
被给出;当它为0 是,不给出版本信息和优先权。
Video_object_layer_verid:这4 比特码字指示了视频对象层的版本号。它的含义在表3-6中
给出。如果visual_object_verid和video_object_layer_verid都存在,后者将取代前者。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 39 页共 99页
表 3-6 video_object_layer_verid的含义
video_object_layer_verid Meaning
0000 reserved
0001 object type listed in Table 9-1
0010 object type listed in Table V2-39
0011 reserved
0100 object type listed in Table AMD3-40
0101 object type listed in Table AMD4-13
0011 - 1111 reserved
这个表格的含义同前面visual_object_verid的含义一样,不再赘述。
Video_object_layer_priority:这3 比特码指示了视频对象层的优先级。它的值从1 到7,1 表
示优先级最高,7 表示优先级最低,0 值保留。这个信息对我们的解码过程没用,如果存在
的话,直接扔掉。
Aspect_ratio_info:这4 比特码指示了像素外形的长宽比,其含义见表3-7。如果
aspect_ratio_info指示为extended PAR,则pixel_aspect_ratio参见par_width和par_heitht,这
两个数之间是互质的。我们通常用1:1 的。这个标志也可以理解为每个像素所占的尺寸的
长宽比。这个标志也是在显示的时候用到,对解码过程没影响。
表 3-7 象素长宽比的含义
aspect_ratio_info pixel aspect ratios
0000 Forbidden
0001 1:1 (Square)
0010 12:11 (625-type for 4:3 picture)
0011 10:11 (525-type for 4:3 picture)
0100 16:11 (625-type stretched for 16:9 picture)
0101 40:33 (525-type stretched for 16:9 picture)
0110-1110 Reserved
1111 extended PAR
Par_width:这个8 比特无符号整数指示了像素外形的水平尺寸,0值被禁止。
Par_height:这个8 比特无符号整数指示了像素外形的垂直尺寸,0值被禁止。
Vol_control_parameters:这是一个1 比特标志,当它被设置为1时,指示了下列参数的存在:
Chroma_format、low_delay和vbv_parameters。
Chroma_format:这是一个2 比特整数,指示了色彩格式,其含义见表3-8:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 40 页共 99页
表 3-8 chroma_format的含义
chroma_format Meaning
00 Reserved
01 4:2:0
10 Reserved
11 Reserved
我们用4:2:0,如果不是,则表示出错。
Low_delay:这是一个1 比特标志,设置为1 表示vol 中没有B-VOP。
Vbv_parameters:这是一个1 比特标志,设置为1指示了以下参数的存在:first_half_bit_rate,
latter_half_bit_rate , first_half_vbv_buffer_size , latter_half_vbv_buffer_size ,
first_half_vbv_occupancy和latter_half_vbv_occupancy。
First_half_bit_rate,latter_half_bit_rate:比特率是一个30比特的无符号整数,单位是400bits/s,
其中0 值被禁止。比特率被分为两个部分,主要部分(前15 比特)定义在first_half_bit_rate,
次要部分(后15 比特)定义在latter_half_bit_rate。Marker_bit 被插入在两者之间,用来防
止起始码竞争(即起始码字重复)。编码器可见的瞬时视频对象层比特率被Rvol(t)指示。如
果比特率域(也就是first_half_bit_rate 和latter_half_bit_rate)在VOL 头中存在,它定义了
峰值码率,也就说Rvol(t) <= 400 * bit_rate。
First_half_vbv_buffer_size,latter_half_vbv_buffer_size:vbv_buffer_size 是一个18 比特的无
符号整数。它分为两个部分,主要部分(前15比特)在first_half_vbv_buffer_size中定义,
次要部分(后3比特)在latter_half_vbv_buffer_size 中定义。Marker_bit被插入在两者之间,
用来防止起始码竞争。描述vbv缓冲区尺寸的单位是16384bits。0值在vbv_buffer_size被禁
止。
First_half_vbv_occupancy,latter_half_vbv_occupancy:vbv_occupancy是一个26 比特的无符
号整数,它分为两个部分,主要部分(前11 比特)在first_half_vbv_occupancy 中定义,次
要部分(后15 比特)在latter_half_vbv_occupancy 中定义。Marker_bit 被插入在
first_vbv_buffer_size 和latter_half_vbv_buffer_size 之间防止起始码竞争。这个整数指示了
VOL头后面第一个VOP移出解码缓冲区之前的VBV占有量,单位为64 比特。这个量的目
的是给VBV缓冲区的充满程度提供初始条件。
Video_object_layer_shape:这2 比特整数含义定义在表3-9 中,指示了视频对象层的形状
类型。我们只使用rectangular,对其他类型不打算再介绍。如果码流中指示的形状类型不是
rectangular,则停止解码。
表 3-9 视频对象层的形状类型
Shape format Meaning
00 Rectangular
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 41 页共 99页
01 Binary
10 binary only
11 Grayscale
Vop_time_increment_resolution:这是一个16 比特的整数,指示了vop_time_increment 的时
间分辨率。它的值实际上就表示了1 秒被分成多少间隔。例如,它的值为5,则表示1 秒平
均分成5 块,因此时间分辨率就是1/5 秒,也就是说vop_time_increment 的单位为1/5 秒。
Fixed_vop_rate:这是一个1 比特标志,它指示所有VOP是否用固定的码率编码。只有当任
意两个连续的vop 显示间隔是常数时,它才被设置为1。在这种情形下,vop 码率可以由
fixed_vop_time_increment 得到。如果它被设置为0,那么两个连续的VOP 的显示间隔是变
化的,这时需要vop头中的时间戳表示。
Fixed_vop_time_increment:这个码字描述了显示序列中两个vop 之间的时间长度,单位由
vop_time_increment_resolution 决定, 等于它的倒数。它可以在[ 0 ,
vop_time_increment_resoluteion ] 之间取值。它需要的比特数可以用
vop_time_increment_resoluteion 的上界来计算。Fixed_vop_time_increment 只有在
fixed_vop_rate 被设置为1 时才存在,而且它的值必须和显示顺序中两个连续的vop 的时间
间隔给出的常量一致。在这种情形下, 固定的vop 码率由
vop_time_increment_resolution/fixed_vop_time_increment给出。0 值被禁止。
Vop_time_increment_resolution,fix_vop_time_increment 和vop_time_increment 的关系见表3
-10。例如:
VOP time = vop_time_increment/vop_time_increment_resolution
表3-10 vop_time_increment_resolution,fixed_vop_time_increment和
vop_time_increment的关系的例子
Fixed VOP rate =
1/VOP time
vop_time_increment_
resolution
fixed_vop_time_
increment
vop_time_increment
15Hz 15 1 0, 1, 2, 3, 4,…
7.5Hz 15 2 0, 2, 4, 6, 8,…
29.97…Hz 30000 1001 0, 1001, 2002, 3003,…
59.94…Hz 60000 1001 0, 1001, 2002, 3003,…
Video_object_layer_width:这个一个13 比特的无符号整数,以像素为单位描述了亮度的宽
度。在编码的VOP中以宏块为单位的宽度为(video_object_layer_width+15)/16。
Video_object_layer_height:这个一个13 比特的无符号整数,以像素为单位描述了亮度的高
度。在编码的VOP中以宏块为单位的高度为(video_object_layer_width+15)/16。
Interlaced:这是一个1 比特标志,当它设置为1,表示VOP 可以包含隔行图像;但它设置
为0 时,vop中不能包含隔行图像,也就是只能是逐行的图像。
Obmc_disable:这是一个1 比特标志,设置为1 禁止重叠块运动补偿。重叠块运动补偿在
MPEG4目前的profile中都没有定义,我们也肯定不支持,所以如果码流中这个标志不是1,
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 42 页共 99页
则表示码流错误,停止解码。
Sprite_enable:当video_object_layer_verid 为‘0001’时,它为1 比特,否则为2 比特,它
的具体含义见表3-11:
表 3-11 sprite_enable的含义
sprite_enable
(video_object_layer_
verid == ‘0001’)
sprite_enable
(video_object_layer_
verid == ‘0002’)
Sprite Coding Mode
0 00 sprite not used
1 01 static (Basic/Low Latency)
- 10 GMC (Global Motion Compensation)
- 11 Reserved
我们不支持sprite编码,所以sprite的值为0 或者00,如果不是,则表示当前码流我们不能
解码,停止继续解码。
Not_8_bit:这是一个1 比特标志,但它设置为1 时表示视频数据的精度不是每像素8 比特。
我们不支持这种情况,因此如果如果这个标志为1,我们将停止解码。
Quant_type:这是一个1 比特标志,当它设置为1 时,使用MPEG 量化,当它为0 时使用
263 量化。如果使用MPEG 量化,有两个缺省的量化矩阵,分别对应帧内宏块和帧间宏块:
内部宏块的缺省量化矩阵为:
8 17 18 19 21 23 25 27
17 18 19 21 23 25 27 28
20 21 22 23 24 26 28 30
21 22 23 24 26 28 30 32
22 23 24 26 28 30 32 35
23 24 26 28 30 32 35 38
25 26 28 30 32 35 38 41
27 28 30 32 35 38 41 45
帧间宏块的缺省量化矩阵为:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 43 页共 99页
16 17 18 19 20 21 22 23
17 18 19 20 21 22 23 24
18 19 20 21 22 23 24 25
19 20 21 22 23 24 26 27
20 21 22 23 25 26 27 28
21 22 23 24 26 27 28 30
22 23 24 26 27 28 30 31
23 24 25 27 28 30 31 33
Load_intra_quant_mat:这是一个1 比特标志,当intra_quant_mat 在后面出现时,它被设置
为1。
Intra_quant_mat:这是一个包含2 个到64 个无符号整数的表。它是以之字形扫描的形式在
码流中传输的。如果遇到0 值,表示后面没有数了,剩下的没有传输的值被设定为与最后一
个非0 值相同。第一个值总是8,他在解码过程中不被使用。
Load_nonintra_quant_mat:这是一个1 比特标志,但它被设置为1 时,说明后面有
nonintra_quant_mat。
Nonintra_quant_mat:这是一个包含2 个到64 个无符号整数的表。它是以之字形扫描的形式
在码流中传输的。如果遇到0值,表示后面没有数了,剩下的没有传输的值被设定为与最后
一个非0 值相同。第一个值不能为0
Quarter_sample:这是一个1 比特表示,设置为0 时表示使用1/2像素运动补偿;设置为1
时表示对亮度部分使用1/4 像素运动补偿。
Complexity_estimation_disable:这是一个1 比特标志,当它为1 时说明在每一个vop中禁止
复杂估计头。我们不用复杂估计头,如果码流中使用了复杂估计头,就停止解码。
Resync_marker_disable:这是一个1 比特标志,当它设置为1 时指示编码的vop 中没有
resync_marker。这个标志只在解码优化中使用。成功的解码器在执行时可以不考虑这个标志
的值。Resync_marker 实际上就是一个重同步标志,当码流出错时,它能起到一定的作用,
我们是支持的。
Data_partitioned:这是一个1 比特标志,当它设置为1时表示宏块数据用不同方式重新安排,
特别是运动向量数据从纹理数据中分离出来。我们暂时不用这个,如果遇到码流使用了数据
分割,我们就停止解码。
Reversible_vlc:这是一个1 比特标志,当特设置为1 时指示在解码DCT 系数过程中使用可
逆的变长码表。这些表只有当data_partitioned标志设置为1 时才使用。我们暂不考虑用这个。
Newpred_enable:这是一个1 比特标志,当它设置为1 时,表示使用NEWPRED 模式。当
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 44 页共 99页
video_object_layer_verid 等于‘0001’时,Newpred_enable 没有传输,取默认值0。我们暂
不支持这种模式,如果我们解码的码流中支持,则停止解码。
Reduced_resolution_vop_enable:这是一个1 比特标志,当设置为1 表示使用降分辨率vop
工具。当video_object_layer_verid等于‘0001’时,Reduced_resolution_vop_enable没有传输,
取默认值0。我们暂不支持这种模式,如果我们解码的码流中支持,则停止解码。
Scalability:这是一个1 比特标志,当它设置为1 时指示了当前曾使用了可扩展编码。如果
当前层是基本层,设置为0。我们不使用扩展编码,因此如果我们解码的码流中这个标志为
1,则停止解码。
stuffing_start_code: 这是一个比特串,以16 进制表示为‘000001C3’ 。它和后面的
stuffing_byte联合使用为了保证VBV buffer 的调整。
stuffing_byte: 这是一个8 比特字符串,它的值为’11111111’.
3.3.3 Group of Video Object Plane
group_of_vop_start_code:它以16 进制表示为‘00 00 01 B3’,表示GOV头的开始。
Time_code:这是一个18 比特整数,包含以下内容:time_code_hours,time_code_minutes,
marker_bit和time_code_seconds(参见表3-12)。这些参数符合IEC标准461(视频磁带记
录的时间和控制码的定义。时间码为GOV 头后面第一个视频对象平面(显示顺序)给出了以
秒为单位的整数部分。
表 3-12 time—code的含义
time_code range of value No. of bits Mnemonic
time_code_hours 0 - 23 5 uimsbf
time_code_minutes 0 - 59 6 uimsbf
marker_bit 1 1 bslbf
time_code_seconds 0 - 59 6 uimsbf
Closed_gov:这是一个1 比特标志,它指示了紧跟在GOV头后第一个编码的I-VOP后的第
一个B-VOP(指的是解码顺序)中使用的预测的本性。Closed_gov设置为1指示了这些B-VOP
在编码时只使用后向预测和内部编码(?),这个标志保证了编码后的视频可以被编辑,如果
前面的图像删除,broken_link 将被设置为1,以便解码器可以不显示这些紧跟在GOV 头后
第一个I-VOP的B-VOP。然而closed_gov为1 时,编辑后可以不设置broken_link,因为此
时这些B-VOP可以被解码。
Broken_link:这是一个1 比特标志,在编码过程中它被设置为0。它设置为1 指示了紧跟
GOV头后第一个I-VOP的B-VOP可能不能正确解码,因为用来预测的参考帧已经不可用。
解码器使用这个标志来避免显示不能正确解码的帧。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 45 页共 99页
3.3.4 Video Object Plane
vop_start_code:这是一个16 进制的比特串‘00 00 01 B6’,它表示了vop的开始。
Vop_coding_type:这个2 比特标志给出了vop的编码类型。如表3-13 所示:
表 3-13 vop_coding_type的含义
vop_coding_type coding method
00 intra-coded (I)
01 predictive-coded (P)
10 bidirectionally-predictive-coded (B)
11 sprite (S)
其中sprite我们不使用,如果遇到vop_coding_type 为sprite,则停止解码。
Modulo_time_base:这个是以秒为分辨率的局部时间基准,它给出从GOV 头中的时间基准
开始,到当前帧经过了多少秒,它由一个0 和后面紧跟着的若干个1 组成,每个1 表示1
秒。如01111,表示经过了4 秒。
Vop_time_increment:这个值的单位为vol 中定义的1/vop_time_increment_resolution 秒,它
给出当前vop 的以modulo_time_base 为基准的精确时间。它的取值范围为
[0,vop_time_increment_resolution]。这个值所需要的比特数由描述这个范围所需要的最小比
特数来计算。
Vop_coded:这是一个1 比特标志,当它为0时指示了这个VOP没有后续数据存在。在这种
情形下,用前向参考VOP的内容来填充。
Vop_rounding_type:这是一个1 比特标志,它给出了参数rounding_control 的值,这个值用
在P-VOP的运动补偿中使用的像素差值中。如果这个标志为0,rounding_control 为0;如果
这个标志为1,rounding_control 的值为1。当vop_rounding_type 在VOP 头中不存在时,
rounding_control 的值为0。
Intra_dc_vlc_thr:这是一个3 比特码。帧内宏块的DC系数编码可以采用两种方法,这个码
字为DC采用哪种编码方式提供了一个选择机制,如表3-14 所示:
表 3-14 intra_dc_vlc_thr的含义
index meaning of intra_dc_vlc_thr code
0 Use Intra DC VLC for entire VOP 000
1 Switch to Intra AC VLC at running Qp >=13 001
2 Switch to Intra AC VLC at running Qp >=15 010
3 Switch to Intra AC VLC at running Qp >=17 011
4 Switch to Intra AC VLC at running Qp >=19 100
5 Switch to Intra AC VLC at running Qp >=21 101
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 46 页共 99页
6 Switch to Intra AC VLC at running Qp >=23 110
7 Use Intra AC VLC for entire VOP 111
Running QP定义为上一个宏块的量化值,一个VOP或者video packet的第一个宏块除外。
如果当前宏块是VOP或者video packet中第一个宏块,则running QP定义为当前宏块的量
化值。
例如,如果intra_dc_vlc_thr 为001,当前宏块的QP 为14,由于14>13,所以DC 用同AC
系数一样的VLC编码,如果QP值为11,11<13,则DC单独编码。
Top_field_first:这是一个1 比特标志,当它设置为1时,表示重建VOP的顶场先被显示(即
在解码时首先被输出显示)。当它设为0时,表示重建VOP的底场先被显示。
Alternate_vertical_scan_flag:这是一个1 比特标志,当它被设置为1 时,表示在隔行扫描的
VOP中使用交替垂直扫描。
Vop_quant:这是一个无符号整数,它给出在宏块逆量化过程中的量化值,直到被后续的
dquant,dbquant,quant_scale更新为止。它的长度为5,范围为1到31。
Vop_fcode_forward:这是一个3 比特的无符号整数,取值从1 到7,0 被禁止,它在运动向
量解码中使用,给出了运动矢量的范围。
Vop_fcode_backward:这是一个3 比特的无符号整数,取值从1 到7,0 被禁止,它在运动
向量解码中使用,给出了运动矢量的范围。
3.3.5 Video Packet Header
resync_marker:这是一个二进制串,有至少16 个0,后面跟一个1 组成,‘0 0000 0000 0000
0001’。对I-VOP,resync_marker 是16 个0 后面一个1。对P-VOP,resync_marker 的长度
取决于vop_fcode_forward的值;对B-VOP,resync_marker 的长度取决于vop_fcode_forward
和vop_fcode_backward中较大的值。对P-VOP,resync_marker 的值为(15+fcode)个0 后面跟
一个1;对B-VOP,resync_marker 的值为max(15+fcode,17)个0 后面跟一个1 组成。它只有
在resync_marker_disable为0 才会出现,并且只能在宏块数据前面字节对齐的位置。
Macorblock_number:这是一个长度可变的码字,从1比特到14 比特,它标识了vop中的宏
块编号。VOP中左上角的宏块号为0,宏块号从左到右,从上到下逐个增加。这个码的实际
长度依赖于VOP中的总宏块数目,VOP中的宏块数可以由表3-15给出。例如,对于720*576
的帧,宏块数有1620个,因此需要11 比特表示就可以了。
表 3-15 Macroblock_number码长的度
length of macroblock_number code ((video_object_layer_width+15
)/16) * ((video_object_layer
_height+15)/16)
1 1-2
2 3-4
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 47 页共 99页
3 5-8
4 9-16
5 17-32
6 33-64
7 65-128
8 129-256
9 257-512
10 513-1024
11 1025-2048
12 2049-4096
13 4097-8192
14 8193-16384
Quant_scale:这是一个无符号整数,它给出了对视频包中的宏块进行反量化时使用的量化值,
直到被后面的dquant 更新为止。它的长度为5比特。
Header_extention_code:这是一个1 比特标志,当它设置为1 时说明在该视频包头中还有附
加的码字存在。当header_extention_code为1 时,modulo_time_base,vop_time_increment,
vop_coding_type,intra_dc_vlc_thr 也在头中出现,如果是P帧,vop_fcode_forward将会存在,
如果是B帧,vop_fcode_backward也会存在。这些码字的含义前面已经都提到过,这里不再
重复。
3.3.6MacroBlock
3.3.6.1 宏块头信息
not_coded:这是一个1 比特标志,用来指示一个宏块是否编码。当它被设置为1 时,表示
这个宏块没有被编码,码流中没有进一步的关于这个宏块的数据。解码器对待这个宏块就如
同运动向量为0 并且所有DCT系数也都为0 的帧间宏块。当它设置为0 时,标志这个宏块
被编码,码流中有进一步的数据。这个标志只有帧间宏块时才会存在。
Mcbpc:这是一个变长码,它来自于宏块类型mb_type和色差块的的编码模式,它只有当宏
块被编码时才会出现。表3-17 和表3-18 分别给出了I-VOP和P-VOP中有mcbpc的允许
码值。这些表中的“MB type”一列的值被用作变量“derived_mb_type”的值,它用在运动和
纹理信息的解码中。在短头格式中,mcbpc指示了宏块类型2 不被使用,即不使用四矢量运
动补偿。
表 3-16 中给出了I帧和P帧中不同宏块类型和对应的在码流用允许存在的数据元素。
表 3-16 I 帧和P帧中宏块类型和它所包含的数据元素
VOP type mb type Name not_coded mcbpc cbpy dquant mvd mvd2-4
P not coded - 1
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 48 页共 99页
P 0 inter 1 1 1 1
P 1 inter+q 1 1 1 1 1
P 2 inter4v 1 1 1 1 1
P 3 intra 1 1 1
P 4 intra+q 1 1 1 1
P stuffing - 1 1
I 3 intra 1 1
I 4 intra+q 1 1 1
I stuffing - 1
其中stuffing类型的宏块是填充用的,实际上它并不是实际的有意义的宏块。
Inter:帧间宏块,只有一个运动矢量,并且dquant 不存在。
Inter+q:帧间宏块,只有一个运动矢量,但是存在dquant。
Inter4v:帧间宏块,有四个运动矢量,即每个亮度块都由一个运动矢量。
Intra:帧内宏块,存在dquant。
Intra+q:帧内宏块,不存在dquant。
表 3-17 I-VOP中mcbpc的变长码表
Code mbtype cbpc
(56)
1 3 00
001 3 01
010 3 10
011 3 11
0001 4 00
0000 01 4 01
0000 10 4 10
0000 11 4 11
0000 0000 1 Stuffing --
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 49 页共 99页
表 3-18 P-VOP中mcbpc的变长码表
Code MB type cbpc
(56)
1 0 00
0011 0 01
0010 0 10
0001 01 0 11
011 1 00
0000 111 1 01
0000 110 1 10
0000 0010 1 1 11
010 2 00
0000 101 2 01
0000 100 2 10
0000 0101 2 11
0001 1 3 00
0000 0100 3 01
0000 0011 3 10
0000 011 3 11
0001 00 4 00
0000 0010 0 4 01
0000 0001 1 4 10
0000 0001 0 4 11
0000 0000 1 Stuffing --
Ac_pred_flag:这是一个1 比特标志,当它设置为1 时表示帧内编码宏块的AC 系数的第一
行或者第一列使用差分编码,即使用AC预测编码。
Cbpy:这是一个变长码字,解码之后得到一个四个比特码字,这个四比特码每一位对应一
个亮度块的编码模式。对帧内宏块,如果cbpy解出的四比特码字为1101,则表示第三个亮
度块除DC 系数外,所有的ac 系数都为0,其它三个亮度块至少有一个ac 系数不为0。对
帧间宏块,如果cbpy 解出的四比特码字为1011,则表示第二个亮度的所有系数均为0,其
它三个亮度块至少有一个系数不为0(包括dc 系数,实际上此时dc 和ac 是等价的)。Cby
的变长码表见表3-19。(内部宏块dc不单独编码时,这个码字如何定义?)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 50 页共 99页
表 3-19 I-VOP和P-VOP中cbpy的变长码表
Code cbpy(intra-MB)
(12
34)
cbpy(inter-MB),
(12
34)
0011 00
00
11
11
0010 1 00
01
11
10
0010 0 00
10
11
01
1001 00
11
11
00
0001 1 01
00
10
11
0111 01
01
10
10
0000 10 01
10
10
01
1011 01
11
10
00
0001 0 10
00
01
11
0000 11 10
01
01
10
0101 10
10
01
01
1010 10
11
01
00
0100 11
00
00
11
1000 11
01
00
10
0110 11
10
00
01
11 11
11
00
00
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 51 页共 99页
Dquant:这是一个2 比特码,它指示了I-VOP和P-VOP中量化值的变化。表3-20 给出了
这些码字和它们表示的差分值。量化值的范围是1 到31,如果当前量化值加上dquant 后小
于1 或者大于31,则应该限制在1 到31 之间。注意这里当前的量化值实际上指的是上一个
编码的宏块的量化值。因此,在解码过程中,一帧的quant 值需要一直保留,并被不断更新
的。
表 3-20 dquant码和相应的值
dquant code value
00 -1
01 -2
10 1
11 2
Co_located_not_coded:这个码字在码流中并不存在。在当前vop 是B-VOP,它的后向参考
VOP是一个P-VOP,并且在后向参考宏块钟和当前宏块的编号一样的参考宏块没有被编码,
则这个标志设置为1,否则这个标志设置为0。
Modb:这是一个变长码,它只有在编码的B_VOP 的宏块中才会出现。它指示了mb_type
和/或者cbpb 在当前宏块中是否存在。这个码字的含义在表3-21中给出。
表 3-21 modb的变长码表
Code cbpb mb_type
1
01 1
00 1 1
Mb_type:这是一个变长码,它只在编码的B-VOP 中出现。进一步说,这个码字只有在包
含运动矢量的宏块中出现。Mb_type的变长码字在表3-22 中给出。
表 3-22 B-VOP的编码宏块中的mb_type和对应包含的数据元素
Code dbquant mvdf mvdb mvdb mb_type
1 1 direct
01 1 1 1 interpolate mc+q
001 1 1 backward mc+q
0001 1 1 forward mc+q
Cbpb:这是一个6 比特码,它表示B-VOP种编码块的模式。Cbpb 的每一个比特描述了对应
的块是否被编码的状态,最左边的比特与宏块中左上角的亮度块对应。最后2 个比特对应两
个色度块。对一个存在非0 系数的块,相应的比特设置为1,否则设置为0。如果一个宏块
的所有块的系数均为0,则modb 的值应该为1 或者01,指示了cbpb 码字在码流中不存在。
Dbquant:这是一个变长码,它指示了B-VOP中量化值的变化。表3-23给出了这些码字和
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 52 页共 99页
它们表示的差分值。如果当前量化值加上dbquant 后小于1 或者大于31,它将被限制在1
到31 之间。注意,同dquant 一样,这里当前的量化值实际上指的是上一个编码的宏块的量
化值。因此,在解码过程中,一帧的quant 值需要一直保留,并被不断更新的。
表 3-23 dbquant变长码字和对应的值
dbquant code value
10 -2
0 0
11 2
3.3.6.2 运动向量
horizontal_mv_data:这是一个变长码,如表3-24 所示,它在运动向量解码中使用。
Vertical_mv_data:这是一个变长码,如表3-24 所示,它在运动向量解码中使用。
Horizontal_mv_residual:这是一个无符号整数,它用在运动向量解码中。它在码流中的比特
数可以由fcode_forward和fcode_backward按下面的方式得到:
R_size = vop_fcode_forward – 1 或者R_size = vop_fcode_backward – 1
Vertical_mv_residual:这是一个无符号整数,它用在运动向量解码中。它在码流中的比特数
可以由fcode_forward和fcode_backward按下面的方式得到:
R_size = vop_fcode_forward – 1 或者R_size = vop_fcode_backward – 1
表3-24 MVD的变长码表
Codes Vector differences
0000 0000 0010 1 -16
0000 0000 0011 1 -15.5
0000 0000 0101 -15
0000 0000 0111 -14.5
0000 0000 1001 -14
0000 0000 1011 -13.5
0000 0000 1101 -13
0000 0000 1111 -12.5
0000 0001 001 -12
0000 0001 011 -11.5
0000 0001 101 -11
0000 0001 111 -10.5
0000 0010 001 -10
0000 0010 011 -9.5
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 53 页共 99页
0000 0010 101 -9
0000 0010 111 -8.5
0000 0011 001 -8
0000 0011 011 -7.5
0000 0011 101 -7
0000 0011 111 -6.5
0000 0100 001 -6
0000 0100 011 -5.5
0000 0100 11 -5
0000 0101 01 -4.5
0000 0101 11 -4
0000 0111 -3.5
0000 1001 -3
0000 1011 -2.5
0000 111 -2
0001 1 -1.5
0011 -1
011 -0.5
1 0
010 0.5
0010 1
0001 0 1.5
0000 110 2
0000 1010 2.5
0000 1000 3
0000 0110 3.5
0000 0101 10 4
0000 0101 00 4.5
0000 0100 10 5
0000 0100 010 5.5
0000 0100 000 6
0000 0011 110 6.5
0000 0011 100 7
0000 0011 010 7.5
0000 0011 000 8
0000 0010 110 8.5
0000 0010 100 9
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 54 页共 99页
0000 0010 010 9.5
0000 0010 000 10
0000 0001 110 10.5
0000 0001 100 11
0000 0001 010 11.5
0000 0001 000 12
0000 0000 1110 12.5
0000 0000 1100 13
0000 0000 1010 13.5
0000 0000 1000 14
0000 0000 0110 14.5
0000 0000 0100 15
0000 0000 0011 0 15.5
0000 0000 0010 0 16
注意: 当 vop_fcode等于1 是最后一个码字不能被使用。
3.3.6.3 隔行模式下的信息
dct_type:这是一个1 比特标志,它指示了一个宏块使用帧DCT 变换还是场DCT 变换。如
果这个标志为1,这个宏块使用场DCT变换;否则使用帧DCT变换。这个标志只有在隔行
标志被设置1 并且当前宏块被编码(编码块模式非0)或者为帧内宏块时才会存在。
Field_prediction:这是一个1 比特标志,它指示了当前宏块使用场预测还是帧预测。当这个
标志设置为1 时,说明使用场预测,设置为0 时,使用帧预测。这个标志只有在隔行标志被
设置为1 并且P-VOP 中的derived_mb_type 等于0 或者1;或者B-VOP 中非直接模式的宏
块时才会存在。
Forward_top_field_reference:这是一个1 比特标志,它指示了顶场使用前向运动补偿时的参
考场。当这个标志设置为0 时,顶场被用作参考场;当这个标志被设置为1 时,底场被用作
参考场。这个标志只在field_prediction被设置为1 并且宏块不是使用后向预测时才会存在。
Forward_bottom_field_reference:这是一个1 比特标志,它指示了底场使用前向运动补偿时
的参考场。当这个标志设置为0 时,顶场被用作参考场;当这个标志被设置为1 时,底场被
用作参考场。这个标志只在field_prediction被设置为1 并且宏块不是使用后向预测时才会存
在。
Backward_top_field_reference:这是一个1 比特标志,它指示了顶场使用后向运动补偿时的
参考场。当这个标志设置为0 时,顶场被用作参考场;当这个标志被设置为1时,底场被用
作参考场。这个标志只在field_prediction被设置为1并且宏块不是使用前向预测时才会存在。
Backward_bottom_field_reference:这是一个1 比特标志,它指示了底场使用后向运动补偿时
的参考场。当这个标志设置为0 时,顶场被用作参考场;当这个标志被设置为1 时,底场被
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 55 页共 99页
用作参考场。这个标志只在field_prediction被设置为1 并且宏块不是使用前向预测时才会存
在。
3.3.6.4 块层相关
use_intra_dc_vlc:内部宏块dc是否单独编码的标志。当它为1 时,使用intra dc vlc,即dc单
独编码;当它为0时,使用intra ac vlc,即dc按照ac一样编码。这个码字可以由intra_dc_vlc_thr
和上一个宏块(或者当前宏块的量化系数而来),具体见intra_dc_vlc_thr 的语义。
intra_dc_coefficient:这是一个定长码字,它在短头格式时被使用(即short_video_header 为1)
时定义了帧内宏块DC系数的值。它作为一个8 比特无符号定长码被传输,除非这个整数是
255。0到128 不能被使用,作为保留值。如果这个整数是255,它被解释为值128。这个整
数然后被乘以dc_scaler(等于8)来产生重建的帧内DC系数值。
Dct_dc_size_luminance:这是一个变长码,如表3-25 所示,它用来产生帧内宏块中亮度块
的DC系数的差分值。这个值把系数按照它们的长度进行分类。
表 3-25 dct_dc_size_luminance的变长码表
Variable length code dct_dc_size_luminance
011 0
11 1
10 2
010 3
001 4
0001 5
0000 1 6
0000 01 7
0000 001 8
0000 0001 9
0000 0000 1 10
0000 0000 01 11
0000 0000 001 12
NOTE: 变长码字对应的dct_dc_size_luminance的值为10、11、12时,如果当前对象类型对
应的像素宽度为8bite,则是不合法的。因此对我们来说长度为10、11、12 的
dct_dc_size_luminance 不会出现,因此差分DC 值的数据范围为[-511,+511],只用10
位表示就足够了。
Dct_dc_size_chrominance:这是一个变长码,见表它用来产生帧内宏块中色度块的DC 系数
的差分值。这个值把系数按照它们的长度进行分类,如表3-26所示。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 56 页共 99页
表 3-26 dct_dc_size_chrominance的变长码表
Variable length code dct_dc_size_chrominance
11 0
10 1
01 2
001 3
0001 4
0000 1 5
0000 01 6
0000 001 7
0000 0001 8
0000 0000 1 9
0000 0000 01 10
0000 0000 001 11
0000 0000 0001 12
NOTE: 变长码字对应的dct_dc_size_chrominance的值为10、11、12时,如果当前对象类型
对应的像素宽度为8bite,则是不合法的。因此对我们来说长度为10、11、12 的
dct_dc_size_chrominance 不会出现,因此差分DC 值的数据范围为[-511,+511],只用
10 位表示就足够了。
Dct_dc_differetial:这是一个变长码,它可以用来产生帧内宏块中的差分DC 系数值。在它
的长度被dct_dc_size_luminance或dct_dc_size_chrominance确定后,它的实际值可以得到。
它的码表见表3-27:
Pattern_code[i]:当第i块的用变长码表示的DCT coefficient 全部为0,则该码字为0,否则
为1。对帧内宏块,如果第i 块的DC单独编码,且对应的cbp为0,则pattern_code为0。
对帧间宏块,如果第i块cbp为0,则pattern_code为0。(对内部宏块,如果dc不单独编码,
则特殊考虑)
DCT coefficient:用变长码表示的DCT系数。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 57 页共 99页
表 3-27 差分 DC码
Additional code Differential DC Size
000000000000 to 011111111111 * -4095 to -2048 12
00000000000 to 01111111111 * -2047 to -1024 11
0000000000 to 0111111111 * -1023 to -512 10
000000000 to 011111111 * -511 to -256 9
00000000 to 01111111 -255 to -128 8
0000000 to 0111111 -127 to -64 7
000000 to 011111 -63 to -32 6
00000 to 01111 -31 to -16 5
0000 to 0111 -15 to -8 4
000 to 011 -7 to -4 3
00 to 01 -3 to -2 2
0 -1 1
0 0
1 1 1
10 to 11 2 to 3 2
100 to 111 4 to 7 3
1000 to 1111 8 to 15 4
10000 to 11111 16 to 31 5
100000 to 111111 32 to 63 6
1000000 to 1111111 64 to 127 7
10000000 to 11111111 128 to 255 8
100000000 to 111111111 * 256 to 511 9
1000000000 to 1111111111 * 512 to 1023 10
10000000000 to 11111111111 * 1024 to 2047 11
100000000000 to 111111111111 * 2048 to 4095 12
NOTE1: 变长码字对应的size 的值为10、11、12 时,如果当前对象类型对应的像素宽度为
8bite,则是不合法的。因此对我们来说长度为10、11、12 的size不会出现,因此差分DC
值的数据范围为[-511,+511],只用10 位表示就足够了。
NOTE2:当dct_dc_size大于8 时(在表中标记了*号),在dct_dc_additional_code之后要插入
一个填充比特,以防止与起始码竞争。
3.3.7 短头格式
video_plane_with_short_header():这个数据结构包含了使用短头格式的视频平面。有几个参
数对短头格式都是预先定义,并且是固定的,这是由于短头格式中信息容量是受限制的。这
些固定的参数见表3-28。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 58 页共 99页
表 3-28 video_plane_with_short_header()中的固定设置
Parameter Value
video_object_layer_shape “rectangular”
obmc_disable 1
quant_type 0
resync_marker_disable 1
data_partitioned 0
block_count 6
reversible_vlc 0
vop_rounding_type 0
vop_fcode_forward 1
vop_coded 1
interlaced 0
complexity_estimation_disable 1
use_intra_dc_vlc 0
scalability 0
not_8_bit 0
bits_per_pixel 8
colour_primaries 1
transfer_characteristics 1
matrix_coefficients 6
Short_video_start_marker:这是一个22 比特的起始标记,它的值为‘0000 0000 0000 0000 1000
00’。它用来表示含有短头格式的视频平面的位置。Short_video_start_marker 的前面可能不
需要插入0到7 个0来使得它是字节对齐的。
Temporal_reference:这是一个8 比特整数,包含256个可能的值。它的值是这样获得的,首
先将上一个传输的video_plane_with_short_header()中的temporal_reference加1,然后再加上
从上一个传输的图像到当前图像之间位传输的图像数目(在30000/1001HZ时考虑这个)。
这里的计算只用8 个LSB进行。
Split_screen_indicator:这是一个布尔信号,它指示了解码图象的上一半和下一半可以被并排
显示。这个比特在视频平面的编码和解码过程中没有直接的作用。
Document_camera_dindicator:这是一个布尔信号,它指示了VOP的视频内容的来源是文档
照相机(document camera)还是图形学表示(graphic representation),这同自然视频内容相反。
这个比特在视频平面的编码和解码过程中没有直接的作用。
Full_picture_freeze_release:这是一个布尔信号,它指示了如果视频信号的显示出现停止
(frozen),(由于错误,包丢失或者其他一些原因引起的),显示需要被恢复,这个比特在视频
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 59 页共 99页
平面的编码和解码过程中没有直接作用。
Source_format:这个值指示了由video_plane_with_short_header 表示的矩形视频平面的长度
和宽度。它的具体含义见表3-29。每一个源格式有相同的vop 时间间隔分辨率,它等于
30000/1001(近似为29.97)Hz;资源格式也具有相同的长宽比(288/3):(352/4),即12:11,
它定义了长宽比为4:3 的CIF格式的图像。
表 3-29 source_format域定义的参数
source_format
value
Source Format
Meaning
vop_width vop_height num_macroblocks_in_
gob
num_gobs_in_
vop
000 reserved reserved reserved reserved reserved
001 sub-QCIF 128 96 8 6
010 QCIF 176 144 11 9
011 CIF 352 288 22 18
100 4CIF 704 576 88 18
101 16CIF 1408 1152 352 18
110 reserved reserved reserved reserved reserved
111 reserved reserved reserved reserved reserved
Picture_coding_type:这个比特制定了vop_coding_type,当它等于0 时,vop_coding_type是:
“I”;当它等于1时,vop_coding_type为“P”。
Four_reserved_zero_bits:这个一个4 比特域,它包含了为未来保留的比特,现在都为0。
Pei:这是一个1 比特标志,当它为1 时指示了它后面有1 字节的psupp数据。
Psupp:这是一个8 比特域,它只有在pei为1 时才会出现。Pei + psupp机制为将来向后兼
容数据提供了保留方法。解码器无论是接受还是丢弃psupp,对解码都没有影响。Pei + psupp
的合并出现可能重复多次。Pei + psupp为将来的应用而保留的。
Gob_number:这是一个5 比特值,它指示了视频平面中视频数据的位置。一个GOB包含了
图像中按光栅扫描顺序的一些宏块。对于给定的gob_number , GOB 包含了
num_macroblock_per_gob 个宏块,从宏块号macroblock_number = gob_number *
num_macroblocks_per_gob开始的。Gob_number 即可以从码流中读出,也可以由解码过程推
断。
Num_gobs_in_vop:指示vop 中的GOB 数。这个参数可以从source_format 中得到,见表3
-28。
Gob_layer():这是在VOP中包含固定数目宏块的层。属于每隔gob的宏块可以用gob_number
和num_macroblock_in_gob 确定。
Gob_resync_marker:这是一个长度固定的17 比特的定长码,它的值为‘0000 0000 0000 0000
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 60 页共 99页
1’,它可以随意的插入在gob_layer()的开始。它的目的是作为码流中错误恢复的重同步标志。
Gob_resync_marker 码必须是字节对齐的,可以在码流中插入0 到7 个0 来字节对齐。
Gob_resync_marker 在第一个GOB中不能出现。
Gob_number:这是一个5 比特值,它指示了VOP 中哪个GOB 正在被处理,它的值即可以
从下面的gob_resync_marker 中读出,也可以从宏块解码过程中推断出来。所有GOB在每一
个video_plane_with_short_header()中出现,并且GOB 在码流中按严格增加的顺序出现。换
句话说,如果gob_number 从gob_resync_marker 后面的码字中读出,它的值必须和从码流中
推断出来的值一样。
Gob_frame_id:这是一个2 比特域,它在video_plane_with_short_header()中的vop头丢失的
情形下,用来帮助确定gob_resync_marker 后面的数据还能不能被使用。Gob_frame_id在给
定的video_plane_with_short_header()中的每一个GOB 头中的值都相同。进一步,如果在
video_plane_with_short_header()头中的split_screen_indicator、document_camera_indicator、
full_picture_freeze_release、source_format或picture_coding_type的任一个都和同一个视频对
象中先前传输的图像一致,则gob_frame_id 也同前面传输的图像的一致;反过来,如果当
前图像头中的信息同上一个传输的图像头中的信息不一样,那么gob_frame_id 同上一个图
像不一样。
Num_macroblocks_in_gob:这个值描述了每一个GOB 中的宏块数目。这个参数从
source_format中得到,见表3-28。
Short_video_end_marker:这是一个22 比特的值,它的值为‘0000 0000 0000 0000 1111 11’。
它用来表示video_plane_with_short_header()序列的结束。它也必须是字节对齐的,可以通过
在码流中插入1 个到7 个0 来实现。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 61 页共 99页
第四章 解码流程
这一章对MPEG4 ASP的解码流程作一个完整的介绍。首先给出解码框图,然后按照解
码的先后顺序对每一个功能模块进行详细的说明。
4.1. 解码框图




运动向量解码运动补偿
VLC IZZ
IACDC IQ IDCT
VOP重建
(ADD)
重建VOP
运动数据
纹理数据
图4-1 MPEG4 ASP的解码流程
如图4-1 所示,它给出了基本的解码流程。其中,码流解析就是从码流中得到头信息,
并把纹理数据送交纹理解码过程,运动数据送交运动解码过程。下面按照解码的顺序,逐个
进行介绍。在编码码流中,运动信息在纹理信息前面给出来得,不过在后面的解码流程介绍
中,我们还是先介绍纹理解码,再介绍运动解码。
4.2. 码流解析
码流解析就是从编码码流中解析到头信息,并把对我们有用的信息保存下来。接着将纹
理数据交给纹理解码模块,运动数据交给运动解码模块,实际上也就是把对码流的控制权交
给它们。
4.3. 纹理解码
这一部分讲述了VOP的纹理解码过程,此过程的框图如图4-2所示:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 62 页共 99页
Variable
Length
Decoding
Inverse Scan
Inverse DC &
AC Prediction
Inverse
Quantization
Inverse DCT Motion
Compensation
VOP Memory
Coded Data
Decoded Pels
QFS[n]
QF[v][u] f[y][x]
d[y][x]
Reconstructed VOP
F[v][u] PQF[v][u]
图4-2 MPEG4 ASP纹理解码流程
4.3.1 宏块系数解码
这一部分讲述了DCT系数的解码,包括DC系数(n=0)和AC系数(n!=0),这里n指的是
锯齿扫描的(zigzag)的系数序号。
4.3.1.1 帧内块的DC 系数解码
帧内宏块的差分DC 系数作为由dct_dc_size(见表3-25 和表3-26)指定长度的变长码
dct_dc_differential(见表3-27)来编码。dct_dc_size按DC系数的长度对它们进行分类。对每
一种分类方法,dct_dc_size后附加的若干比特唯一标识了差分的实际值。最终解码的DC系
数的实际值是差分DC值与预测值的和。这里需要注意的是,对我们来说,dct_dc_size的值
为10,11,12是不合法的,这样解码后的DC值的范围应该是[-511, +511],这样只需要用
10 个比特表示DC 系数就够了。(标准中原话如下:NOTE: The variable length code for
dct_dc_size_luminance of 10, 11 and 12 are not valid for any object types where the pixel depth is
8 bits. They shall not be present in a bitstream conforming to these object types.)
以上说的是一般情况,对下列情况需要特殊考虑:
当 short_video_header 为1 时,帧内块的DC系数不是按差分编码的,而是代以8 比特定
长码作为无符号整数来编码,除非这个整数是255。这些值中0~128 没有被使用,它们被
保留。如果要编码255,它被当成有符号整数128 来编码。短头格式情况下use_intra_dc_vlc
等于0。
对非短头格式帧内宏块,如果use_intra_dc_vlc等于0,则表示该内部宏块的DC不单独
编码,而将它同ac系数一起进行vlc编码,这也就意味着如果DC系数为0时并不编码,只
是简单的增加后面的AC系数的游程。同时,cbp的定义也要作相应的变化,本来,帧内块
的cbp为0,只要所有AC系数为0 就可以了;但如果use_intra_dc_vlc等于0 时,帧内块的
cbp为0,指的就是所有系数为0,而不仅仅是ac系数。
4.3.1.2 其他系数
AC 系数通过变长码产生一个事件(EVENT)来获得。一个事件由最后一个非0 系数指示
(LAST:0 说明这个块中还有许多非0 系数;1 说明这是块中最后一个非0系数)、编码系数
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 63 页共 99页
前面连续出现的0 的数目和这个非0 系数的值组成。
当 short_video_header 为1 时,最经常发生的事件用表4-1 的变长码编码。最后的比特
“s”表示符号,0 表示正而1 表示负。注意,此时对除帧内DC系数外的所有系数均用这个
表。
当 short_video_header 为0 时,帧内块和帧间块的变长码表是不同的。内部块的亮度和
色差系数最经常发生的事件变长码见表4-2;而帧间块的亮度和色差系数最经常发生的事
件变长码见表4-1。最后的比特“s”标识符号,0 表示正而1 表示负。
表 4-1 帧间亮度和色差TCOEF的变长码表
VLC CODE LAST RUN LEVEL VLC CODE LAST RUN LEVEL
10s 0 0 1 0111 s 1 0 1
1111 s 0 0 3 0000 1100 1s 0 11 1
0101 01s 0 0 6 0000 0000 101s 1 0 6
0010 111s 0 0 9 0011 11s 1 1 1
0001 1111 s 0 0 10 0000 0000 100s 1 0 7
0001 0010 1s 0 0 13 0011 10s 1 2 1
0001 0010 0s 0 0 14 0011 01s 0 5 1
0000 1000 01s 0 0 17 0011 00s 1 0 2
0000 1000 00s 0 0 18 0010 011s 1 5 1
0000 0000 111s 0 0 21 0010 010s 0 6 1
0000 0000 110s 0 0 22 0010 001s 1 3 1
0000 0100 000s 0 0 23 0010 000s 1 4 1
110s 0 0 2 0001 1010 s 1 9 1
0101 00s 0 1 2 0001 1001 s 0 8 1
0001 1110 s 0 0 11 0001 1000 s 0 9 1
0000 0011 11s 0 0 19 0001 0111 s 0 10 1
0000 0100 001s 0 0 24 0001 0110 s 1 0 3
0000 0101 0000s 0 0 25 0001 0101 s 1 6 1
1110 s 0 1 1 0001 0100 s 1 7 1
0001 1101 s 0 0 12 0001 0011 s 1 8 1
0000 0011 10s 0 0 20 0000 1100 0s 0 12 1
0000 0101 0001s 0 0 26 0000 1011 1s 1 0 4
0110 1s 0 0 4 0000 1011 0s 1 1 2
0001 0001 1s 0 0 15 0000 1010 1s 1 10 1
0000 0011 01s 0 1 7 0000 1010 0s 1 11 1
0110 0s 0 0 5 0000 1001 1s 1 12 1
0001 0001 0s 0 4 2 0000 1001 0s 1 13 1
0000 0101 0010s 0 0 27 0000 1000 1s 1 14 1
0101 1s 0 2 1 0000 0001 11s 0 13 1
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 64 页共 99页
0000 0011 00s 0 2 4 0000 0001 10s 1 0 5
0000 0101 0011s 0 1 9 0000 0001 01s 1 1 3
0100 11s 0 0 7 0000 0001 00s 1 2 2
0000 0010 11s 0 3 4 0000 0100 100s 1 3 2
VLC CODE LAST RUN LEVEL VLC CODE LAST RUN LEVEL
0000 0101 0100s 0 6 3 0000 0100 101s 1 4 2
0100 10s 0 0 8 0000 0100 110s 1 15 1
0000 0010 10s 0 4 3 0000 0100 111s 1 16 1
0100 01s 0 3 1 0000 0101 1000s 0 14 1
0000 0010 01s 0 8 2 0000 0101 1001s 1 0 8
0100 00s 0 4 1 0000 0101 1010s 1 5 2
0000 0010 00s 0 5 3 0000 0101 1011s 1 6 2
0010 110s 0 1 3 0000 0101 1100s 1 17 1
0000 0101 0101s 0 1 10 0000 0101 1101s 1 18 1
0010 101s 0 2 2 0000 0101 1110s 1 19 1
0010 100s 0 7 1 0000 0101 1111s 1 20 1
0001 1100 s 0 1 4 0000 011 escape
0001 1011 s 0 3 2
0001 0000 1s 0 0 16
0001 0000 0s 0 1 5
0000 1111 1s 0 1 6
0000 1111 0s 0 2 3
0000 1110 1s 0 3 3
0000 1110 0s 0 5 2
0000 1101 1s 0 6 2
0000 1101 0s 0 7 2
0000 0100 010s 0 1 8
0000 0100 011s 0 9 2
0000 0101 0110s 0 2 5
0000 0101 0111s 0 7 3
表 4-2 帧内亮度和色差TCOEF的变长码表
VLC CODE LAST RUN LEVEL VLC CODE LAST RUN LEVEL
10s 0 0 1 0111 s 1 0 1
1111 s 0 0 2 0000 1100 1s 1 0 2
0101 01s 0 0 3 0000 0000 101s 1 0 3
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 65 页共 99页
0010 111s 0 0 4 0011 11s 1 1 1
0001 1111 s 0 0 5 0000 0000 100s 1 1 2
0001 0010 1s 0 0 6 0011 10s 1 2 1
0001 0010 0s 0 0 7 0011 01s 1 3 1
0000 1000 01s 0 0 8 0011 00s 1 4 1
0000 1000 00s 0 0 9 0010 011s 1 5 1
0000 0000 111s 0 0 10 0010 010s 1 6 1
0000 0000 110s 0 0 11 0010 001s 1 7 1
0000 0100 000s 0 0 12 0010 000s 1 8 1
110s 0 1 1 0001 1010 s 1 9 1
0101 00s 0 1 2 0001 1001 s 1 10 1
0001 1110 s 0 1 3 0001 1000 s 1 11 1
0000 0011 11s 0 1 4 0001 0111 s 1 12 1
0000 0100 001s 0 1 5 0001 0110 s 1 13 1
0000 0101 0000s 0 1 6 0001 0101 s 1 14 1
1110 s 0 2 1 0001 0100 s 1 15 1
0001 1101 s 0 2 2 0001 0011 s 1 16 1
0000 0011 10s 0 2 3 0000 1100 0s 1 17 1
0000 0101 0001s 0 2 4 0000 1011 1s 1 18 1
0110 1s 0 3 1 0000 1011 0s 1 19 1
0001 0001 1s 0 3 2 0000 1010 1s 1 20 1
0000 0011 01s 0 3 3 0000 1010 0s 1 21 1
0110 0s 0 4 1 0000 1001 1s 1 22 1
0001 0001 0s 0 4 2 0000 1001 0s 1 23 1
0000 0101 0010s 0 4 3 0000 1000 1s 1 24 1
0101 1s 0 5 1 0000 0001 11s 1 25 1
0000 0011 00s 0 5 2 0000 0001 10s 1 26 1
0000 0101 0011s 0 5 3 0000 0001 01s 1 27 1
0100 11s 0 6 1 0000 0001 00s 1 28 1
0000 0010 11s 0 6 2 0000 0100 100s 1 29 1
0000 0101 0100s 0 6 3 0000 0100 101s 1 30 1
0100 10s 0 7 1 0000 0100 110s 1 31 1
0000 0010 10s 0 7 2 0000 0100 111s 1 32 1
0100 01s 0 8 1 0000 0101 1000s 1 33 1
0000 0010 01s 0 8 2 0000 0101 1001s 1 34 1
0100 00s 0 9 1 0000 0101 1010s 1 35 1
0000 0010 00s 0 9 2 0000 0101 1011s 1 36 1
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 66 页共 99页
0010 110s 0 10 1 0000 0101 1100s 1 37 1
0000 0101 0101s 0 10 2 0000 0101 1101s 1 38 1
0010 101s 0 11 1 0000 0101 1110s 1 39 1
0010 100s 0 12 1 0000 0101 1111s 1 40 1
0001 1100 s 0 13 1 0000 011 escape
0001 1011 s 0 14 1
0001 0000 1s 0 15 1
0001 0000 0s 0 16 1
0000 1111 1s 0 17 1
0000 1111 0s 0 18 1
0000 1110 1s 0 19 1
0000 1110 0s 0 20 1
0000 1101 1s 0 21 1
0000 1101 0s 0 22 1
0000 0100 010s 0 23 1
0000 0100 011s 0 24 1
0000 0101 0110s 0 25 1
0000 0101 0111s 0 26 1
4.3.1.3 Escape 码
我们可以发现许多可能的事件并没有事件来表示它们。为了编码这些小概率事件,我
们用escape 编码方法。DCT 系数的escape 码用五种模式编码。其中第一到第三种模式在
short_video_header 为0 时使用,并且此时不使用可逆的变长码表;第四种在
short_video_header 为1 时使用;在使用可逆变长码表时,使用第五种编码模式。它们的解
码过程在下面描述。
模式一:ESC 后面跟0,ESC+“0”后面的码作为变长码编码(使用表4-1 和表4-
2),但是LEVEL的值在解码后被修改,用来给重建值LEVEL
s
,如下所示:
LEVEL
s
=sign(LEVEL
+
)×[abs(LEVEL
+
)+LMAX]
这里LEVEL
+
是变长解码后的值,LMAX 由表4-3和表4-4 获得(这两个表的意思
是当run为某个值时,可以用来查表4-1 和4-2 的最大的level值。
这个模式存在的意义如下:如果编码时,遇到某个码字,虽然它不能直接通过表4-1
和表4-2 来编码,但是通过将当前level 值减去当前run 对应的LMAX 后,就可以用表4
-1 和4-2 来编码了,因此解码之后需要加上LMAX。由于编码时,是对绝对值进行查表
得,因此符号位单独处理,所以有上面的获得LEVEL值的表达式。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 67 页共 99页
表 4-3 内部宏块的LMAX 值
LAST RUN LMAX LAST RUN LMAX
0 0 27 1 0 8
0 1 10 1 1 3
0 2 5 1 2-6 2
0 3 4 1 7-20 1
0 4-7 3 1 others N/A
0 8-9 2
0 10-14 1
0 others N/A
表4-4 帧间宏块的LMAX 值
LAST RUN LMAX LAST RUN LMAX
0 0 12 1 0 3
0 1 6 1 1 2
0 2 4 1 2-40 1
0 3-6 3 1 others N/A
0 7-10 2
0 11-26 1
0 others N/A
模式二:ESC后面跟10,ESC+“10”后面的码作为变长码编码(使用表4-1 和表4-
2),但是RUN 的值在解码后被修改,用来给定重建值RUN
s
,如下所示:
RUN
s
=RUN
+
+(RMAX+1)
其中,RUN
+
是变长解码后的值,RMAX 由表4-5 和表4-6 得到,这两个表的意思
是当level为某个值时,可以查表4-1 和4-2 进行编码的最大的run值。
这个模式存在的意义同模式一类似:即可能存在某些码字,虽然不能直接通过表4-1
和表4-2 来编码,但是通过将当前码字的run 减去当前level 值的(RMAX+1)后,就可以通
过查表来进行编码了,因此解码之后需要将得到的run值加上(RMAX+1)。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 68 页共 99页
表 4-5 内部宏块的RMAX 值
LAST LEVEL RMAX LAST LEVEL RMAX
0 1 14 1 1 20
0 2 9 1 2 6
0 3 7 1 3 1
0 4 3 1 4-8 0
0 5 2 1 others N/A
0 6-10 1
0 11-27 0
0 others N/A
表4-6 帧间宏块的RMAX 值
LAST LEVEL RMAX LAST LEVEL RMAX
0 1 26 1 1 40
0 2 10 1 2 1
0 3 6 1 3 0
0 4 2 1 others N/A
0 5-6 1
0 7-12 0
0 others N/A
模式三:ESC后面跟11,ESC+“11”后面的码作为定长码编码,这种模式下分别用1
比特编LAST,6 比特编RUN 和12 比特编LEVEL。为了避免和resync_marker 相同,分别
有一个标记比特插在12 比特的LEVEL 的前面和后面。编码表4-1 和4-2 中的码字禁止
使用此模式。RUN 和LEVEL的编码见表4-7 中(a)和(b)。
表 4-7 RUN和LEVEL定长码表
Code Run Code Level Code Level
000 000 0 forbidden -2048 forbidden -128
000 001 1 1000 0000 0001 -2047 1000 0001 -127
000 010 2 . . . .
‘’’’’ ‘’’’’’ 1111 1111 1110 -2 1111 1110 -2
‘’’’’’’ ‘’’’’’ 1111 1111 1111 -1 1111 1111 -1
111 111111 11 111 111 63 forbidden 0 forbidden 0
0000 0000 0001 1 0000 0001 1
0000 0000 0010 2 0000 0010 2
. . . .
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 69 页共 99页
0111 1111 1111 2047 0111 1111 127
a)RUN定长码表b) LEVEL定长码表c) 短头格式下 LEVEL
定长码表
模式四:第四种模式只在short_video_header 为1 时使用。在这种情形下,ESC后面跟
着15 比特定长码,其中1 比特编LAST,6 比特编RUN、8 比特编LEVEL。LEVEL的值从
“0000 0000”和“1000 0000”被保留而不使用,run和level的定长码表见见表4-7 a 和c。
4.3.2 反扫描
这一部分讲述了一维数据QFS[n]转换为二维数组PQF[v][u]的方法。其中,QFS[n]表示
变长解码输出端的数据,QF[v][u]表示反扫描的结果。(其中n 的范围从0 到63,u 和v 的
范围从0 到7)。
图 4-3 定义了三种扫描方式,究竟使用何种方式由下面决定。对于帧内宏块,如果
acpred_flag=0,对宏块中的所有块使用锯齿形扫描。否则DC 预测方向决定了块的扫描方
式,举例说明,如果DC 预测参考水平相邻块,那么使用垂直交替扫描;反之如果DC 预测参
考垂直相邻块,那么使用水平交替扫描。对所有其他形式的块,变换系数的8x8 块用锯齿形
扫描。
还有几种特殊情况需要考虑:
对于短头格式,所有块都是用锯齿形扫描。
在场模式下,如果vop 头中的码字alternate_vertical_scan_flag 为1 时,该vop 中
所有块使用垂直扫描。
0 1 2 3 10 11 12 13 0 4 6 20 22 36 38 52 0 1 5 6 14 15 27 28
4 5 8 9 17 16 15 14 1 5 7 21 23 37 39 53 2 4 7 13 16 26 29 42
6 7 19 18 26 27 28 29 2 8 19 24 34 40 50 54 3 8 12 17 25 30 41 43
20 21 24 25 30 31 32 33 3 9 18 25 35 41 51 55 9 11 18 24 31 40 44 53
22 23 34 35 42 43 44 45 10 17 26 30 42 46 56 60 10 19 23 32 39 45 52 54
36 37 40 41 46 47 48 49 11 16 27 31 43 47 57 61 20 22 33 38 46 51 55 60
38 39 50 51 56 57 58 59 12 15 28 32 44 48 58 62 21 34 37 47 50 56 59 61
52 53 54 55 60 61 62 63 13 14 29 33 45 49 59 63 35 36 48 49 57 58 62 63
图 4-3 -- (a) 水平交替扫描(b)垂直交替扫描(c) 锯齿形扫描
4.3.3 帧内宏块系数的预测
这一部分讲述了解码系数的预测过程。这个预测过程只在非短头格式下(即
short_video_header 等于0)的帧内宏块中进行。当短头格式情况下(即short_video_header 等于
1),或者此宏块不是内部宏块时,这个过程不使用。如果需要作预测,则DC预测肯定要做,
AC 预测做不做由ac_pred_flag 决定,当ac_pred_flag 等于1 时,需要做AC 预测;当
ac_pred_flag等于0 时,不需要做AC预测。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 70 页共 99页
4.3.3.1 DC 与AC 的预测方向
DC 与AC 的预测方向的自适应选择是基于被解码块周围的水平和垂直梯度的比较上
的。下图显示了被解码块周围的三个块。块“X”、“A”、“B”和“C”分别代表了当前块、
左边的块、左上角的块和上边的块。
A
B C D
X Y Macroblock
or or
图4-4 DC预测中使用的邻居块
先前解码块的DC系数的逆量化值F[0][0],用如下方法来确定DC和AC的预测方向:
if ( |FA[0][0] – FB[0][0]| < |FB[0][0] – FC[0][0]|)
predict from block C
else
predict from block A
如果A、B或C中任意块超出了VOP的边界或视频包的边界,或者它们不属于帧内编
码块,那么此块的F[0][0]用1024 作预测值。
4.3.3.2 自适应DC 系数预测
自适应DC预测使用左边预测块或者上面预测块的F[0][0]值来进行,究竟使用哪个取决
于上面得到的预测方向。
if (predict from block C)
QFX[0][0] = PQFX[0][0] + FC[0][0] // dc_scaler
else
QFX[0][0] = PQFX[0][0] + FA[0][0] // dc_scaler
dc_scaler 定义在下表4-8 中。这个过程对宏块中的每个块独立地重复,它们使用自身
的水平相邻块A和垂直相邻块C。
DC预测对亮度块和色差块是类似的。色差块使用的水平相邻块就是左边宏块的相应的
色差块;色差块使用的垂直相邻块就是上边宏块的相应的色差块。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 71 页共 99页
表 4-8 DC量化值同quantiser_scale之间的关系
Component:Type Dc_scaler for quantiser_scale range
1 through 4 5 through 8 9 through 24 >= 25
Luminance: Type1 8 2x quantiser_scale quantiser_scale +8 2 x quantiser_scale -16
Chrominance: Type2 8 (quantiser_scale +13)/2 quantiser_scale -6
4.3.3.3 自适应AC 系数预测
这个过程只有当ac_pred_flag为1时被使用,它指示了解码过程中使用AC预测。
先前编码块的第一行系数或第一列系数都用来预测当前块的系数。在一个块基准下,
DC 系数预测的最佳方向也作为AC 系数的最佳预测方向。因此在一个宏块内,预测每一个
块可以使用的方式是独立的。AC系数的预测如下图4-5 所示。
A
B
X
C D
or
Macroblock
Y
or
图 4-5 AC预测使用的邻居块及其系数
为了补偿在当前块AC系数预测中使用的水平相邻块和垂直相邻块的量化差别,比例缩
放是必须的。因此预测是修改的,以便当前块和预测块使用相同的量化器步长。定义如下:
如果块A被选为块的预测器,如下计算量化AC系数的第一列:
QFX[v][0] = PQFX[v][0] + (QFA[v][0] * QPA) // QPX v = 1 to 7
如果块C被选为块的预测器,如下计算量化AC系数的第一行:
QFX[0][u] = PQFX[0][u] + (QFC[0][u] * QPC) // QPX u = 1 to 7
如果预测块超出VOP 边界或视频包的边界,又或者它们不属于帧内宏块,那么所有预测系
数被假设为0。
4.3.3.4 QF[v][u]的饱和
从 DC和AC预测得到的量化系数要被限制在[-2048,2047]的范围之内,即:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 72 页共 99页
QF [v][u] =
2047 QF [v][u] > 2047
QF [v][u] -2048 £ QF [v][u] £ 2047
-2048 QF [v][u] < -2048
ì
ï
îï 
í
4.3.3.5 场模式下的预测
场模式下,当dct_type 等于1 时,亮度块数据的DCT 系数由同一场的的数据组成,见
图2-3。此时,帧内块的预测同帧模式下的情况是很类似的,只是用来作预测的邻居块有
点变化。场模式下ACDC预测使用的邻居块及其系数如图4-6 所示。
B
A X Y
C D
Field-Coded
Macroblock
Top field blocks
Bottom field
blocks
图4-6 场模式下ACDC预测使用的邻居块及其系数
可见,场模式下的预测同帧模式下几乎是完全一样的,只是预测块不一样,但是对解码
端来说,这一点是不可见的,我们完全可以把它看成是帧模式同样处理。
4.3.4 反量化
系数的二维数组QF[v][u],通过逆量化产生重建DCT系数。这个过程的本质是乘以量化
步长。量化步长有两种变化机制:一种是通过权矩阵改变一个块的量化步长,另一种使用尺
度因子在很少几个比特(和编码整个权矩阵相比)的花费下改变量化步长。
下图描述了逆量化的全部过程。通过适当的逆量化算法得到系数F‘’[v][u]后,经饱和
运算得到了F‘[v][u],最后进行错误匹配控制操作,得到最终的重建DCT系数 F[v][u]。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 73 页共 99页
Inverse
Quantisation
Arithmetic
Saturation
QF[v][u] F''[v][u] F'[v][u] F[v][u]
quant_scale_code
W[w][v][u]
Mismatch
Control
图 4-7 逆量化的过程
4.3.4.1 第一种反量化方法
第一种反量化方法,也就是MPEG 反量化方法,在quant_type 为1时被使用。短头格式
不使用这种反量化方法。
A) 帧内DC 系数
在帧内块中,F’’[0][0]通过将QF[0][0]乘以一个常量得到,可以用以下公式表示:
F’’[0][0] = dc_scaler* QF[0][0]
dc_scaler 在表4-8中定义,亮度块和色度块是分开定义的。
B) 其他系数
除了帧内块DC 系数的所有其它系数的反量化在这一部分讲述。这里使用两个权矩阵:
一个对帧内宏块使用,另一个对非帧内宏块使用。每一个矩阵都有缺省值,它们可以由用
户定义的矩阵代替。缺省的帧内宏块矩阵见前面的语义部分,
我们用W[w][v][u]表示权矩阵,这里w 取值为0 或者1,指示使用何种矩阵。W[0][v][u]
对帧内宏块使用;而W[1][v][u]对非帧内宏块使用。亮度和色度的quantiser_scale 值
由vop_quant,dquant,dbquant和quant_scale决定。它们的关系可以总结如下:
对非短头格式, quant 值初始化为VOP头中给出的vop_quant。对I-VOP或者P-VOP,
如果当前宏块存在dquant,则当前宏块的quantiser_scale 等于当前的quant 值加上
dquant 表示的差分值,然后将quant值更新为当前宏块的量化值。对B-VOP,同样quant
的初始值为vop_quant,如果当前宏块存在dbquant,则当前宏块的quantiser_scale 值
等于当前的quant值加上dbquant表示的差分值,然后quant值更新为当前宏块的量化值。
如果遇到resync_marker,则将video_packet_header 头中的quant_scale 值赋给quant。
对短头格式,有类似的结论,不再赘述。
下面的算式给出了从QF[v][u]建立F’’[v][u]的算术方法:
F' ' [v][u]=
((2 ´QF[v][u] +k ) ´W[w][v][u] ´quantiser _ scale) / 16, if QF[v][u] ¹ 0
where :
k = 0 intra blocks
Sign(QF[v][u]) non - intra blocks
ìíî
0, if QF[v][u] = 0 ì
í
î
4.3.4.2 第二种反量化方法
这一部分讲述了第二种反量化方法,也就是263 反量化方法,它在Quant_type 为0 时
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 74 页共 99页
使用。短头格式只能使用这种量化方法。
A) 帧内DC 系数反量化。短头格式时,dc_scaler 取固定值8;其它情况下,
dc_scaler 的定义见表4-8,亮度块和色度块的dc_scaler 时分别定义的。
F’’[0][0] = dc_scaler* QF[0][0]
B) 其他系数的反量化。量化参数quantiser_scale 是从1 到31 的整数,量化步
长是quantiser_scale 的两倍。
¢¢ =
=
´ + ´ ¹
´ + ´ - ¹
ì
í ï
î ï
F v u
QF v u
QF v u quantiser scale QF v u quantiser scale
QF v u quantiser scale QF v u quantiser scale
[ ][ ]
, [ ][ ] ,
( [ ][ ] ) _ , [ ][ ] , _
( [ ][ ] ) _ , [ ][ ] , _ .
0 0
2 1 0
2 1 1 0
if
if is odd,
if is even
F"[v][u]的符号由QF[v][u]决定,即
F"[v][u]: F"[v][u]= Sign(QF[v][u])´|F"[v][u]|
4.3.4.3 饱和
逆量化得到的系数要饱和到[-2048,2047]之间,即
ïî
ïí
ì
- < -
- £ £ -
- > -
=
+ +
+ +
+ +
bits_per_pixel 3 bits_per_pixel 3
bits_per_pixel 3 bits_per_pixel 3
bits_per_pixel 3 bits_per_pixel 3
2 ' '[ ][ ] 2
''[ ][ ] 2 ''[ ][ ] 2 1
2 1 ' '[ ][ ] 2 1
'[ ][ ]
F v u
F v u F v u
F v u
F v u
4.3.4.4 错误匹配控制
错误匹配控制只对第一种逆量化方法适用。错误匹配可以使用和下面等价的任意过程,
首先对块中饱和的重建系数F’[v][u]求和,然后考察这个值是奇数还是偶数。如果它是偶数,
那么系数F[7][7]将要被修正。
sum = F' [v][u]
u =0
u <8 å
v=0
v <8å
F[v][u] = F' [v][u] for all u, v except u = v = 7
F[7][7] =
F' [7][7] if sum is odd
F' [7][7] -1 if F' [7][7] is odd
F' [7][7] +1 if F'[7][7] is even
ì
í
î
ü
ý
þ
if sum is even
ì
í
ï
îï 
4.3.4.5 逆量化方法总结
总的来说,第一种逆量化方法可以用和下面的过程等价的任意方法:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 75 页共 99页
for (v=0; v<8;v++) {
for (u=0; u<8;u++) {
if (QF[v][u] == 0)
F’’[v][u] = 0;
else if ( (u==0) && (v==0) && (macroblock_intra) ) {
F''[v][u] = dc_scaler * QF[v][u];
} else {
if ( macroblock_intra ) {
F''[v][u] = ( QF[v][u] * W[0][v][u] * quantiser_scale * 2 ) / 16;
} else {
F''[v][u] = ( ( ( QF[v][u] * 2 ) + Sign(QF[v][u]) ) * W[1][v][u]
* quantiser_scale ) / 16;
}
}
}
}
sum = 0;
for (v=0; v<8;v++) {
for (u=0; u<8;u++) {
if ( F’'[v][u] > 2 bits_per_pixel + 3 - 1 ) {
F’[v][u] = 2 bits_per_pixel + 3 - 1;
} else {
if ( F’'[v][u] < -2 bits_per_pixel + 3 ) {
F’[v][u] = -2 bits_per_pixel + 3 ;
} else {
F’[v][u] = F'‘[v][u];
}
}
sum = sum + F’[v][u];
F[v][u] = F’[v][u];
}
}
if ((sum & 1) == 0) {
if ((F[7][7] & 1) != 0) {
F[7][7] = F'[7][7] - 1;
} else {
F[7][7] = F'[7][7] + 1;
}
}
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 76 页共 99页
4.3.5 逆 DCT变换
一旦DCT系数F[u][v]被恢复,那么就可以用逆DCT变换来获得逆变换值f[y][x],这些
只要被饱和到-256≤f[y][x]≤255。
对短头格式,由于不存在隔行模式,因此全部用帧DCT变换,就是一般的情况。
非短头格式时,如果使用隔行模式,并且dct_type 等于1,此时使用场DCT 变换,场
DCT变换的算法同帧DCT变换完全一样,只是输出的时候需要将按场组织的宏块转换为按
帧组织的宏块。
下面简单介绍一下DCT变换和逆变换的过程。
矩阵大小为NxN的二维DCT变换为:
F(u, v) = 2
N
C(u)C(v)
x = 0
N -1 å f (x,y)cos
(2x +1)up
y =0 2N
N-1 å cos
(2y +1)vp
2N
u, v, x, y = 0, 1, 2, ¼N-1
其中x, y 是原始域中的空间坐标
u, v 是变换域中的空间坐标
C(u), C(v) =
1
2
for u,v = 0
1 otherwise
ì
í
î
逆DCT变换定义为:
f (x, y) = 2
N u =0
N -1 å C(u)C(v)F(u,v)cos
(2x +1)up
v = 0 2N
N -1 å cos
(2y +1)vp
2N
如果每个像素为n 比特,则DCT 变换的输入为n+1 比特,逆DCT 变换的输出为n+1
比特。DCT变换后的DCT系数的长度为n+4 比特,动态范围为[-2n+3:+2n+3-1]。对我们来说
这里的n等于8。
NxN 的逆DCT变换的实现必须符合IEEE 的关于8x8的逆DCT变换的实现的标准,即
IEEE Standard Specification for the Implementations of 8 by 8 Inverse Discrete Cosine Transform,
Std 1180-1990, December 6, 1990,不过有下列修改:
1) IEEE 规范中的3.2 小节的item(1)中最后一句话被替换为:<<Data sets of 1
000 000 (one million) blocks each should be generated for (L=256, H=255),
(L=H=5) and (L=384, H=383). >>
2) IEEE 规范中的3.3 小节的text被替换为:<<For any pixel location, the peak
error shall not exceed 2 in magnitude. There is no other accuracy requirement
for this test.>>
3) Let F be the set of 4096 blocks Bi[y][x] (i=0..4095) defined as follows :
a) Bi[0][0] = i - 2048
b) Bi[7][7] = 1 if Bi[0][0] is even, Bi[7][7] = 0 if Bi[0][0] is odd
c) All other coefficients Bi[y][x] other than Bi[0][0] and Bi[7][7] are
equal to 0
For each block Bi[y][x] that belongs to set F defined above, an IDCT that claims
to be compliant shall output a block f[y][x] that as a peak error of 1 or less
compared to the reference saturated mathematical integer-number IDCT fíí(x,y).
In other words, | f[y][x] - fíí(x,y)| shall be <= 1 for all x and y.
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 77 页共 99页
NOTE 1 lause 2.3 Std 1180-1990 “Considerations of Specifying IDCT Mismatch Errors”
requires the specification of periodic intra-picture coding in order to control the accumulation of
mismatch errors. Every macroblock is required to be refreshed before it is coded 132 times as
predictive macroblocks. Macroblocks in B-pictures (and skipped macroblocks in P-pictures)
are excluded from the counting because they do not lead to the accumulation of mismatch
errors. This requirement is the same as indicated in 1180-1990 for visual telephony according
to ITU-T Recommendation H.261.
NOTE 2 Whilst the IEEE IDCT standard mentioned above is a necessary condition for the
satisfactory implementation of the IDCT function it should be understood that this is not
sufficient. In particular attention is drawn to the following sentence from subclause 5.4: “Where
arithmetic precision is not specified, such as the calculation of the IDCT, the precision shall be
sufficient so that significant errors do not occur in the final integer values.”
逆 DCT变换的过程这里不再详述,需要实现这个的可以去参考这个标准。
在实际应用中一般通过两次1-D IDCT变换来完成2-D IDCT变换,这种方法通常被称
为行-列法。
一般来说,后者在结构上的对称性更好,并且可以重复使用硬件资源,所以在我们的芯
片设计选用一种行-列法来进行IDCT单元的结构研究。
二维IDCT可以分解成二次一维IDCT运算,如以下公式。
在结构上,上两式所定义的运算使用了相同的运算“核”(如以下公式所示), 它们具有
相似性。因此利用三角函数的各种关系,可以得到“核”的快速算法。
其中,
N
m
m 2
(2 1)p
q
+
=
为了便于理解,可将快速算法表示成蝶形图,如下图。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 78 页共 99页
x 0
x 1
x 2
x 3
x 4
x 5
x 6
x 7
X(0)
X(7)
X(3)
X(4)
X(1)
X(6)
X(2)
X(5)
d 1 = 0 .5 d2i = 0.5(1+ di ) d2i+1 = 0.5(1- di )
2d
2d1
2d1
d1
2d2
d3
2d3
d2
d5
d4
d7
d6
-
-
第一组蝶形运算第二组蝶形运算第三组蝶形运算
将对模块进行一维IDCT变换的结果存储起来,转置输出,再进行一次IDCT变换,即
为相应的二维IDCT变换。
一维 IDCT 核
转置单元
1 2
3
5 4
6
7 8
图 4-8 折叠结构的二维IDCT 单元
一行数据( 一行有8 个像素数据) 在该单元中的处理流程是:1—>2—>3—>4—>
5—>6—>7—>8。
4.4. 运动补偿解码
运动补偿解码过程包括,根据从码流中解析到的运动矢量的数据得到当前宏块的运动矢
量(可能不止一个),然后根据当前宏块的运动矢量,从参考帧中找出相应的参考宏块。如果
运动矢量不是整象数值,还需要通过内插来获得参考宏块。
4.4.1 非整象素运动矢量的像素内插过程
非整象素运动矢量下的像素内插过程用于逐行模式下16x16或者8x8的帧类型的块或者
场模式下16x8 的场类型的块。内插过程分别用在重建参考帧的亮度块和色度块中。
Quarter_sample 的值定义在vol 头结构中,rounding_control 的值根据vop 头结构中的
vop_rounding_type来的。对隔行图像,半像素或者四分之一像素值如果在垂直方向需要内插,
使用的是同一场中的连续的行。场预测运动矢量是用帧坐标给出来的,因此垂直方向运动矢
量的坐标间隔为2。
4.4.1.1半像素内插
半像素内插过程只用在半像素运动估计模式下,即quarter_sample等于0 时。这时,半
像素值用定义在图4-9 中的双线性内插过程得到。其中,rounding_control值是根据vop头
中的vop_rouding_type得到的。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 79 页共 99页
+ +
+ +
+ Integer pixel position
Half pixel position
A B
C D
a b
c d
a = A,
b = (A + B + 1 - rounding_control) / 2
c = (A + C + 1 - rounding_control) / 2,
d = (A + B + C + D + 2 - rounding_control) / 4
图4-9 –半像素搜索的内插方案
4.4.1.2四分之一像素内插
这一节中定义的半像素内插和四分之一像素内插的过程只用在四分之一像素模式下,即
quarter_sample 等于1 时。另外,这个过程只用在一个VOP 中的亮度部分;对VOP 中色度
部分的运动补偿,相应的运动矢量首先被舍入到半像素位置,见表4-13,然后使用上面的
4.4.1.1 节定义的双线性内插过程。
在四分之一像素模式下,由当前预测块的解码运动向量定义的位于参考帧中的大小为
MxN 的参考块,如果需要内插,即当前运动矢量不是整象素,则一个大小为(M+1)x(N+1)
的参考宏块会从参考帧取出来用于内插过程,这参考块的顶点由当前运动矢量决定,具体细
节后面再说。然后这个块需要以块边界为对称轴,往各个方向通过镜像扩展三个像素,如图
4-10 所示:
图 4-10– 块边界镜像扩展
接着,半像素值和1/4 像素值(如果需要的话)就从这个扩展的参考块中通过下面的两步
得到。
1. 半像素值的计算。
半像素值通过水平滤波(图4-11中ai)和接下来的垂直滤波(图4-11中b和c)两步得到
的(如图4-11)。两个方向的滤波都是用一个8 抽头的FIR 抽样滤波器,描述如下:
(CO1[4] ,CO1[3],CO1[2],CO1[1],CO1[1],CO1[2] ,CO1[3] ,CO1[4])/256
滤波器系数使用的是:CO1[1..4]= [160, -48, 24, -8]
block
boundary
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 80 页共 99页
X-4,-4 X-3,-4 X-2,-4 X-1,-4 o X+1,-4 X+2,-4 X+3,-4 X+4,-4
a-3
X-4,-3 X-3,-3 X-2,-3 X-1,-3 o X+1,-3 X+2,-3 X+3,-3 X+4,-3
a-2
X-4,-2 X-3,-2 X-2,-2 X-1,-2 o X+1,-2 X+2,-2 X+3,-2 X+4,-2
a-1
X-4,-1 X-3,-1 X-2,-1 X-1,-1 o X+1,-1 X+2,-1 X+3,-1 X+4,-1
bo co
X-4,+1 X-3,+1 X-2,+1 X-1,+1o X+1,+1 X+2,+1 X+3,+1 X+4,+1
a+1
X-4,+2 X-3,+2 X-2,+2 X-1,+2o X+1,+2 X+2,+2 X+3,+2 X+4,+2
a+2
X-4,+3 X-3,+3 X-2,+3 X-1,+3o X+1,+3 X+2,+3 X+3,+3 X+4,+3
a+3
X-4,+4 X-3,+4 X-2,+4 X-1,+4o X+1,+4 X+2,+4 X+3,+4 X+4,+4
x: integer sample position ; o: Half sample position
a CO j X X rounding control i j i j i
j
= × +
æ
è ç
ö
ø ÷
+ -
æ
è çç
ö
ø ÷÷
- +
= å
1 128 256
1
4
[ ] ( ) _ / , ,
b CO j X X rounding control j j
j
= × +
æ
è ç
ö
ø ÷
+ -
æ
è çç
ö
ø ÷÷
- - - +
= å
1 128 256 1 1
1
4
[ ] ( ) _ / , ,
c CO j a a rounding control j j
j
= × +
æ
è ç
ö
ø ÷
+ -
æ
è çç
ö
ø ÷÷
- +
= å
1 128 256
1
4
[ ] ( ) _ /
图 4-11 –1/4像素模式下的半像素内插(FIR滤波)
通过水平和垂直滤波得到的值必须限制在范围[0, 255]之间。Rounding_control 的值是用
过定义在vop头中的vop_rounding_type得到的。
2. 1/4 像素值的计算
如果需要得到1/4 像素的值,则需要在上面定义的滤波过程后面再加上一个半像素内
插的过程。这里的半像素内插使用的是4.4.1.1 中定义的双线性内插。
4.4.2 一般的运动向量解码过程
为了解码运动向量(MVx,MVy),要通过变长码解码(VLD)从码流中抽取差分运动
向量(MVDx,MVDy),然后把它加到运动向量的预测值(Px,Py)上,得到最终的运动
向量。所以本质上来说,除了如何计算运动向量的预测值过程不一样,得到差分运动向量的
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 81 页共 99页
过程我们还是可以基本统一的。一般的运动向量的解码过程与下面的过程等价。下面的所有
计算都是以半像素为单位的。请注意,如果使用了1/4 像素模式运动估计
(quarter_sample==1),则最后的结果仍然以半像素为单位进行表示,此时,最后的绝对值将
没有必要一定是整数了(这点要特别注意)。这个过程被称为一般过程意味着它对隔行/逐行模
式下的P和B-VOP都是适用的,只是预测向量的产生是不同的。对短头格式,fcode恒等于
1。
r_size = vop_fcode - 1
f = 1 << r_size
high = ( 32 * f ) - 1;
low = ( (-32) * f );
range = ( 64 * f );
if ( (f == 1) || (horizontal_mv_data == 0) )
MVDx = horizontal_mv_data;
else {
MVDx = ( ( Abs(horizontal_mv_data) - 1 ) * f ) + horizontal_mv_residual + 1;
if (horizontal_mv_data < 0)
MVDx = - MVDx;
}
if ( (f == 1) || (vertical_mv_data == 0) )
MVDy = vertical_mv_data;
else {
MVDy = ( ( Abs(vertical_mv_data) - 1 ) * f ) + vertical_mv_residual + 1;
if (vertical_mv_data < 0)
MVDy = - MVDy;
}
if(quarter_sample==1) {
MVDx = MVDx / 2.0;
MVDy = MVDy / 2.0;
}
MVx = Px + MVDx;
if ( MVx < low )
MVx = MVx + range;
if (MVx > high)
MVx = MVx - range;
MVy = Py + MVDy;
if ( MVy < low )
MVy = MVy + range;
if (MVy > high)
MVy = MVy - range;
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 82 页共 99页
码流中的参数如重建的差分运动向量MVDx和MVDy要限定在范围[low:high]内。另
外,重建的运动向量MVx和MVy的范围也要在[low:high]内。而允许范围则是依赖于参数
vop_fcode,如下面表4-9所示:
表 4-9 –运动矢量的范围
vop_fcode_forward
or
vop_fcode_backward
motion vector range in
halfsample units
[low:high]
motion vector range in
halfsample units
(quarter_sample==1)
[low:high]
1 [-32,31] [-16,15.5]
2 [-64,63] [-32,31.5]
3 [-128,127] [-64,63.5]
4 [-256,255] [-128,127.5]
5 [-512,511] [-256,255.5]
6 [-1024,1023] [-512,511.5]
7 [-2048,2047] [-1024,1023.5]
变量r_size, f, MVDx, MVDy, high , low 和 range 都是临时变量,它们在本文的剩余部分
中不再被使用。参数horizontal_mv_data, vertical_mv_data, horizontal_mv_residual and
vertical_mv_residual 是从码流中提取恢复而得的参数。其中horizontal_mv_data 为运动向量
水平分量数据,horizontal_mv_residual为水平运动向量残差,vertical_mv_data 为运动向量垂
直分量数据,vertical_mv_residual 为垂直运动向量残差。变量vop_fcode 指的是
vop_fcode_forward 或vop_fcode_backward,它们依各自的预测模式从码流中恢复。P-VOP
只有向前模式,而B-VOP则同时还有向后模式。
如果当前宏块是场运动补偿宏块,那么两个场的运动向量可以使用同一个预测运动向量
(Px,Py)。在垂直方向,场运动矢量的差分值用的是场坐标,而PY 用的是帧坐标,因此
场运动矢量的绝对值可以由下面的式子得到:
MVy = 2*( MVDyfield + PY / 2 )
4.4.3 无限制运动补偿
只有在非短头格式情况下(short_video_heaer==0),才允许使用无限制运动补偿,即运动
矢量允许指到参考帧的外面。无限制运动补偿是通过将边界像素值向各个方向扩展16 个像
素来实现的。
在 1/4 像素模式下,如果用来内插的样值点位于参考帧的外面,则在使用边界镜像扩
展前首先使用边界值扩展。
4.4.4 逐行模式P-VOP中的向量解码过程和运动补偿
一个帧间宏块可以只有一个运动矢量;也可以有四个运动矢量,每个亮度块都对应一个
运动矢量,这种模式也被称为四矢量模式。究竟是使用一个运动矢量还是四个运动矢量由码
流中的mcbpc变长码字决定,准确来说是由mcbpc给出的mb_type决定。当mb_type等于0
或1 时,只有一个运动矢量,当mb_type等于1 时,有四个运动矢量。
为了解码运动向量,运动向量预测值的水平和垂直分量分别使用从已解码的相邻宏块或
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 83 页共 99页
块得到的候选运动向量(MV1, MV2, MV3)通过中值滤波计算出来。每一个块的候选预测器的
空间位置如图4-12所示。当整个宏块使用一个运动向量时,使用图4-12 中的“左上”情
形;当使用视频短头格式时,整个宏块只由一个运动矢量。
图 4-12 宏块中每一个块的候选运动向量预测器MV1,MV2 和MV3 的定义
候选预测器的取值必须符合下面四个规则:
第一, 如果候选预测器所在的邻居宏块超出当前VOP 边界或者当前视频包(video
packet)边界,它被认为是不合法的。在短头格式下,如果它超出当前GOB
的边界(gob_header_enmpty等于0)时,也被认为是不合法的。
第二, 如果有且仅有一个候选预测器不合法,那么它被设定为0。
第三, 如果有且仅有两个候选预测器不合法,它们被设定为第三个候选预测器的值。
第四, 如果所有三个候选预测器都不合法,那么它们都被设定为0。
三个候选运动向量的中值作为预测运动向量,即作Px 和Py:
Px Median MV x MV x MV x
Py Median MV y MV y MV y
=
=
( , , )
( , , )
1 2 3
1 2 3
举例来说,如果MV1 = (-2, 3)、MV2 = (1, 5)和MV3 = (-1, 7),那么Px = -1,Py = 5。最
终的运动向量使用前面所述数的一般运动向量的解码过程得到。
如果使用了四矢量模式,每一个向量对应宏块中四个亮度块的一个。色度块的运动矢量
用的是同一个,它在码流中是不传输的。它的值MVDCHR可以用下面的方法得到:
如果当前宏块只有一个运动矢量,记作(MVx, MVy)。如果是1/4 像素模式,首先将
运动矢量的两个分量除以2,得到MVx’ = MVx / 2,MVy’=MVy / 2。注意用的是“/”。然
后将所得结果再除以4,此时得到得结果是整象素为单位的色度块的运动矢量,除法的结果
分为整数部分和小数部分,整数部分不变,小数部分,去查下面的相应的表决定最终的取值。
例如小数部分为1/4,查表4-13,得到的结果为1/2;小数部分为3/16,查表4-10
可以得到应该取1/2,这里都是整像素单位。
如果当前宏块有四个运动矢量,如果是1/4 像素模式,首先将各个分量除以2,用的
除法是“/”。然后将水平分量和垂直分量分别求和除以16,这样得到的是整象素为单位的
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 84 页共 99页
色度块的运动矢量。同样按照上文提到的查表过程修改小数部分,得到最终的结果。对色度
分量的内插,使用的是双线性内插而不是使用滤波器,不管当前是不是1/4 像素模式都是
如此。
表 4-10 – 1/16像素分辨率的色度矢量分量值的修改
sixteenth pixel position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //16
resulting position 0 0 0 1 1 1 1 1 1 1 1 1 1 1 2 2 //2
表 4-11 – 1/12像素分辨率的色度矢量分量值的修改
twelfth pixel position 0 1 2 3 4 5 6 7 8 9 10 11 //12
resulting position 0 0 0 1 1 1 1 1 1 1 2 2 //2
表 4-12 – 1/8像素分辨率的色度矢量分量值的修改
eighth pixel position 0 1 2 3 4 5 6 7 //8
resulting position 0 0 1 1 1 1 1 2 //2
表 4-13 -- 1/4像素分辨率的色度矢量分量值的修改
fourth pixel position 0 1 2 3 //4
resulting position 0 1 1 1 //2
在得到亮度块和色度块的运动矢量后,接着就是根据这些运动矢量从参考帧中取出需要
的宏块或块,并对这些宏块或块作相应的内插(如果需要的话)得到最终的参考宏块。这个过
程在这里就不详细描述了,在看到后面B帧解码过程,和场模式下运动矢量的解码过程时,
可能会对这个过程有更深的理解。
4.4.5 时域预测结构
前向参考VOP 定义为过去的最近的已解码的I-VOP或P-VOP(vop_coded == 1),后向参考
VOP被定义为将来的最近的已解码的I-VOP或P-VOP,此时忽略“vop_coded”的值。
一个目标P-VOP用前向参考VOP作预测。
一个目标B-VOP可以参考:
l 前向和/或后向参考VOP,如果后向参考VOP的“vop_coded == 1”
l 只能参考前向VOP,如果后向参考VOP的“vop_coded==0”
时域预测结果如图4-13 所描述:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 85 页共 99页
Object disappears
I0 P1 P2 P3 B4 P5 B6 P7 (vop_coded = 0)
图4-13 – 时域预测结构
4.4.6 逐行模式下B-VOP的向量解码和运动补偿过程
在 B-VOP 中有三种类型的运动向量,分别被称作16×16 的向前向量,16×16 的向后
向量和直接模式的delta 向量。向量的解码和相应的向量预测器有关。差分向量基本解码过
程同上述一般运动向量的差分向量的过程完全相同,除了直接模式的delta 向量的f_code总
是取1。重建的运动向量是差分运动向量加上相应的预测运动向量。delta 向量的预测运动向
量永远被设置为0,而前向和后向运动向量有着自己各自对应的预测器(这些预测器的值在
每一个宏块行开始的时候被重置为0)。这些预测器在以下三种情形的时候被更新:
l 当解码完一个前向模式的宏块后,前向预测器(只有前向预测器)的值被设置为已
解码的前向运动向量的值;
l 当解码完一个后向模式的宏块后,后向预测器(只有后向预测器)的值被设置为已
解码的后向运动向量的值;
l 当解码完一个双向模式的宏块后,前向和后向预测器分别使用相应类型的解
码向量(前向或后向)来更新。
4.4.6.1 基本的运动补偿过程
所有ISO/IEC14496 的运动补偿技术都是基于参考图象ref[x][y]的尺寸为(width,height)
的预测块pred[x][y]的形成。当前宏块(或块)在参考VOP 中的坐标是(x,y),已经解得的
半象素精度的运动向量为(dx_halfpel,dy_halfpel)。运动补偿的一般过程由以下的伪码得到。
在1/4 像素模式下,预测块的产生见4.4.1.2 小节。
其中component_width()和component_height()函数给出了当前VOP的宽度和高度。实际
上也就是VOL头中的video_object_layer_width和video_object_layer_height 的值。
/***************************************************************************
* 这个函数用来在参考帧中取出坐标为(x,y)的样点值
* 如果(x,y)超出帧边界,则使用边界值代替,这个函数实际上也就是实现了对无限制运动补偿的支持
**************************************************************************/
clip_ref(ref, x, y)
{
return(ref[MIN(MAX(x, 0), component_width(ref) - 1)] //参考采样坐标的确定
[MIN(MAX(y, 0), component_height(ref) - 1)]);
}
mc(pred, /* prediction block */
ref, /* reference component */
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 86 页共 99页
x, y, /* ref block coords for MV=(0, 0) */
width, height, /* reference block dimensions */
dx_halfpel, dy_halfpel, /* half-pel resolution motion vector */
rounding, /* rounding control (0 or 1 ) */
pred_y0, /* field offset in pred blk (0 or 1) 场模式下参数
对当前预测块的顶场还是底场进行预测的标志,顶场时为1
底场为0 */
ref_y0, /* field offset in ref blk (0 or 1) 场模式下参数
使用参考帧的顶场还是底场作为预测的标志,顶场为0,底场为1*/
y_incr) /* vertical increment (1 or 2)
垂直分辨率,场模式为2,帧模式为1 */
{
/***************************************************************
* dx,dy实际上给出了用来作内插的参考宏块的顶点坐标(整象素)
* 这里将帧模式和场模式统一起来进行考虑的
***************************************************************/
dx = dx_halfpel >> 1;
dy = y_incr * (dy_halfpel >> y_incr);
/**************************************************************
*下面通过判断x方向和y方向需不需要进行内插分为四种情况进行考虑
*也是将帧模式和场模式统一起来考虑的
***************************************************************/
if (dy_halfpel & y_incr) {//y方向需要插值
if (dx_halfpel & 1) {//x方向需要插值,y方向需要插值(第一种情况)
for (iy = 0; iy < height; iy += y_incr) {
for (ix = 0; ix < width; ix++) {
x_ref = x + dx + ix;
y_ref = y + dy + iy + ref_y0;
pred[ix][iy + pred_y0] =
(clip_ref(ref, x_ref + 0, y_ref + 0) +
clip_ref(ref, x_ref + 1, y_ref + 0) +
clip_ref(ref, x_ref + 0, y_ref + y_incr) +
clip_ref(ref, x_ref + 1, y_ref + y_incr) +
2 - rounding) >> 2;
}
}//第一种情况结束
} else {x方向不需要插值,y方向需要插值(第二种情况)
for (iy = 0; iy < height; iy += y_incr) {
for (ix = 0; ix < width; ix++) {
x_ref = x + dx + ix;
y_ref = y + dy + iy + ref_y0;
pred[ix][iy + pred_y0] =
(clip_ref(ref, x_ref, y_ref + 0) +
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 87 页共 99页
clip_ref(ref, x_ref, y_ref + y_incr) +
1 - rounding) >> 1;
}
}
}//第二种情况结束
} else {//y方向不需要插值
if (dx_halfpel & 1) { //x方向需要插值,y方向不需要插值(第三种情况)
for (iy = 0; iy < height; iy += y_incr) {
for (ix = 0; ix < width; ix++) {
x_ref = x + dx + ix;
y_ref = y + dy + iy + ref_y0;
pred[ix][iy + pred_y0] =
(clip_ref(ref, x_ref + 0, y_ref) +
clip_ref(ref, x_ref + 1, y_ref) +
1 - rounding) >> 1;
}
}//第三种情况结束
} else {//y方向不需要插值,x方向也不需要插值(第四种情况)
for (iy = 0; iy < height; iy += y_incr) {
for (ix = 0; ix < width; ix++) {
x_ref = x + dx + ix;
y_ref = y + dy + iy + ref_y0;
pred[ix][iy + pred_y0] =
clip_ref(ref, x_ref, y_ref);
}
}//第四种情况结束
}
}
}
4.4.6.2 前向模式
这种模式下只有前向运动向量(MVFx,MVFy)。预测块Pf_Y, Pf_U和Pf_V从前向参考VOP
中,ref_Y_for 是前向亮度参考,ref_U_for 和ref_V_for 是前向色度参考,得到预测块的方法
如下:
mc(Pf_Y, ref_Y_for, x, y, 16, 16, MVFx, MVFy, 0, 0, 0, 1);
mc(Pf_U, ref_U_for, x/2, y/2, 8, 8, MVFx_chro, MVFy_chro, 0, 0, 0,1);
mc(Pf_V, ref_V_for, x/2, y/2, 8, 8, MVFx_chro, MVFy_chro, 0, 0, 0,1);
其中,(MVFx_chro, MVFy_chro)是通过将亮度分量的运动矢量除以2,然后在基于表4-13
得到的。这里的mc 函数在4.4.6.1 中定义的。对1/4 像素模式,首先将亮度运动矢量除以
2(用截断除法/),然后将按半像素进行处理。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 88 页共 99页
4.4.6.3 后向模式
这种模式下只有后向运动向量(MVBx, MVBy)。预测块Pb_Y, Pb_U 和Pb_V 从后向参考
VOP 中得到,ref_Y_back 是亮度参考,ref_U_back 和ref_V_back是色度参考,得到预测块
的过程如下:
mc(Pb_Y, ref_Y_back, x, y, 16, 16, MVBx, MVBy, 0, 0, 0, 1);
mc(Pb_U, ref_U_back, x/2, y/2, 8, 8, MVBx_chro, MVBy_chro, 0, 0, 0,1);
mc(Pb_V, ref_V_back, x/2, y/2, 8, 8, MVBx_chro, MVBy_chro, 0, 0, 0,1);
其中,(MVBx_chro, MVBy_chro)是通过将亮度分量的运动矢量除以2,然后在基于表4-13
得到的。这里的mc 函数在4.4.6.1 中定义的。对1/4 像素模式,首先将亮度运动矢量除以
2(用截断除法/),然后将按半像素进行处理。
4.4.6.4 双向模式
这种模式下,既有前向运动向量(MVFx,MVFy),也有后向运动向量(MVBx, MVBy)。预
测块Pi_Y, Pi_U和Pi_V由前向和后向参考帧通过前向预测和后向预测,再将这两个预测值
求平均得到的,如下所示:
mc(Pf_Y, ref_Y_for, x, y, 16, 16, MVFx, MVFy, 0, 0, 0, 1);
mc(Pf_U, ref_U_for, x/2, y/2, 8, 8, MVFx_chro, MVFy_chro, 0, 0, 0,1);
mc(Pf_V, ref_V_for, x/2, y/2, 8, 8, MVFx_chro, MVFy_chro, 0, 0, 0,1);
mc(Pb_Y, ref_Y_back, x, y, 16, 16, MVBx, MVBy, 0, 0, 0, 1);
mc(Pb_U, ref_U_back, x/2, y/2, 8, 8, MVBx_chro, MVBy_chro, 0, 0, 0,1);
mc(Pb_V, ref_V_back, x/2, y/2, 8, 8, MVBx_chro, MVBy_chro, 0, 0, 0,1);
Pi_Y[i][j] = (Pf_Y[i][j] + Pb_Y[i][j] + 1)>>1; i,j=0,1,2…15;
Pi_U[i][j] = (Pf_U[i][j] + Pb_U[i][j] + 1)>>1; i,j=0,1,2…8;
Pi_V[i][j] = (Pf_V[i][j] + Pb_V[i][j] + 1)>>1; i,j=0,1,2…8;
这里(MVFx_chro, MVFy_chro)和(MVBx_chro, MVBy_chro)是将亮度的前向和后向运动向量
除以2,然后基于表4-13 得到的。对1/4 像素模式,首先将亮度运动矢量除以2(用截断
除法/),然后将按半像素进行处理。
4.4.6.5 直接模式
这个模式是用直接的双向运动补偿,它通过最近的解码的I-VOP和P-VOP的运动矢量得到
当前B-VOP的前向和后向运动矢量。这是B-VOP中可能对8x8块使用运动向量的唯一模式。
每一个宏块只允许使用一个Δ运动向量。
1. 直接模式的运动向量的形成
直接模式的运动向量通过组合最近解码的I-VOP 或P-VOP 的相应位置的宏块
(co_located macroblock)的运动向量而得。这里相应位置的宏块我们定义最近解码的
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 89 页共 99页
I-VOP或P-VOP中同当前B-VOP中的宏块具有相同水平和垂直索引的宏块。这里的运
动向量都是基于8×8 的块的。当相应位置的宏块没有运动矢量的时候,设定此时运动
向量为0。
2. 直接模式下运动向量的计算
MVF = MV/3 + MVD
MVB = -(2MV)/3 if MVD is zero
Note: MVD is the delta vector given by MVDB
MVB = MVF-MV if MVD is nonzero
0 1 2 3
MV
图4-14 直接模式双向预测
图 4-14 给出了直接模式下运动向量的求法。前向运动向量和后向运动向量的计算包括时间
上的下一个I-VOP或P-VOP的配置块的线性调整,通过Δ运动向量(MVDx,MVDy)
来修正。前向和后向的运动向量分别为(MVFx[i],MVFy[i]), (MVBx[i],MVBy[i]), i = 0,1,2,3},
其半象素或1/4 象素精度的公式由下面给出:
MVFx[i] = (TRB x MVx[i]) / TRD + MVDx
MVBx[i] = (MVDx==0)? ((TRB - TRD) x MVx[i]) / TRD : MVFx[i] - MVx[i]
MVFy[i] = (TRB x MVy[i]) / TRD + MVDy
MVBy[i] = (MVDy==0)? ((TRB - TRD) x MVy[i]) / TRD : MVFy[i] - MVy[i]
i = 0,1,2,3.
这里{(MVx[i],MVy[i]), i = 0,1,2,3}是相应位置宏块的运动向量,TRB是时域参考中B-VOP
和上一个参考VOP 的时间差, TRD 是时域参考中B-VOP 的上一个参考VOP 和下一个参
考VOP之间的时间差(假设两个参考VOP之间是存在B-VOP和跳过VOP的。)
3. 直接模式中预测块的产生
亮度的运动补偿按照8×8 的块为单位来进行,生成预测块的过程也是按照上面的
mc 函数分别通过前向和后向运动向量计算得到相应的预测块,然后取平均所得。其实
这一个过程除了运动补偿是按照8×8 的块来进行之外和前面的双向模式是完全相同
的。注意,对1/4 像素模式,即便一个宏块的四个块使用同一个运动矢量,按块作运
动补偿与按宏块作运动补偿的结果可能是不一样的,造成这种情况的原因就是1/4 像
素模式需要对参考块作镜像扩展,见4.4.1.2小节。
对于色差块的运动补偿,其前向运动向量(MVFx_chro,MVFy_chro)是通过求4
个前向亮度运动向量之和然后除以2*4 计算得到,最后还要查表4-10 到表4-13取整
得到半采样位置。对1/4 像素模式,在求和前需要先除以2(截断除法/),然后再按上
面的过程处理。向后运动向量也是通过相同的方式产生。其余的过程和双向模式的色差
运动补偿过程完全相同。
4.4.6.6 跳过宏块的运动补偿
如果最近解码的I-VOP或者P-VOP是跳过的,那么当前的B宏块可以看作是具有零运动向
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 90 页共 99页
量的前向模式。如果码流中的参数modb 等于1,那么当前B宏块使用0 矢量的直接模式重
建。
4.4.7 隔行模式下P-VOP的向量解码和运动补偿
在隔行模式下,即interlaced=1 时,宏块层中有intrelaced_information(),它给出了是否作场
预测,以及在场预测下预测场的选择。如果field_prediction为1,则使用场预测,否则使用
帧预测。
4.4.7.1向量解码
向量解码使用4.4.2 小节中的一般的运动向量解码过程,计算P-VOP运动向量的每一个分
量的过程还是每一个分量从码流中获得的差分运动向量加上相同分量对应的候选预测向量。
其中差分运动向量为(MVDxf1,MVDyf1)和(MVDxf2,MVDyf2),分别对应于场预测
宏块的顶场和底场。接下来分三种情况来说明候选预测向量的产生过程:
情形1:如果当前宏块是场预测宏块,而且编码底邻居宏块中没有场预测宏块,那么候选预
测向量MV1,MV2,MV3由图4-15 来定义。如果候选块i不是在四矢量模式下,MVi 就
表示了该宏块的运动向量,如果候选块i在四矢量模式下,那么使用和当前宏块的左上角最
近的块运动向量。水平和垂直的预测由下式计算:
P Median MV x MV x MV x
P Median MV y MV y MV y
x
y
=
=
( , , )
( , , ).
1 2 3
1 2 3
对于已经得到的差分运动向量来说,两场使用相同的预测器,运动向量由下式计算而得:
MVx MVDx P
MVy MVDy P
MVx MVDx P
MVy MVDy P
f f x
f f y
f f x
f f y
1 1
1 1
2 2
2 2
2 2
2 2
= +
= +
= +
= +
* ( ( / ))
* ( ( / ))
这里的“/”是向0截断的整数除法。上面所描述的所有的运动向量都是用整数表示的,一
个单位表示半像素或者1/4 像素。垂直方向的场运动矢量的分量为偶数(在半像素或者1
/4 像素分辨率的帧坐标下)。如果MVyfi为2 的奇数倍(如-2,2,6),则需要作半像素或
者1/4 像素内插。当MVyfi为4 的整数倍(半像素模式下)或者8 的整数倍(1/4 像素模
式下),则垂直方向不需要作内插。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 91 页共 99页
MVf 1
MV1
MV2 MV3
8
8
16
16
or MVf 2
图 4-15 场预测宏块的运动向量预测示例(情形一)
情形2:如果当前宏块或块是帧预测宏块或帧预测块,而且编码的邻居宏块至少有一个是场
预测宏块,那么场预测宏块的候选预测向量由平均两场的运动向量来产生, (如图4-16
所示),平均后运动向量的小数部分应该映射成半象素精度或者1/4 象素的精度。最终预测
向量的每一个成分(Px,Py)是同一成分的候选预测向量的中值。运动向量由下式恢复:
MVx MVDx P
MVy MVDy P
x
y
= +
= + .
这里预测向量(Px,Py)的计算公式为:
( )
( )
P Median MV x Div Round MVx MVx MV x
P Median MV y Div Round MVy MVy MV y
x f f
y f f
= +
= +
1 2 3
1 2 3
1 2
1 2
, ( ), ,
, ( ), ,
Div2Round(x) 定义如下: Div2Round(x) = (x >> 1) | (x & 1).
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 92 页共 99页
MV1 MV
MV3
8
8
16
16
a field predicted
MB Div2Round(
MV2f1 +MV2f2)
图4-16 场预测宏块的运动向量预测示例(情形2)
情形3:假设当前的宏块是场预测块,而且编码的邻居宏块中至少有一个是场预测块。如果
候选块i 是场预测的,那么候选的预测向量MVi 将由平均两场的运动向量来产生,平均后
运动向量的小数部分应该映射成半象素精度或者1/4象素的精度。如果候选块i 既不是场预
测模式,也不是四矢量模式,那么MVi 就代表了该宏块的帧运动向量。如果候选块i 是四
矢量模式,这样就使用和当前宏块左上角最近的8×8 块的运动向量。这种情形可以由上面
两种情形结合起来得到。预测向量可以由下式来计算:
P Median MV x MV x MV x
P Median MV y MV y MV y
x
y
=
=
( , , )
( , , )
1 2 3
1 2 3
这里如果候选宏块是场预测模式,则:
MVi x Div Round MVx MVx
MVi y Div Round MVy MVy
f f
f f
= +
= +
2
2
1 2
1 2
( ),
( ),
对于从码流中恢复的差分运动向量,两场使用相同的预测向量,运动向量由下式恢复:
MVx MVDx P
MVy MVDy P
MVx MVDx P
MVy MVDy P
f f x
f f y
f f x
f f y
1 1
1 1
2 2
2 2
2 2
2 2
= +
= +
= +
= +
* ( ( / ))
* ( ( / ))
4.4.7.2预测块的产生
P-VOP 的运动补偿过程是使用上一节得到的运动矢量,通过调用函数
field_compensate_one_reference 来实现的。对1/4 像素模式,使用类似的过程,见4.4.2 小
节。其中参数top_field_ref,bottom_field_ref 和rounding_type 是由码流中的参数
forward_top_field_refrence, forward_bottom_field_refrence和vop_rounding_type分别得到的。
参考VOP的偶数行(0,2,4….)是顶场,奇数行(1,3,5…)是底场。
field_motion_compensate_one_reference(
luma_pred, cb_pred, cr_pred, /* Prediction component pel array */
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 93 页共 99页
luma_ref, cb_ref, cr_ref, /* Reference VOP pel arrays */
mv_top_x, mv_top_y, /* top field motion vector */
mv_bot_x, mv_bot_y, /* bottom field motion vector */
top_field_ref, /* top field reference */
bottom_field_ref, /* bottom field reference */
x, y, /* current luma macroblock coords */
rounding_type) /* rounding type */
{
//亮度块的顶场部分的计算
mc(luma_pred, luma_ref, x, y, 16, 16, mv_top_x, mv_top_y,
rounding_type, 0, top_field_ref, 2);
//亮度块的底场部分的计算
mc(luma_pred, luma_ref, x, y, 16, 16, mv_bot_x, mv_bot_y,
rounding_type, 1, bottom_field_ref, 2);
//色度块1顶场部分的计算
mc(cb_pred, cb_ref, x/2, y/2, 8, 8,
Div2Round(mv_top_x), Div2Round(mv_top_y),
rounding_type, 0, top_field_ref, 2);
//色度块2顶场部分的计算
mc(cr_pred, cr_ref, x/2, y/2, 8, 8,
Div2Round(mv_top_x), Div2Round(mv_top_y),
rounding_type, 0, top_field_ref, 2);
//色度块1底场部分的计算
mc(cb_pred, cb_ref, x/2, y/2, 8, 8,
Div2Round(mv_bot_x), Div2Round(mv_bot_y),
rounding_type, 1, bottom_field_ref, 2);
//色度块2底场部分的计算
mc(cr_pred, cr_ref, x/2, y/2, 8, 8,
Div2Round(mv_bot_x), Div2Round(mv_bot_y),
rounding_type, 1, bottom_field_ref, 2);
}
场模式下,色度块也是分顶场和底场分别计算的,每个色度块用到了两个运动矢量。
4.4.8 隔行模式下B-VOP的向量解码和运动补偿
对于隔行模式下的B-VOP,一个宏块可以存在下列编码方式:(1)直接编码(direct coding);
(2)16×16的运动补偿(包括前向,后向,双向模式)(3)场运动补偿(包括前向,后向
和双向)。当前正在编码的16×16 的宏块使用的运动向量精确到半象素或者1/4 象素精度。
色差向量由换算亮度向量来产生,对亮度分量除以2,然后查表4-13 对小数部分进行取舍。
(实际上也就是对亮度向量进行Div2Round 函数,1/4 像素模式下应该先对亮度分量除以
2(截断除法/)再使用上面的过程)。除了直接编码,其它编码模式都可以改变当前使用的
量化值,即码流中允许存在dbquant。直接模式下,不允许改变当前使用的量化值,即码流
中不能存在dbquant,使用的是前一个编码宏块的量化值。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 94 页共 99页
隔行模式下运动向量预测,使用了四个预测器(PMVs),如表4-14 所示:
表4-14 隔行模式B-VOP的预测运动向量
Function PMV
Top field forward 0
Bottom field forward 1
Top field backward 2
Bottom field backward 3
不同的宏块预测模式使用的预测器如表4-15 所示:
表4-15 隔行模式下B-VOP解码使用的的预测运动向量
Macroblock mode PMVs used PMVs updated
Direct none none
Frame forward 0 0,1
Frame backward 2 2,3
Frame bidirectional 0,2 0,1,2,3
Field forward 0,1 0,1
Field backward 2,3 2,3
Field bidirectional 0,1,2,3 0,1,2,3
一个宏块使用了预测器PMVs 后,预测器的运动向量值被设置为当前宏块的运动向量值。当
一个帧预测的宏块被解码后,相应方向的两个场预测器PMVs(顶场和底场)被设置为同一个
帧运动矢量。此时,帧模式下不会出现四矢量模式。这些PMVs 的值在每一行宏块开始被清
0。遇到跳过宏块和直接模式的宏块,预测器不能被清0。
基于帧的运动补偿的过程已经在4.4.6 中给出,这里不再讨论。场运动补偿模式下运动补偿
过程可以用“field_motion_compensate_one_reference”函数计算,这个函数在上面已经给出
来了。下面对场模式下各种模式分别讨论。
4.4.8.1 场前向模式
当 mb_type==”0001”,field_prediction==”1”时,使用场前向预测模式。PMV的更新和运动补
偿预测块的计算见下面的代码。其中luma_fwd_ref_VOP[][],cb_fwd_ref_VOP[][]和
cr_fwd_red_VOP[][]指的是前向参考的VOP。亮度块的顶点坐标由(x,y)给出,MVD[].x,
MVD[].y按照它们在码流中出现的顺序给出了当前宏块的运动矢量的差分值。
PMV[0].x = PMV[0].x + MVD[0].x;
PMV[0].y = 2 * (PMV[0].y / 2 + MVD[0].y);
PMV[1].x = PMV[1].x + MVD[1].x;
PMV[1].y = 2 * (PMV[1].y / 2 + MVD[1].y);
field_motion_compensate_one_reference(
luma_pred, cb_pred, cr_pred,
luma_fwd_ref_vop, cb_fwd_ref_vop, cr_fwd_ref_vop,
PMV[0].x, PMV[0].y, PMV[1].x, PMV[1].y,
forward_top_field_reference,
forward_bottom_field_reference,
x, y, 0);
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 95 页共 99页
4.4.8.2 场后向模式
当“mb_type ==001”和“field_prediction ==1”时,使用场后向模式。PMV的更新和运动补
偿预测块的计算见下面的代码。其中luma_bac_ref_VOP[][],cb_bad_ref_VOP[][]和
cr_bad_red_VOP[][]指的是后向参考的VOP。亮度块的顶点坐标由(x,y)给出,MVD[].x,
MVD[].y按照它们在码流中出现的顺序给出了当前宏块的运动矢量的差分值。
PMV[2].x = PMV[2].x + MVD[0].x;
PMV[2].y = 2 * (PMV[2].y / 2 + MVD[0].y);
PMV[3].x = PMV[1].x + MVD[1].x;
PMV[3].y = 2 * (PMV[3].y / 2 + MVD[1].y);
field_motion_compensate_one_reference(
luma_pred, cb_pred, cr_pred,
luma_bak_ref_vop, cb_bak_ref_vop, cr_bak_ref_vop,
PMV[2].x, PMV[2].y, PMV[3].x, PMV[3].y,
backward_top_field_reference,
backward_bottom_field_reference,
x, y, 0);
4.4.8.3 场双向模式
当“mb_type” ==“01”和“field_prediction”==“1”时,使用场双向预测模式。预测
宏块(luma_pred[][],cb_pred[][]和cr_pred[][])可以由下面的过程计算:
for (mv = 0; mv < 4; mv++) {
PMV[mv].x = PMV[mv].x + MVD[mv].x;
PMV[mv].y = 2 * (PMV[mv].y / 2 + MVD[mv].y);
}
//前向预测宏块的产生
field_motion_compensate_one_reference(
luma_pred_fwd, cb_pred_fwd, cr_pred_fwd,
luma_fwd_ref_vop, cb_fwd_ref_vop, cr_fwd_ref_vop,
PMV[0].x, PMV[0].y, PMV[1].x, PMV[1].y,
forward_top_field_reference,
forward_bottom_field_reference,
x, y, 0);
//后向预测宏块的产生
field_motion_compensate_one_reference(
luma_pred_bak, cb_pred_bak, cr_pred_bak,
luma_bak_ref_vop, cb_bak_ref_vop, cr_bak_ref_vop,
PMV[2].x, PMV[2].y, PMV[3].x, PMV[3].y,
backward_top_field_reference,
backward_bottom_field_reference,
x, y, 0);
//通过对前向和后向预测块求平均,得到当前宏块
for (iy = 0; iy < 16; iy++) {
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 96 页共 99页
for (ix = 0; ix < 16; ix++) {
luma_pred[ix][iy] = (luma_pred_fwd[ix][iy] +
luma_pred_bak[ix][iy] + 1) >> 1;
}
}
for (iy = 0; iy < 8; iy++) {
for (ix = 0; ix < 8; ix++) {
cb_pred[ix][iy] = (cb_pred_fwd[ix][iy] +
cb_pred_bak[ix][iy] + 1) >> 1;
cr_pred[ix][iy] = (cr_pred_fwd[ix][iy] +
cr_pred_bak[ix][iy] + 1) >> 1;
}
}
4.4.8.4 直接模式
当 mb_type==1 时,当前宏块是用直接模式预测。不过此时,直接模式预测即可以是逐
行的(见4.4.6.5),也可以是隔行的(在下面描述),需要进一步判断究竟是哪种模式。如果
后向参考VOP 中的相应位置的(co_located)宏块的field_prediction 标志为1,则当前宏块使
用隔行直接模式。注意,如果后向参考VOP 中的相应位置的宏块是跳过宏块(skiped)或
者是内部编码宏块,则使用逐行直接模式。其它情况下,使用隔行直接模式。
逐行直接模式是隔行直接模式的一个扩展。当前宏块的四个场运动矢量通过下列参数得来
的:后向参考VOP 中的前向场运动矢量,一个从码流中得到的运动矢量的差分值,当前
B-VOP中顶场或底场同前向和后向参考VOP中的顶场或底场的相对显示时间差。当前宏块
的四个场运动向量指的是:mvf[0](顶场前向运动向量),mvf[1](底场前向运动向量),
mvb[0](顶场后向运动向量),mvb[1](底场后向运动向量)。MV[i]是后向参考VOP的顶
场(i==0)和底场(i==1)运动矢量。两个场只使用一个delta 运动向量,MVD[0],这个
可以从码流中得到。MVD[0]解码时假定f_code等于0,不考虑此时vop头中的值。隔行
直接模式的预测块(luma_pred[][], cb_pred[][], cr_pred[][])通过下面的方法
得到:
/* 获得当前宏块的运动矢量*/
for (i = 0; i < 2; i++) {
mvf[i].x = (TRB[i] * MV[i].x) / TRD[i] + MVD[0].x;
mvf[i].y = (TRB[i] * MV[i].y) / TRD[i] + MVD[0].y;
mvb[i].x = (MVD[0].x == 0) ? /*本来为MVD[i]*/
(((TRB[i] - TRD[i]) * MV[i].x) / TRD[i]) :
mvf[i].x - MV[i].x);
mvb[i].y = (MVD[0].y == 0) ? /*本来为MVD[i]*/
(((TRB[i] - TRD[i]) * MV[i].y) / TRD[i]) :
mvf[i].y - MV[i].y);
} /* 本来没有这个} */
/* 获得当前宏块的前向预测块*/
field_motion_compensate_one_reference(
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 97 页共 99页
luma_pred_fwd, cb_pred_fwd, cr_pred_fwd,
luma_fwd_ref_vop, cb_fwd_ref_vop, cr_fwd_ref_vop,
mvf[0].x, mvf[0].y, mvf[1].x, mvf[1].y,
colocated_future_mb_top_field_reference,
colocated_future_mb_bottom_field_reference,
x, y, 0);
/* 获得当前宏块的后向预测块*/
field_motion_compensate_one_reference(
luma_pred_bak, cb_pred_bak, cr_pred_bak,
luma_bak_ref_vop, cb_bak_ref_vop, cr_bak_ref_vop,
mvb[1].x, mvb[1].y, mvb[1].x, mvb[1].y,
0, 1, x, y, 0);
/* 对前向预测块和后向预测块求平均得到当前宏块的预测块*/
for (iy = 0; iy < 16; iy++) {
for (ix = 0; ix < 16; ix++) {
luma_pred[ix][iy] = (luma_pred_fwd[ix][iy] +
luma_pred_bak[ix][iy] + 1) >> 1;
}
}
for (iy = 0; iy < 8; iy++) {
for (ix = 0; ix < 8; ix++) {
cb_pred[ix][iy] = (cb_pred_fwd[ix][iy] +
cb_pred_bak[ix][iy] + 1) >> 1;
cr_pred[ix][iy] = (cr_pred_fwd[ix][iy] +
cr_pred_bak[ix][iy] + 1) >> 1;
}
}
时间参考(TRB[i]和TRD[i]是用时间表示的场周期的距离,图4-17 给出了当i=0 时它们是
如何定义的(即B-VOP中的顶场情况)。底场时的定义是类似的。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 98 页共 99页
图 4-17 隔行直接模式
TRD[i]和TRB[i]的计算不仅依赖于当前场,参考场和帧之间的时间距离,还依赖于当前视频
是顶场在前还是底场在前。
TRD[i] = 2*(T(future)//Tframe - T(past)//Tframe) + d[i]
TRB[i] = 2*(T(current)//Tframe - T(past)//Tframe) + d[i]
其中,T(future), T(current)和T(past)从modulo_time_base和vop_time_increment 计算得到的
将来VOP,当前VOP和过去VOP的累计VOP时间,这里指的是显示顺序。Tframe 是帧周
期,由下式得到:
Tframe = T(first_B_VOP) - T(past_anchor_of_first B_VOP)
这里first_B_VOP指的是Video Object Layer 语法层次后面第一个B-VOP。关于Tframe的一
件很重要的事情是组成一个帧的连续长之间的时间间隔定义为0.5*Tframe。
d的值由表4-16 决定,它有下列参数决定:当前场的奇偶性(顶场还是底场),后向参
考VOP中的相应位置的宏块的参考场,B-VOP的VOP层中top_field_first参数的值。
表 4-16 -- d 参数的选择
后向参考VOP中相应位置宏
块的预测的参考场
top_field_first == 0 top_field_first == 1
Top field
reference
Bottom field
reference
Top field,
d[0]
Bottom field,
d[1]
Top field,
d[0]
Bottom field,
d[1]
0 0 0 -1 0 1
0 1 0 0 0 0
1 0 1 -1 -1 1
1 1 1 0 -1 0
第一列的参数指的是后向参考VOP的顶场预测使用的场的选择,0 表示用顶场预测,1 表示
用底场预测;第二列同第一列类似,指的是底场预测。第三列指的是当top_field_first等于0
时,即底场先于顶场被显示,计算顶场的时间参数时d[0]的取值;第四列同第三列类似,指
的是计算底场时时间参数d[1]的取值。第五列指的是当top_field_first等于1,即顶场先于底
TRD[i]
TRB[i]
MV[i]
mvf[i] mvb[i]
Past
Anchor
Current
VOP
Future
Anchor
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
ASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc
第 99 页共 99页
场被显示时,计算顶场的时间参数时d[0]的取值;第六列同第五列类似,指的是计算底场时
时间参数d[1]的取值。当隔行直接模式被使用时,vop_time_increment_resolution必须是大于
或等于每秒中的帧数的最小整数。在每一个VOP中,vop_time_increment给出了一秒中的单
独帧数。
[参考文献]
1. ISO/IEC JTC 1/SC 29/WG 11 N4350
2. ISO/IEC JTC1/SC 29/WG 11 N3904
3. ISO/IEC JTC 1/SC 29/WG 11 N 3056
4. 钟玉琢等,“基于对象的多媒体压缩编码国际标准-MPEG-4及其校验模型”,科学出版

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

MPEG4 协议详解相关推荐

  1. FFmpeg入门详解之87:HLS直播协议详解

    引言与效果演示 ----------------------------------------- FFmpeg431的官方地址已经无法打开, 我将ffmepg4.3.1的开发包和源码上传到了百度云: ...

  2. FFmpeg入门详解之102:HLS直播协议详解

    引言与效果演示 ----------------------------------------- FFmpeg431的官方地址已经无法打开, 我将ffmepg4.3.1的开发包和源码上传到了百度云: ...

  3. HTTP协议详解(真的很经典)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  4. Http 协议详解笔记

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...

  5. Http协议 详解(转载)

    http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分 ...

  6. ARP协议详解之ARP动态与静态条目的生命周期

    ARP协议详解之ARP动态与静态条目的生命周期 ARP动态条目的生命周期 动态条目随时间推移自动添加和删除. q  每个动态ARP缓存条目默认的生命周期是两分钟.当超过两分钟,该条目会被删掉.所以,生 ...

  7. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

    ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...

  8. HTTP协议详解 转自小坦克

    HTTP协议详解 转自小坦克 -- 有些文章是引用别人的,为了方便我以后或不再备注;引用目的是因为直接网摘里面的地址经常被重置,找不到原来的文章 当今web程序的开发技术真是百家争鸣,ASP.NET, ...

  9. nbns协议_网络协议详解1 - NBNS

    NetBIOS 简介 NetBIOS,Network Basic Input/Output System的缩写,一般指用于局域网通信的一套API,相关RFC文档包括 RFC 1001, RFC 100 ...

  10. 转:SSL 握手协议详解

    SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...

最新文章

  1. Java测试工具使用(1)--Junit
  2. windows2012挂linux盘阵,磁盘阵(IPSAN)挂载Windows和Linux测试过程.doc
  3. (MS SQL)如何实现相关文章功能(多关键字匹配)
  4. JZOJ 5476. 【NOIP2017提高组正式赛】奶酪
  5. [Java基础]生产者和消费者模式概述与案例分析
  6. 2020中国数字营销人才发展报告
  7. Qt界面美化 QSS
  8. 中兴侵权案败诉需赔 2.89 亿元;HTC 裁员 1500 人;Android P Beta 3 发布 | CSDN 极客头条...
  9. highcharts插件使用总结和开发中遇到的问题及解决办法
  10. SSIS 抽取Excel每个sheet页的数据
  11. python3 歌词文件krc转lrc
  12. 乔布斯全新采访曝光:吐槽微软,回应争议,还要把Mac扔出窗外,然而…
  13. QCustomPlot 1.0.1学习(5)-Sinc函数绘制
  14. 舒老师AK的hu测 T2. LX还在迷路(线段树+等差数列)
  15. 深度丨从零搭建推荐体系
  16. 蓝队应急响应之Linux篇
  17. RK3568触摸屏驱动调试总结
  18. Xcode的几个编译设置
  19. 小学计算机面试说课稿,教师资格面试小学说课稿:科技带给我们什么
  20. mysql.lib 是mtd mdd_MTD/MT/MDD/MD以及LIB/DLL之间的一些联系和问题

热门文章

  1. if else终结者——策略模式
  2. 关于yolo3的学习
  3. 做大做强肉牛产业,生物资产解决方案助力乡村振兴
  4. 【电子电路】RS485收发器两种典型电路
  5. 信息收集工具之hping安装和使用
  6. 使用Unity粒子特效的基本步骤
  7. uni-app项目(一)
  8. hua图软件 mac_10款Mac上设计师必备的设计绘图工具推荐和下载 | 玩转苹果
  9. 数据库基本操作和常用命令
  10. Js封装组件 + Slots插槽