现在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)的内
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
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)。
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
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有关的条件,赋值等语句。
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变
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 )循环去掉。
在Encode
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文件。
更改x264_version_write()函数,更改bs_init(),bs_write等一系列和比特流写入有关的函数。