现在的位置: 首页 > 综合 > 正文

x264代码精简优化

2013年07月14日 ⁄ 综合 ⁄ 共 9688字 ⁄ 字号 评论关闭

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(恒定质量)CRF(恒定码率)ABR(平均码率)

7、去掉analyse.c中的void x264_slicetype_analyse( x264_t *h )ratecontrol.c中的x264_ratecontrol_slice_type()函数,个人感觉关于片类型的判断已经不需要这两个函数了,在x264_slicetype_decide已完成类型的判断?

8、去掉ratecontrol.c中的rate_estimate_qscale()函数中的if(
rcc->b_2pass )...
init_pass2(){...}

    
这里说下关于1pass2pass的问题,2pass代表二次编码,2pass可以是画面更精细,体积更小,但是要耗费很长时间,综合考虑看来,不需要进行二次编码。stats是统计文档的名称,记录了1pass中的信息。

9、去掉encoder.c中的x264_validate_levels( h,1)语句和set.c中对应的函数

x264优化(二)

(2010-11-12 11:01:17)

x264优化(一)到(十)转载

标签:

it

分类: 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;
置初值。

7analyse.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(),parse_cqm(),atobool()函数

x264优化(三)

(2010-11-15 14:26:55)

x264优化(一)到(十)转载

 

分类: 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()函数。

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

5bs.hint型数据改为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.cCOST_BIMV_SATD宏里面ifrd)的内容。 

 

x264优化(四)

(2010-11-24 14:12:47)

x264优化(一)到(十)转载

标签:

it

分类: x264

1、删除 x264_macroblock_encode_p8x8x264_mb_analyse_inter_p8x8_mixed_refx264_mb_cache_mv_b8x8sub16x16_dct8sub8x8_dct8x264_psy_trellis_init

2、删除x264_mb_predict_mv_direct16x16static int x264_mb_predict_mv_direct16x16_spatial

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

4、删除x264_ratecontrol_mbpredict_row_sizepredict_size函数

5、删除x264_predict_8x8_filterscaling_list_writetranspose函数

6、删除quant_8x8,dequant_8x8set.c中的x264_cqm_parse_file,x264_cqm_parse_jmlistcommon.c中的x264_encoder_headersx264_encoder_reconfig

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

8、删除 x264_mb_transform_8x8_allowedx264_mb_analyse_transformx264_cabac_mb_transform_sizex264_psy_trellis_initx264_mb_cache_fenc_satd(和
rd有关的函数),去掉和b_transform_8x8相关的东西。i_mb_count_8x8dct相关东西。

 

 

 

x264优化(五)

(2010-11-26 09:51:42)

x264优化(一)到(十)转载

 

分类: x264

1、删除和dequant8_mf有关的一个循环。h->mb.pic.p_integralh->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_initstatic ALWAYS_INLINE int quant_trellis_cabac(),删除trellis_node_t结构体,x264_cabac_size_decision_noup2

3、删除 cabac.ccabac1.ccabac.h文件。

4、删除x264_macroblock_cache_skip
5
、去掉和cpu相关的代码。

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

 

 

x264优化(六)

(2010-11-30 16:23:10)

x264优化(一)到(十)转载

标签:

杂谈

分类: x264

1、删除get_diff_limited_qget_qscaleparse_zone函数

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

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

42pass 多次压缩码率控制

        int        
b_stat_write;   Enable stat writing in psz_stat_out

        char        *psz_stat_out;

        int        
b_stat_read;     Read stat from psz_stat_in and use it

        char        *psz_stat_in;

         2pass params (same as ffmpeg ones)

        float       f_qcompress;    
0.0 => cbr, 1.0 => constant qp

        float       f_qblur;       
时间上模糊量化

        float       f_complexity_blur; 
时间上模糊复杂性

        x264_zone_t *zones;         
码率控制覆盖

        int        
i_zones;         number of zone_t's

        char        *psz_zones;    
指定区的另一种方法

这些rc的变量可以考虑去掉,有是和2pass有关的,用不到。

5、去掉X264_ME_ESAX264_ME_HESA搜索算法,考虑到速度的原因,不会使用。

6sps->b_vui = 0;//vui的信息不出现在码流中,则可将if( sps->b_vui )去掉。

7x264_sps_t结构体中的vui结构体中的b_overscan_infob_overscan_info_presentb_signal_type_presenti_vidformatb_fullrange
b_color_description_presenti_colorprimi_transferi_colmatrixb_chroma_loc_info_presentint i_chroma_loc_topi_chroma_loc_bottomi_sar_widthint
i_sar_height;

8、删除x264vui结构体。 

 

 

x264优化(七)

(2010-12-02 14:45:16)

x264优化(一)到(十)转载

 

分类: x264

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

2、去掉x264_rc_analyse_slice,x264_lowres_context_init,函数。

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

4i_rd16x16bii_rd16x16directi_rd16x16i_rd16x8biint i_rd8x16bii_rd8x8bi

5、删除x264_slicetype_mb_costx264_slicetype_frame_costx264_slicetype_pathx264_slicetype_path_search函数。
6
、删除ssd_mbssd_planesum_sa8dsum_satd

7、删除matroska.hmatroska.c文件。

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

9bs.h文件,bs_write32bs_align_0bs_align_1

   common.h文件,x264_predictor_difference

10、去掉和SLICE_TYPE_BB_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优化(八)

