现在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(){...}
这里说下关于1pass和2pass的问题,2pass代表二次编码,2pass可以是画面更精细,体积更小,但是要耗费很长时间,综合考虑看来,不需要进行二次编码。stats是统计文档的名称,记录了1pass中的信息。
9、去掉encoder.c中的x264_validate_levels( h,1)语句和set.c中对应的函数
(2010-11-12 11:01:17)
转载
标签: 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;置初值。
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(),parse_cqm(),atobool()函数
(2010-11-15 14:26:55)
转载
|
分类: 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)的内容。
(2010-11-24 14:12:47)
转载
标签: it |
分类: 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_count_8x8dct相关东西。
(2010-11-26 09:51:42)
转载
|
分类: 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)。
(2010-11-30 16:23:10)
转载
标签: 杂谈 |
分类: 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 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_ESA 和X264_ME_HESA搜索算法,考虑到速度的原因,不会使用。
6、 sps->b_vui = 0;//vui的信息不出现在码流中,则可将if( sps->b_vui )去掉。
7、x264_sps_t结构体中的vui结构体中的b_overscan_info,b_overscan_info_present,b_signal_type_present,i_vidformat,b_fullrange, b_color_description_present,i_colorprim,i_transfer,i_colmatrix,b_chroma_loc_info_present,int i_chroma_loc_top,i_chroma_loc_bottom,i_sar_width,int i_sar_height;
8、删除x264中vui结构体。
(2010-12-02 14:45:16)
转载
|
分类: 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有关的条件,赋值等语句。
(2010-12-06 11:00:41)
转载
|
|
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变量。去掉 i_trellis,b_trellis,b_noise_reduction,i_noise_reduction相关变量的代码。 nr_offset,nr_count,nr_residual_sum等和噪声优化有关的变量。
Trellis量化,对每个8x8的块寻找合适的量化值,需要CABAC,默认0 0:关闭1:只在最后编码时使用2:一直使用
4、去掉x264_noise_reduction_update函数,denoise_dct函数。
5、pic和analyse结构体中i_psy_rd和f_psy_rd,f_psy_trellis和i_psy_trellis变量相关删除。
6、ratecontrol.h里面的 x264_adaptive_quant_frame(),x264_adaptive_quant(),x264_thread_sync_ratecontrol(),x264_ratecontrol_set_estimated_size(),x264_ratecontrol_get_estimated_size() 函数删除。
7、ratecontrol.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() 函数去掉。
(2010-12-07 09:54:33)
转载
|
|
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 )循环去掉。
在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_open和x264_encoder_reconfig中调用这个初始化函数完成对mbcmp的初始化
。h->pixf.sad和h->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(与压缩质量和时间关
系密切,1是7速度的四倍以上)
1:用全像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
2:用半像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
3:用半像素块进行动态搜索,对每个块再用质量模式进行四分之一像素块精确搜索
4:用快速模式进行四分之一像素块精确搜索
5:用质量模式进行四分之一像素块精确搜索
6:进行I、P帧像素块的速率失真最优化(rdo)
7:进行I、P帧运动矢量及块内部的速率失真最优化(质量最好)
从上面可以看出,只有h->mb.b_lossless为非0或是全像素块动态搜索方式下,才是以sad来计算
,否则其他情况就用SATD。
根据是否有损和子像素提取方式来决定采用Sad还是SATD。
关于sad和satd,可以看里的pixel相关的汇编文件。
7、去掉csp相关变 量,X264_ANALYSE_BSUB16x16,x264_motion_est_names,x264_overscan_names,x264_vidformat_names,x264_fullrange_names,x264_colorprim_names,x264_transfer_names,x264_colmatrix_names。
8、删除(*pf_log)( void *, int i_level, const char *psz, va_list ),p_log_private,b_visualize。
(2010-12-09 15:06:16)
转载
|
|
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等一系列和比特流写入有关的函数