X264优化

现在VS2008上做一些代码精简性优化。如果代码体积过于庞大的话会出现在DSPload不进去的情况,也会给空间存储分配带来麻烦。

1、去掉common.c中的x264_log()和x264_log_default()函数(主要输出信息的分类),改用printf即可。

2、对有些fprintf()去掉即可,尤其关于stderr的,有些输出信息还是保留为好,方便观察结果。

3、设置set.c中的sps->b_vui = 0;表示vui信息不出现在码流中 sps->b_frame_mbs_only = 1;表示采用所有图像均帧编码

4、屏蔽掉:cavlc.c中的else if( i_mb_type == B_8x8 ),else if( i_mb_type!= B_DIRECT ), else if( i_mb_type == B_DIRECT ),else if( i_mb_type == B_8x8 )等相关内容,编码级别为baseline没有B帧。

5、去掉common.h中的CHECKED_MALLOC中的if(!var)...(即检查分配内存成功与否) 

6、屏蔽掉ratecontrol_en.c中的x264_ratecontrol_new中的if( h->param.rc.i_rc_method == X264_RC_CRF)..和if( h->param.rc.b_stat_read )...等相关内容,因为已经设置i_rc_method == X264_RC_NONE,参数i_rc_method表示码率控制,CQP

x264优化(二)

1、去掉assert()语句

2、去掉common.c中的x264_param_parse()函数,及其相关定义和调用,这个主要是用来检查参数赋值对不对。 并将i_rc_method直接赋值为X264_RC_CQP。

3、去掉analyse.c中的static const int i_mb_b_cost_table[19]类似的数组(B帧用到的),以及以if( h->sh.i_type == SLICE_TYPE_B )...开头的语句。

4、去掉analyse.c中的x264_mb_analyse_inter_direct(),x264_mb_analyse_inter_b16x16(),x264_mb_analyse_inter_b8x8,x264_mb_analyse_inter_b16x8,x264_mb_analyse_inter_b8x16()等五个函数,这五个函数是用来进行B帧帧间预测的,不需要用到。

5、去掉有h->sh.i_type == SLICE_TYPE_B的语句。

6、将以for(i_list = 0;i_list<(h->sh.i_type == SLICE_TYPE_B ? 2 : 1 );i_list++ )的循环去掉,因为不使用B帧只执行一次,不需循环,但需加入i_list = 0;置初值。

7、analyse.c中的x264_mb_analyse_b_rd(),和x264_refine_bidir()函数去掉。

8、去掉cavlc_en.c中的uint8_t mb_type_b_to_golomb[3][9]和sub_mb_type_b_to_golomb[13]数组

9、去掉common.c中的parse_enum

x264优化(三)

1、去掉ratecontrol.c中的parse_zones相关的三处代码