(2010-12-06 11:00:41)

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

   可删除。

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

3、去掉x264_mb_analysis_t里的i_mbrd变量。去掉
i_trellis,b_trellisb_noise_reductioni_noise_reduction相关变量的代码。
nr_offsetnr_count,nr_residual_sum等和噪声优化有关的变量。

Trellis量化,对每个8x8的块寻找合适的量化值,需要CABAC,默认0 0:关闭1:只在最后编码时使用2:一直使用

4、去掉x264_noise_reduction_update函数,denoise_dct函数。

5picanalyse结构体中i_psy_rdf_psy_rdf_psy_trellisi_psy_trellis变量相关删除。

6ratecontrol.h里面的
x264_adaptive_quant_frame
(),x264_adaptive_quant(),x264_thread_sync_ratecontrol(),x264_ratecontrol_set_estimated_size(),x264_ratecontrol_get_estimated_size()
函数删除。

7ratecontrol.h/ratecontrol.c中的b_vbv,b_vbv_min_rate,log2_lut,exp2_lut变量,update_vbv(),update_vbv_plan(),update_predictor(),ac_energy_mb(),x264_exp2fix8(),accum_p_qp_update(),row_bits_so_far(),vbv_pass2(),count_expected_bits(),fix_underflow(),find_underflow()
函数去掉。

x264优化(九)

(2010-12-07 09:54:33)

x264优化(一)到(十)转载

 

 

1analyse.c文件中去掉WEIGHTED_AVG宏,删除scenecut()函数,x264_zigzag_scan2数组。

2、去掉b_bframe_pyramidi_bframeX264_TYPE_BX264_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()函数。

5stdint.h文件中将不必要的宏去掉。

6common.h文件中
dist_scale_factor
bipred_weightmap_col_to_list0_bufmap_col_to_list0数组去 掉,b_direct_auto_readb_direct_auto_writeb_direct_spatial_mv_predb_sp_for_swidthi_qs_deltai_delayfenc_dct8fenc_dct4fenc_satdfenc_satd_sumfenc_sa8dfenc_sa8d_sumi_neighbour_transform_sizei_neighbour_interlacedi_cbp_topi_cbp_lefti_last_dqpi_misc_bitsi_direct_scorei_ssd_globali_ssdf_slice_qpi_consecutive_bframesi_direct_frames
删除。

if( h->frames.i_input <= h->frames.i_delay )循环去掉。

 

Encoder.c 中的定义初始化mbcmp_init (x264/encoder):545
static void mbcmp_init(x264_t *h)   
{
memcpy( h->pixf.mbcmp,
          ( h->mb.b_lossless || h->param.analyse.i_subpel_refine <= 1 ) ? h->pixf.sad :h->pixf.satd,
            sizeof(h->pixf.mbcmp) );
}
然后在x264_encoder_openx264_encoder_reconfig中调用这个初始化函数完成对mbcmp的初始化

h->pixf.sadh->pixf.satd是的初始化工作是写在由x264_pixel_init()函数的,x264_pixel_init

()里x264_encoder_open()被调用进行初始化工作。
其中h->mb是当前帧或宏块的宏块表和cache信息
, b_lossless应该就是是否要采用无损压缩了,h

->param.analyse.i_subpel_refine是动态预测和分区方式,可选项1~7,默认5(与压缩质量和时间关

系密切,17速度的四倍以上)
1
:用全像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
2
:用半像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
3
:用半像素块进行动态搜索,对每个块再用质量模式进行四分之一像素块精确搜索
4
:用快速模式进行四分之一像素块精确搜索
5
:用质量模式进行四分之一像素块精确搜索
6
:进行IP帧像素块的速率失真最优化(rdo)
7
:进行IP帧运动矢量及块内部的速率失真最优化(质量最好)
从上面可以看出,只有h->mb.b_lossless为非0或是全像素块动态搜索方式下,才是以sad来计算
,否则其他情况就用SATD
根据是否有损和子像素提取方式来决定采用Sad还是SATD
关于sadsatd,可以看里的pixel相关的汇编文件。

7、去掉csp相关变 量,X264_ANALYSE_BSUB16x16x264_motion_est_namesx264_overscan_namesx264_vidformat_namesx264_fullrange_namesx264_colorprim_namesx264_transfer_namesx264_colmatrix_names

 

8、删除(*pf_log)( void *, int i_level, const char *psz, va_list )p_log_privateb_visualize

 

x264优化(十)

(2010-12-09 15:06:16)

x264优化(一)到(十)转载

 

 

1、去掉局部变量未使用的变量。

2、根据CCS的调试结果,去掉i_update_intervalopterrprint_errors变量。i_yuv_sizelambda2_tab[2][52]LAMBDA_BITS变量,i_left_typei_top_type

def_dequant8def_quant8数组。square1hex2,mod6m1数组,quant8_scaledequant8_scalequant8_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_windowshort_term_cplxsumshort_term_cplxsumshort_term_cplxcountrate_factor_constantlast_satdlast_rceqcplxr_sumcbr_decay
变量,qscale2bits()函数,qscale2qp()函数。

4、去掉x264_frame_t *last_nonb;

5、删除slicetype.c文件。

 

更改x264_version_write()函数,更改bs_init(),bs_write等一系列和比特流写入有关的函数

抱歉!评论已关闭.