第 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
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
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