2、去掉encoder.c中的x264_encoder_close()函数中的x264_ratecontrol_summary()函数及在ratecontrol.c中的相应代码(因为在这个函数中调用了if(rc->b_abr)...;

3、去掉rate_estimate_qscale()函数,clip_qscale()函数。

4、int x264_me_refine_bidir( x264_t *h, x264_me_t *m0, x264_me_t *m1,int i_weight ) 函数(me_en.c中)及其相关函数去掉,在程序中未能调用,且有内联,占用了大量的空间。

5、bs.h中int型数据改为short型,函数返回int的除外。

6、去掉 if( analysis.i_mbrd >= 2 && h->mb.i_type != I_PCM )的内容。

7、删除me.c中的COST_MV_RD宏。

8、删除analyse.c中的x264_intra_rd_refine函数,x264_intra_rd函数,x264_mb_analyse_p_rd()x264_mb_analyse_transform_rd() (可以考虑删除所有以_rd结尾的函数或变量)

9、删除x264_rd_cost_mb,x264_rd_cost_subpart,x264_rd_cost_part,uint64_t x264_rd_cost_i8x8,x264_rd_cost_i4x4,x264_rd_cost_i8x8_chroma

10、删除me.c中COST_BIMV_SATD宏里面if(rd)的内

x264优化(四)

1、删除x264_macroblock_encode_p8x8,x264_mb_analyse_inter_p8x8_mixed_ref,x264_mb_cache_mv_b8x8,sub16x16_dct8,sub8x8_dct8,x264_psy_trellis_init。

2、删除x264_mb_predict_mv_direct16x16,static int x264_mb_predict_mv_direct16x16_spatial。

3、删除x264_mb_mc_01xywh(可能是对后向参考帧计算的,或者和B帧有关),x264_macroblock_bipred_init, x264_mb_load_mv_direct8x8,x264_mb_mc_1xywh。

4、删除x264_ratecontrol_mb,predict_row_size和predict_size函数

5、删除x264_predict_8x8_filter,scaling_list_write,transpose函数

6、删除quant_8x8,dequant_8x8。set.c中的x264_cqm_parse_file,x264_cqm_parse_jmlist,common.c中的x264_encoder_headers,x264_encoder_reconfig。

7、 frame.c中删除x264_frame_expand_border_mod16(),macroblock_en.c中删除x264_denoise_dct()

8、删除x264_mb_transform_8x8_allowed,x264_mb_analyse_transform,x264_cabac_mb_transform_size,x264_psy_trellis_init,x264_mb_cache_fenc_satd(和rd有关的函数),去掉和b_transform_8x8相关的东西。i_mb_c

x264优化(五)

1、删除和dequant8_mf有关的一个循环。h->mb.pic.p_integral,h->sh.i_num_ref_idx_l1_active,去掉(m)->integral = &h->mb.pic.p_integral[list][ref][(xoff)+(yoff)*(m)->i_stride[0]]和common.h中的uint16_t *p_integral[2][16];

2、删除void x264_rdo_init,static ALWAYS_INLINE int quant_trellis_cabac(),删除trellis_node_t结构体,x264_cabac_size_decision_noup2。

3、删除 cabac.c,cabac1.c和cabac.h文件。

4、删除x264_macroblock_cache_skip

5、去掉和cpu相关的代码。

6、去掉rdo率失真优化相关东西。

7、去掉ssim相关的代码。SSIM(structural similarity index) 一种衡量两幅图像相似度的新指标,其值越大越好,最大为1,经常用到图像处理中,特别在图像去噪处理中在图像相似度评价上全面超越SNR(signal to noise ratio)和PSNR(peak signal to noise ratio)。

x264优化(六)

1、删除get_diff_limited_q,get_qscale,parse_zone函数

2、去掉和zones相关的结构体,代码。

3、去掉类似于b_have_lowres这样的变量,这样的变量赋了初始值之后,以后if(该变量)的语句是可以预测到的,若始终为0,那么这样的if判断是可以去掉的。去掉i_aq_mode相关的一些if判断语句。 

4、2pass 多次压缩码率控制 int b_stat_write; Enable stat writing in psz_stat_out char *psz_stat_out; int 

x264优化(七)

1、去掉有关信噪比的计算PSNR

2、去掉x264_rc_analyse_slice,x264_lowres_context_init,函数。

3、由于DIA菱形搜索算法是最快的,这里只保留菱形搜索法,将其他算法删去。

4、i_rd16x16bi,i_rd16x16direct,i_rd16x16,i_rd16x8bi,int i_rd8x16bi,i_rd8x8bi。

5、删除x264_slicetype_mb_cost,x264_slicetype_frame_cost,x264_slicetype_path,x264_slicetype_path_search函数。

6、删除ssd_mb,ssd_plane,sum_sa8d,sum_satd。

7、删除matroska.h和matroska.c文件。

8、删除gcd函数,删除muxer.h和muxer.c文件中有关y4m,mkv,thread相关的一些内容,因为这里输入只有YUV的原始数据额格式,最后编码出来的数据也是.264的原始编码数据。

9、bs.h文件,bs_write32,bs_align_0,bs_align_1。 common.h文件,x264_predictor_difference。

10、去掉和SLICE_TYPE_B,B_SKIP,B_BI_BI,B_BI_L1,B_BI_LO,B_L1_BI,B_L1_L1,B_L1_L0,B_L0_L1,B_L0_L0,B_DIRECT有关的条件,赋值等语句。

x264优化(八)

1、 D_L1_4x4 = 4, D_L1_8x4 = 5, D_L1_4x8 = 6, D_L1_8x8 = 7, D_BI_4x4 = 8, D_BI_8x4 = 9, D_BI_4x8 = 10, D_BI_8x8 = 11, D_DIRECT = 12, 可删除。

2、x264_mb_partition_count_table[]删除,x264_pixel_ssd_wxh()删除。

3、去掉x264_mb_analysis_t里的i_mbrd变

 x264优化(九)1、analyse.c文件中去掉WEIGHTED_AVG宏,删除scenecut()函数,x264_zigzag_scan2数组。2、去掉b_bframe_pyramid,i_bframe,X264_TYPE_B,X264_TYPE_BREF变量和相关代码。3、去掉Encode函数,for( i_frame = 0, i_file = 0;(i_frame < i_frame_total || i_frame_total == 0); )循环中的parse_qpfile()函数。4、去掉encode.c文件中x264_thread_sync_context()函数。5、stdint.h文件中将不必要的宏去掉。6、common.h文件中dist_scale_factor,bipred_weight,map_col_to_list0_buf,map_col_to_list0数组去掉,b_direct_auto_read,b_direct_auto_write,b_direct_spatial_mv_pred,b_sp_for_swidth,i_qs_delta,i_delay,fenc_dct8,fenc_dct4,fenc_satd,fenc_satd_sum,fenc_sa8d,fenc_sa8d_sum,i_neighbour_transform_size,i_neighbour_interlaced,i_cbp_top,i_cbp_left,i_last_dqp,i_misc_bits,i_direct_score,i_ssd_global,i_ssd,f_slice_qp,i_consecutive_bframes,i_direct_frames删除。if( h->frames.i_input <= h->frames.i_delay )循环去掉。 在Encodex264优化(十) 1、去掉局部变量未使用的变量。2、根据CCS的调试结果,去掉i_update_interval,opterr,print_errors变量。i_yuv_size,lambda2_tab[2][52],LAMBDA_BITS变量,i_left_type,i_top_type。def_dequant8,def_quant8数组。square1,hex2,mod6m1数组,quant8_scale,dequant8_scale,quant8_scan。x264_mb_cache_mv_b8x16()函数,x264_mb_cache_mv_b8x16()函数。predict_8x8_vl(),predict_8x8_hd(),predict_8x8_vr()munge_cavlc_nnz(),restore_cavlc_nnz_row(),munge_cavlc_nnz_row(),x264_atoi(),x264_atof(),3、去掉ratecontrol.c文件的expected_bits_sum,wanted_bits_window,short_term_cplxsum,short_term_cplxsum,short_term_cplxcount,rate_factor_constant,last_satd,last_rceq,cplxr_sum,cbr_decay变量,qscale2bits()函数,qscale2qp()函数。4、去掉x264_frame_t *last_nonb;5、删除slicetype.c文件。

自己利用业余优化了一个h264的解码器,只使用在armv6架构的android2.3版本的手机上, 优化的内容是:完全用汇编重写了解码端h264的预测算法、IDCT算法、反量化算法、MC算法、loop_filter算法。 我的测试: 手机:C8650,配置:CPU:MSM7627-600MHZ,RAM:512M,android2.3.6 测试结果(baseline,mainline,highline解码速度相差不是很大): 352*288的H264视频:完全流畅播放 512*288的H264视频:每秒播放20--25帧 704*576的H264视频:每秒播放20帧左右 1280*544的H264视频:每秒解码12-15帧,播放8--9帧(主要是YUV420转rgb565这里太浪费时间,还在优化中) 1280*720的H264视频:每秒解码13-16帧,播放8--10帧(也是YUV420转rgb565这里浪费时间), 测试结果:1280*544和1280*720的视频文件中,我的解码器要远远优于市面上的mobo播放器,开讯播放器等播放器的解码播放速度。 你如果要测试,则:需要您的手机CPU是armv6架构的,并且支持vfpv3。 视频条件: 视频采样点是8位,完全符合H264编码的视频文件(打包成多媒体格式也可以),采样格式是YUV420。(因为一直从事安防行业,就只按照安防的通用格式来) 下一步的计划是:利用ARM的vfp协处理器汇编指令,争取把YUV420转RGB565的转换速度优化到 稍后上传一些一些测试文件,欢迎下载测试(可点击我的名字,查找),谢谢 我会一直在H264的解码算法这块进行优化,不做播放器,只做高性能的H264解码器,如果您有兴趣,希望和我联系:sno_guo#163.com 谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值