1、解码程序流程:1、初始化解码所需资源。例如:设置输入文件、输出文件,代表解码所需各缓冲区大小的结构 DEC_MEM_REQS 及其中各对象所占空间大小的分配,缓冲区结构DEC_BUFFERS 中对象初始化,解码所需变量的结构 DEC_PARAM 中各对象的初始化,解码所需资源初始化 decore_init()如:MP4_STATE、MP4_TABLES、MP4_STREAM 以及 MP4_STATE 结构中部分代表 VOL、VOP 头标志的对象的初始化,设置关于图像尺寸的全局变量 decore_alloc() ,设置 YUV 格式 decore_setoutput()等。2、开始计时start
2、Timer() 。3、代表解码帧的结构 DEC_FRAME 中对象 void *bitstream,void *bmp,long length,int render_flag 的初始化。4、取得视频对象层头标志,getvolhdr()。5、取得视频对象平面组头标志,getgophdr()。6、取得视频对象平面头标志, getvophdr()。7、得到 Mpeg4 图像,get_mp4picture () 。8、停止计时,stopTimer()。9、显示解码所用时间、帧数,帧率。displayTimer() 。初始化解码所需资源开始计时startTimer()解码帧结构的初始化DEC_FRAME
3、getvolhdr()getgophdr()getvophdr()get_mp4picture()stopTimer()displayTimer()解码开始结束get_mp4picture()1)if(.mba mba_size) j 4; j+) setMV(j);5) 如果宏块类型为 3,且此帧为 P 帧时,将运动向量设为 0;6) 如果帧间编码,进行运动补偿 reconstruct( ), recon_comp()和纹理解码 blockInter(),addblockInter() ;7) 如果帧内编码,只进行纹理解码 blockInter(),addblockInter() ;(3)
4、处理没有被编码的宏块1) 置运动向量为 02) 运动补偿 reconstruct( ), recon_comp()(4) 将量化值 quantizer 存入量化值表 quant_storemb_ypos+1 mb_xpos+1(5)移动宏块坐标 mb_xpos、mb_ypos,定位下一个宏块。prediction_type=“I_VOP”开始not_coded=0derived_mb_type= ?设置量化值 quantizer3 或 4四个相同的 setMV(-1)0或1求出四个运动向量setMV(j)setMV(j)interFlag=1运动补偿 reconstruct( )recon_c
5、omp()纹理解码 blockInter() addblockInter()YesNoNo YesYesNo 置运动向量为 0运动补偿 reconstruct( )、recon_comp()Quantizer 存入 quant_storemb_ypos+1 mb_xpos+1移动宏块坐标 mb_xpos、mb_ypos,定位下一个宏块结束求运动向量 setMV()1、 定义相关变量,hor_mv_data, 、ver_mv_data 、 hor_mv_res、 ver_mv_res,scale_fac、high 、low、range ,并初始化 scale_fac、high、low、range
6、,定义差分运动向量 mvd_x,、mvd_y,、运动向量预测值 pmv_x,、pmv_y, 解码运动向量mv_x、 mv_y;2、 根据运动向量表 MVtab0、MVtab1 、MVtab2,通过函数 getMVdata(),从码流中获得水平运动向量数据 hor_mv_data;3、 从码流中恢复参数 hor_mv_res,根据参数 hor_mv_data、scale_fac 和 hor_mv_res,计算出水平差分运动向量 mvd_x;4、 根据运动向量表,通过函数 getMVdata(),从码流中获得垂直运动向量数据ver_mv_data;5、 从码流中恢复参数 ver_mv_res,根据
7、变量 ver_mv_data、scale_fac 和 ver_mv_res、计算出垂直差分运动向量 mvd_y;6、 通过函数 find_pmv( ),计算出运动向量预测值 pmv_x,、pmv_y;7、 计算解码水平运动向量 mv_x= pmv_x + mvd_x,限制 mv_x 在范围low:high内;8、 计算解码垂直运动向量 mv_y= pmv_y + mvd_y,限制 mv_y 在范围low:high内;9、 把计算出的运动向量 mv_x、mv_y 分别存入运动向量的四维数组 MV0imb_ypos+1 mb_xpos+1, MV1imb_ypos+1 mb_xpos+1开始定义相
8、关变量和参数getMVdata()得到 hor_mv_data计算出水平差分运动向量 mvd_xgetMVdata()得到 ver_mv_data计算出水平差分运动向量 mvd_yfind_pmv( )得到运动向量预测值 pmv_x,、pmv_ymv_x= pmv_x + mvd_x,限制mv_x 在low:high 内mv_y= pmv_y + mvd_y,限制mv_y 在low:high 内mv_x,mv_y 存入数组结束1、getvolhdr()if(Video_Object_start_code) vo_idif(vol_start_code) ident,random_accessi
9、ble_voltype_indicationis_object_layer_identifierif (is_object_layer_identifier)visual_object_layer_veridvisual_object_layer_priorityelsevisual_object_layer_verid = 1 visual_object_layer_priority = 1 aspect_ratio_infovol_control_parametersif (vol_control_parameters) chroma_formatlow_delayvbv_paramete
10、rs if (vbv_parameters) first_half_bit_ratemarker bitlatter_half_bit_rate marker bitfirst_half_vbv_buffer_sizemarker bitlatter_half_vbv_buffer_sizefirst_half_vbv_occupancymarker bitlatter_half_vbv_occupancy marker bitShapemarker bittime_increment_resolutionmarker bitfixed_vop_rateif (fixed_vop_rate)f
11、ixed_vop_time_increment if (shape != BINARY_SHAPE_ONLY) if(shape= RECTANGULAR)marker bitwidthmarker bitheightmarker bit Interlacedif (visual_object_layer_verid = 1) sprite_usage =1 比特else sprite_usage =2 比特not_8_bit if (not_8_bit) quant_precision bits_per_pixel quant_type if (quant_type) load_intra_
12、quant_matrixif (load_intra_quant_matrix) intra_quant_matrixload_nonintra_quant_matrixif(load_nonintra_quant_matrix)nonintra_quant_matrixif (visual_object_layer_verid!= 1) quarter_pixel complexity_estimation_disableerror_res_disabledata_partitioningif (data_partitioning) exit; elseerror_res_disable =
13、 1scalabilityif (scalability)exitif (USER_DATA_START_CODE)exit2、getgophdr()gop_start_codetime_codeclosed_govbroken_link3、getVophdr()vop_start_codeprediction_typedo time_base; while (time_base = = 1)marker bittime_incmarker bitvop_codedif (vop_coded = 0) next_start_code()return ;if (shape != BINARY_S
14、HAPE_ONLY) &(prediction_type = P_VOP) rounding_typeif (shape != RECTANGULAR)if (! (sprite_usage & prediction_type=I_VOP) )widthmarker bitheightmarker bithor_spat_refmarker bitver_spat_refmarker bitchange_CR_disableconstant_alphaif (constant_alpha)constant_alpha_valueif (! complexity_estimation_disable) exitif (shape != BINARY_SHAPE_ONLY) intra_dc_vlc_thrif (interlaced) exitif (shape != BINARY_SHAPE_ONLY) Quantizerif (prediction_type != I_VOP) fcode_forif (!scalability) if(shape=BINARY&.prediction_type!=I_VOP)shape_coding_type/* motion_shape_texture() */