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】