设为首页 加入收藏

TOP

3.4.6 MPEG-4码表
2013-10-07 00:11:39 来源: 作者: 【 】 浏览:65
Tags:3.4.6 MPEG-4 码表

3.4.6  MPEG-4码表

MPEG-4标准提供了不同对象的语法码表,解码器可以根据码表的成分对视频流进行解码。MPEG-4标准的主要码表有视觉对象序列语法码表、视觉对象语法码表、视频对象层语法码表、视频对象平面语法码表、短头视频平面语法码表、复杂估计头语法码表、运动形状纹理语法码表、Sprite编码语法码表、宏块语法码表、MB二值形状编码语法码表、运动向量语法码表、交织信息语法码表、块层语法码表、静态纹理对象语法码表、网格对象语法码表、网格对象平面语法码表、网格运动语法码表、人脸对象语法码表、人脸对象平面语法码表等。本书只对视觉对象序列语法码表、视觉对象语法码表、视频对象层语法码表进行了介绍,其它码表读者可以参照MPEG-4标准文件。

视觉对象序列是视频流的最高语法结构,由视觉对象虚礼起始码开始,后面根着一个或多个视觉对象,然后以视觉对象结束符指示其结束。视觉对象序列语法码表如下:

VisualObjectSequence() 
{
visual_object_sequence_start_code/*
视频序列的开始。数值是000001B*/
profile_and_level_indication      /*
8位比特码,作为框架和级的指示器*/
while ( next_bits()==user_data_start_code)
{
user_data()
}
VisualObject()
visual_object_sequence_end_code/*
视频对象序列的结束。数值是000001B1*/
}
视觉对象由起始码开始,后面接着框架和级标识和视觉对象标识,然后是视频对象、
静态文家对象、网格对象或人脸对象。视觉对象语法码表如下:
VisualObject()
{
visual_object_start_code/*
视觉对象的开始。数值是000001B5*/
is_visual_object_identifier/*
1位比特码,当数值为1时,表示需要指定版本*/
if (is_visual_object_identifier)
{
visual_object_verid/*
4位比特码,用来指示视觉对象的版本号*/
visual_object_priority/*
3位比特码,用来指示视觉对象的优先级。它的值从1到7,
其中1表示有限级最高,7表示优先级最低,0值表示保留*/
}
visual_object_type/*4位比特码,指示视觉对象的类型*/
if (visual_object_type=="video ID"||
visual_object_type=="still texture ID")
{
video_signal_type()/*1位比特码,当数值为1时,表示视频信号存在*/
}
next_start_code()
while(next_bits()==user_data_start_code)
{
user_data()
}
if(visual_object_type=="video ID")
{
video_object_start_code/*
32位比特码,其中前27位是
0000 0000 0000 0000 0000 0001 000,剩下的5个比特
从00000到11111。给视频对象做了标记*/
VideoObjectLayer()//视频对象层
}
else if(visual_object_type=="still texture ID")
{
StillTextureObject()//静态文理对象
}
else if (visual_object_type=="mesh ID")
{
MeshObject()//网格对象
}
else if(visual_object_type=="face ID")
{
FaceObject()//人脸对象
}
if (next_bits() !="0000 0000 0000 0000 0000 0001")
next_start_code()
}
视频对象层包含了视频对象的众多设置信息,视频对象层语法码表如下:
VideoObjectLayer()
{
if(next_bits()==video_object_layer_start_code)
{
short_video_header=0/*1位比特码,
当视频使用一种短小的头格式被设置。它指明用
short_video_start_marker开始的视频数据优于用长起始码,
与H263编码标准的兼容*/
video_object_layer_start_code/*32位比特码,其中前28位比特
为0000 0000 0000 0000 0000 0001 0010,后4位从0000到1111,
表示一个新的视频对象层的开始*/
random_accessible_vol/*
这个标志被设置为1用来指示VOL中的没一个VOP是可以单独解码的。
如果VOL中所有的VOP都是内部编码的VOP,那么上述条件可以满足,
于是random_accessible_vol就可以被设置为1。random_accessible_vol
标志对解码过程是没有用的。random_accessible_vol是为协助随机访问
和编辑而特意设计的。如果VOL中任意一个VOP不是内部编码的,
或者其他一些条件不能满足,那么次标志必须设置为0*/
video_object_type_indication/*
用来强迫后面码流从指定对象类型使用工具*/
is_object_layer_identifier/*
1位比特码,当数值为1时表示码流中含有视频对象层的版本和优先权*/
if(is_object_layer_identifier)
{
video_object_layer_verid/*
4位比特码,表示视频对象层的版本号。如果video_object_verid和
video_object_layer_verid都存在video_object_layer_verid代替
video_object_verid*/
video_object_layer_priority/*
3位比特码,表示视频对象层优先级。它的值从1到7.1表示优先级最
高,7表示优先级最低,0值表示保留*/
}
aspect_ratio_info/*
4位比特码,指示了像素外形的长宽比。如果指示为extended PAR,
aspect_ratio_info参见par_width和par_height*/
if(aspect_ratio_info=="extended_PAR")
{
par_width/*
8位比特码,指示了像素外形的水平尺寸,0值表示被禁用*/
par_height/*
8位比特码,指示了像素外形的垂直尺寸,0值表示被禁用*/
}
vol_control_parameters/*
1位比特码,当数值为1时,表示chroma_format、low_delay和
vbv_parameters在码流中存在*/
if (vol_control_parameters)
{
chroma_format/*
2位比特码,指示了色彩格式*/
low_delay /*
1位比特码,当数值为1时表示VOL中没有B-VOP*/
vbv_parameters/*
1位比特码,当数值为1时表示VBV参数存在*/
if(vbv_parameters)
{
first_half_bit_rate
marker_bit
latter_half_bit_rate
/*first_half_bit_rate, latter_half_bit_rate:30位比特码,
由两部分组成,前15位定义在first_half_bit_rate,后15位定义
在latter_half_bit_rate。marker_bit被插入在first_half_bit_rate
和latter_half_bit_rate之间。如果比特率域在VOL头中存在,
它定义了峰值码率*/
marker_bit
first_half_vbv_buffer_size
marker_bit
latter_half_vbv_buffer_size
/*first_half_vbv_buffer_size, latter_half_vbv_buffer_size:
18位比特码,主要由两部分组成,前15位定义在first_half_vbv_
buffer_size,后3位定义在latter_half_vbv_buffer_size中。描述
VBV缓冲区尺寸的单位是16384bits*/
first_half_vbv_occupancy
marker_bit
latter_half_vbv_occupancy
/*first_half_vbv_occupancy, latter_half_vbv_occupancy:26位比特
码,由两部分组成,前11位定义在first_half_vbv_occupancy中,后15
位定义在latter_half_vbv_occupancy中,marker_bit被插入在
first_vbv_buffer_size 和 the latter_half_vbv_buffer_size之间。
该部分比特码表示VOL头后面第一个VOP移出解码缓冲区之前的VBV占的尺寸,
单位是64位比特。目的是给VBV缓冲区提供初始条件*/
marker_bit
}//vbv_parameters
}//vol_control_parameters
video_object_layer_shape/*
2位比特码,表示视频对象层的形状类型*/
marker_bit
vop_time_increment_resolution/*
16位比特码,指示了一个Modulo时间的平均间隔(称为 Tick)。
一个Modulo时间表现了一秒的固定间隔*/
marker_bit
fixed_vop_rate/*
一位比特码,它表示所有VOP是否用固定的码率编码。只有当任意两个连续
的VOP显示间隔是常数是,数值为1。在这种情况下,VOP码率可以由
fixed_VOP_time_increment得到。如果数值为0,那么两个连续的VOP的显示
间隔是变化的,这时候需要VOP头中的时间戳。*/
if(fixed_vop_rate)
fixed_vop_time_increment/*
该数值描述了显示序列中两个连续的VOP的Tick数值*/
if(video_object_layer_shape != "binary only")
{
if (video_object_layer_shape == "rectangular")
{
marker_bit
video_object_layer_width/*
13位比特码码,表示亮度可显示部分的宽度,宽度的单位是像素*/
marker_bit
video_object_layer_height/*
13位比特码码,表示亮度可显示部分的高度,高度的单位是像素*/
marker_bit
}//==rectangular
interlaced/*
1位比特码,如果数值为1,表示VOP可以包含交织视频;
而数值为0,表示VOP是累进格式*/
obmc_disable/*
1位比特码,数值为1表示禁止重叠运动补偿*/
sprite_enable/*
1位比特码,数值位1表示Speite的存在*/
if(sprite_enable)
{
sprite_width/*
13位比特码,表示Sprite的水平尺寸*/
marker_bit
sprite_height/*
13位比特码,表示Sprite的垂直尺寸*/
marker_bit
sprite_left_coordinate/*
13为比特码,定义了 Sprite的左边界*/
marker_bit
sprite_top_coordinate/*
13为比特码,定义了 Sprite的上边界*/
marker_bit
no_of_sprite_warping_points/*
6位比特码,表示在Sprite扭曲中使用的点数目*/
sprite_warping_accuracy/*
2位比特码,表示在Sprite扭曲过程中使用的运动向量的量化进度*/
sprite_brightness_change/*
1位比特码,数值位1时,表示在Sprite扭曲时有亮度变化;
数值为0时说明亮度不变化*/
low_latency_sprite_enable/*
1位比特码,数值为1时,表示low_latency sprite比特码存在*/
}
not_8_bit/*
1位比特码,数值为1时表示视频数据的 精度不是每像素8比特*/
if(not_8_ bit)
{
quant_precision/*
该部分比特码表示在描述量化器参数的 比特数目,数值可以是3到9*/
bits_per_pixel/*
该部分比特码表示以每像素用的比特数为单位指定视频数据的精度*/
}
if (video_object_layer_shape=="grayscale")
{
no_gray_quant_update/*
1位比特码,当解码灰度数据时使用固定量化器时,数值为1*/
composition_method/*
1位比特码,表示了应用在视频对象中的混合方法*/
linear_composition/*
1位比特码,表示了信号合成过程的类型。数值为0时,
使用被视频解码器产生的视频信号,数值为1时,使用线性信号*/
}
quant_type/*
1位比特码,数值为1时对DCT系数使用第一种逆量化方案,当数值为0时,
使用第二种量化方案*/
if(quant_type)
{
load_intra_quant_mat/*
1位比特标志,数值为1表示,intra_quant_mat比特码存在*/
if(load_intra_quant_mat)
intra_quant_mat/*
这是一个从2到64个8位比特码的表*/
load_nonintra_quant_mat/*
1位比特码,数值为1表示,nonintra_quant_mat比特码存在*/
if(load_nonintra_quant_mat)
nonintra_quant_mat/*
这是一个从2到64个8位比特码的表*/
if(video_object_layer_shape=="grayscale")
{
load_intra_quant_mat_grayscale/*
1位比特码,数值为1表示,intra_quant_mat_grayscale比特码存在*/
if(load_intra_quant_mat_grayscale)
intra_quant_mat_grayscale/*
这是一个从2到64个8位比特码的表*/
load_nonintra_quant_mat_grayscale/*
1位比特码,数值为1表示,nonintra_quant_mat_grayscale
比特码存在*/
if(load_nonintra_quant_mat_grayscale)
nonintra_quant_mat_grayscale/*
这是一个从2到64个8位比特码的表*/
}//==grayscale
}//quant_type
complexity_estimation_disable/*
1位比特码,数值为1时,表示在每一个VOP中禁止复杂估计头*/
if(!complexity_estimation_disable)
define_vop_complexity_estimation_header()
resync_marker_disable/*
1位比特标志,数值为1时,表示编码的VOP中没有resync_marker。*/
data_partitioned/*
1位比特码,数值为1时,表示宏块数据用不同方式重新安排,
特别时运动向量数据从纹理数据(DCT系数)中分离出来*/
if(data_partitioned)
reversible_vlc/*
1位比特码,数值为1时表示解码DCT系数过程中使用可逆的变长表*/
scalability/*
1位比特码,数值为1时,表示当前使用了可扩展编码。
如果当前层是基层,数值为0*/
if(scalability)
{
hierarchy_type/*表示相关联层的关系*/
ref_layer_id/*4位比特码,指示了在可扩展情形下用作参考的层*/
ref_layer_sampling_direc/*
1位比特码,数值为1时表示参考层的分辨率比已编码层的分辨率高;
数值为0时,表示表示参考层的分辨率比已编码层的分辨率低或相同*/
hor_sampling_factor_n/*
5位比特码,表示在扩展编码时水平空间重采样比率的分子*/
hor_sampling_factor_m/*
5位比特码,表示在扩展编码时水平空间重采样比率的分母*/
vert_sampling_factor_n/*
5位比特码,表示在扩展编码时垂直空间重采样比率的分子*/
vert_sampling_factor_m/*
5位比特码,表示在扩展编码时垂直空间重采样比率的分母*/
enhancement_type/*
1位比特码,数值为1时,表示当前层增强了参考层的部分区域;
数值为0时,表示当前层增加了参考层的整个区域*/
}
}//!=binary only
else
resync_marker_disable
next_start_code()
while(next_bits()==user_data_start_code)
{
user_data()
}
if(sprite_enable && !low_latency_sprite_enable)
VideoObjectPlane()
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))
} else {
short_video_header = 1
do{
video_plane_with_short_header()/*
压缩视频平面的语法层,它只包含可使用短头格式能力的有限子集*/
}while(next_bits()==short_video_start_marker)
}//next_bits()==video_object_layer_start_code
}
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.4.5 sprite技术 下一篇11.1.1 位图文件结构分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: