📄 x264.c
字号:
mtime_t i_interpolated_dts; char *psz_stat_name;};/***************************************************************************** * Open: probe the encoder *****************************************************************************/static int Open ( vlc_object_t *p_this ){ encoder_t *p_enc = (encoder_t *)p_this; encoder_sys_t *p_sys; vlc_value_t val; int i_qmin = 0, i_qmax = 0; x264_nal_t *nal; int i, i_nal; if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'h', '2', '6', '4' ) && !p_enc->b_force ) { return VLC_EGENERIC; } /* X264_POINTVER or X264_VERSION are not available */ msg_Dbg ( p_enc, "version x264 0.%d.X", X264_BUILD );#if X264_BUILD < 37 if( p_enc->fmt_in.video.i_width % 16 != 0 || p_enc->fmt_in.video.i_height % 16 != 0 ) { msg_Warn( p_enc, "size is not a multiple of 16 (%ix%i)", p_enc->fmt_in.video.i_width, p_enc->fmt_in.video.i_height ); if( p_enc->fmt_in.video.i_width < 16 || p_enc->fmt_in.video.i_height < 16 ) { msg_Err( p_enc, "video is too small to be cropped" ); return VLC_EGENERIC; } msg_Warn( p_enc, "cropping video to %ix%i", p_enc->fmt_in.video.i_width >> 4 << 4, p_enc->fmt_in.video.i_height >> 4 << 4 ); }#endif config_ChainParse( p_enc, SOUT_CFG_PREFIX, ppsz_sout_options, p_enc->p_cfg ); p_enc->fmt_out.i_codec = VLC_FOURCC( 'h', '2', '6', '4' ); p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0'); p_enc->pf_encode_video = Encode; p_enc->pf_encode_audio = NULL; p_enc->p_sys = p_sys = malloc( sizeof( encoder_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; p_sys->i_interpolated_dts = 0; p_sys->psz_stat_name = NULL; x264_param_default( &p_sys->param ); p_sys->param.i_width = p_enc->fmt_in.video.i_width; p_sys->param.i_height = p_enc->fmt_in.video.i_height;#if X264_BUILD < 37 p_sys->param.i_width = p_sys->param.i_width >> 4 << 4; p_sys->param.i_height = p_sys->param.i_height >> 4 << 4;#endif /* average bitrate specified by transcode vb */ p_sys->param.rc.i_bitrate = p_enc->fmt_out.i_bitrate / 1000; var_Get( p_enc, SOUT_CFG_PREFIX "qpstep", &val ); if( val.i_int >= 0 && val.i_int <= 51 ) p_sys->param.rc.i_qp_step = val.i_int; var_Get( p_enc, SOUT_CFG_PREFIX "qpmin", &val ); if( val.i_int >= 0 && val.i_int <= 51 ) { i_qmin = val.i_int; p_sys->param.rc.i_qp_min = i_qmin; } var_Get( p_enc, SOUT_CFG_PREFIX "qpmax", &val ); if( val.i_int >= 0 && val.i_int <= 51 ) { i_qmax = val.i_int; p_sys->param.rc.i_qp_max = i_qmax; } var_Get( p_enc, SOUT_CFG_PREFIX "qp", &val ); if( val.i_int >= 0 && val.i_int <= 51 ) { if( i_qmin > val.i_int ) i_qmin = val.i_int; if( i_qmax < val.i_int ) i_qmax = val.i_int; p_sys->param.rc.i_rc_method = X264_RC_CQP;#if X264_BUILD >= 0x000a p_sys->param.rc.i_qp_constant = val.i_int; p_sys->param.rc.i_qp_min = i_qmin; p_sys->param.rc.i_qp_max = i_qmax;#else p_sys->param.i_qp_constant = val.i_int;#endif }#if X264_BUILD < 48 /* cbr = 1 overrides qp or crf and sets an average bitrate but maxrate = average bitrate is needed for "real" CBR */ if( p_sys->param.rc.i_bitrate > 0 ) p_sys->param.rc.b_cbr = 1;#else if( p_sys->param.rc.i_bitrate > 0 ) p_sys->param.rc.i_rc_method = X264_RC_ABR;#endif#if X264_BUILD >= 24 var_Get( p_enc, SOUT_CFG_PREFIX "ratetol", &val ); p_sys->param.rc.f_rate_tolerance = val.f_float; var_Get( p_enc, SOUT_CFG_PREFIX "vbv-init", &val ); p_sys->param.rc.f_vbv_buffer_init = val.f_float; var_Get( p_enc, SOUT_CFG_PREFIX "vbv-bufsize", &val ); p_sys->param.rc.i_vbv_buffer_size = val.i_int; /* x264 vbv-bufsize = 0 (default). if not provided set period in seconds for local maximum bitrate (cache/bufsize) based on average bitrate. */ if( !val.i_int ) p_sys->param.rc.i_vbv_buffer_size = p_sys->param.rc.i_bitrate * 2; /* max bitrate = average bitrate -> CBR */ var_Get( p_enc, SOUT_CFG_PREFIX "vbv-maxrate", &val ); p_sys->param.rc.i_vbv_max_bitrate = val.i_int;#else p_sys->param.rc.i_rc_buffer_size = p_sys->param.rc.i_bitrate; p_sys->param.rc.i_rc_init_buffer = p_sys->param.rc.i_bitrate / 4;#endif var_Get( p_enc, SOUT_CFG_PREFIX "cabac", &val ); p_sys->param.b_cabac = val.b_bool; /* disable deblocking when nf (no loop filter) is enabled */ var_Get( p_enc, SOUT_CFG_PREFIX "nf", &val ); p_sys->param.b_deblocking_filter = !val.b_bool; var_Get( p_enc, SOUT_CFG_PREFIX "deblock", &val ); if( val.psz_string ) { char *p = strchr( val.psz_string, ':' ); p_sys->param.i_deblocking_filter_alphac0 = atoi( val.psz_string ); p_sys->param.i_deblocking_filter_beta = p ? atoi( p+1 ) : p_sys->param.i_deblocking_filter_alphac0; free( val.psz_string ); } var_Get( p_enc, SOUT_CFG_PREFIX "level", &val ); if( val.psz_string ) { if( atof (val.psz_string) < 6 ) p_sys->param.i_level_idc = (int) ( 10 * atof (val.psz_string) + .5); else p_sys->param.i_level_idc = atoi (val.psz_string); free( val.psz_string ); }#if X264_BUILD >= 51 /* r570 */ var_Get( p_enc, SOUT_CFG_PREFIX "interlaced", &val ); p_sys->param.b_interlaced = val.b_bool;#endif var_Get( p_enc, SOUT_CFG_PREFIX "ipratio", &val ); p_sys->param.rc.f_ip_factor = val.f_float; var_Get( p_enc, SOUT_CFG_PREFIX "pbratio", &val ); p_sys->param.rc.f_pb_factor = val.f_float; var_Get( p_enc, SOUT_CFG_PREFIX "qcomp", &val ); p_sys->param.rc.f_qcompress = val.f_float; var_Get( p_enc, SOUT_CFG_PREFIX "cplxblur", &val ); p_sys->param.rc.f_complexity_blur = val.f_float; var_Get( p_enc, SOUT_CFG_PREFIX "qblur", &val ); p_sys->param.rc.f_qblur = val.f_float;#if X264_BUILD >= 59 var_Get( p_enc, SOUT_CFG_PREFIX "aq-mode", &val ); p_sys->param.rc.i_aq_mode = val.i_int; var_Get( p_enc, SOUT_CFG_PREFIX "aq-strength", &val ); p_sys->param.rc.f_aq_strength = val.f_float;#endif#if X264_BUILD >= 0x000e var_Get( p_enc, SOUT_CFG_PREFIX "verbose", &val ); if( val.b_bool ) p_sys->param.i_log_level = X264_LOG_DEBUG;#endif var_Get( p_enc, SOUT_CFG_PREFIX "quiet", &val ); if( val.b_bool ) p_sys->param.i_log_level = X264_LOG_NONE;#if X264_BUILD >= 47 /* r518 */ var_Get( p_enc, SOUT_CFG_PREFIX "sps-id", &val ); if( val.i_int >= 0 ) p_sys->param.i_sps_id = val.i_int;#endif var_Get( p_enc, SOUT_CFG_PREFIX "aud", &val ); if( val.b_bool ) p_sys->param.b_aud = val.b_bool; var_Get( p_enc, SOUT_CFG_PREFIX "keyint", &val );#if X264_BUILD >= 0x000e if( val.i_int > 0 ) p_sys->param.i_keyint_max = val.i_int;#else if( val.i_int > 0 ) p_sys->param.i_iframe = val.i_int;#endif var_Get( p_enc, SOUT_CFG_PREFIX "min-keyint", &val );#if X264_BUILD >= 0x000e if( val.i_int > 0 ) p_sys->param.i_keyint_min = val.i_int;#else if( val.i_int > 0 ) p_sys->param.i_idrframe = val.i_int;#endif var_Get( p_enc, SOUT_CFG_PREFIX "bframes", &val ); if( val.i_int >= 0 && val.i_int <= 16 ) p_sys->param.i_bframe = val.i_int;#if X264_BUILD >= 22 var_Get( p_enc, SOUT_CFG_PREFIX "bpyramid", &val ); p_sys->param.b_bframe_pyramid = val.b_bool;#endif var_Get( p_enc, SOUT_CFG_PREFIX "ref", &val ); if( val.i_int > 0 && val.i_int <= 15 ) p_sys->param.i_frame_reference = val.i_int; var_Get( p_enc, SOUT_CFG_PREFIX "scenecut", &val );#if X264_BUILD >= 0x000b if( val.i_int >= -1 && val.i_int <= 100 ) p_sys->param.i_scenecut_threshold = val.i_int;#endif#if X264_BUILD >= 55 /* r607 */ var_Get( p_enc, SOUT_CFG_PREFIX "pre-scenecut", &val ); p_sys->param.b_pre_scenecut = val.b_bool; var_Get( p_enc, SOUT_CFG_PREFIX "non-deterministic", &val ); p_sys->param.b_deterministic = val.b_bool;#endif var_Get( p_enc, SOUT_CFG_PREFIX "subme", &val ); if( val.i_int >= 1 && val.i_int <= SUBME_MAX ) p_sys->param.analyse.i_subpel_refine = val.i_int;#if X264_BUILD >= 24 var_Get( p_enc, SOUT_CFG_PREFIX "me", &val ); if( !strcmp( val.psz_string, "dia" ) ) { p_sys->param.analyse.i_me_method = X264_ME_DIA; } else if( !strcmp( val.psz_string, "hex" ) ) { p_sys->param.analyse.i_me_method = X264_ME_HEX; } else if( !strcmp( val.psz_string, "umh" ) ) { p_sys->param.analyse.i_me_method = X264_ME_UMH; } else if( !strcmp( val.psz_string, "esa" ) ) { p_sys->param.analyse.i_me_method = X264_ME_ESA; }# if X264_BUILD >= 58 /* r728 */ else if( !strcmp( val.psz_string, "tesa" ) ) { p_sys->param.analyse.i_me_method = X264_ME_TESA; }# endif free( val.psz_string ); var_Get( p_enc, SOUT_CFG_PREFIX "merange", &val ); if( val.i_int >= 0 && val.i_int <= 64 ) p_sys->param.analyse.i_me_range = val.i_int; var_Get( p_enc, SOUT_CFG_PREFIX "mvrange", &val ); p_sys->param.analyse.i_mv_range = val.i_int;#endif#if X264_BUILD >= 55 /* r607 */ var_Get( p_enc, SOUT_CFG_PREFIX "mvrange-thread", &val ); p_sys->param.analyse.i_mv_range_thread = val.i_int;#endif var_Get( p_enc, SOUT_CFG_PREFIX "direct", &val ); if( !strcmp( val.psz_string, "none" ) ) { p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_NONE; } else if( !strcmp( val.psz_string, "spatial" ) ) { p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL; } else if( !strcmp( val.psz_string, "temporal" ) ) { p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_TEMPORAL; }#if X264_BUILD >= 45 /* r457 */ else if( !strcmp( val.psz_string, "auto" ) ) { p_sys->param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_AUTO; }#endif free( val.psz_string ); var_Get( p_enc, SOUT_CFG_PREFIX "psnr", &val ); p_sys->param.analyse.b_psnr = val.b_bool;#if X264_BUILD >= 50 /* r554 */ var_Get( p_enc, SOUT_CFG_PREFIX "ssim", &val ); p_sys->param.analyse.b_ssim = val.b_bool;#endif#if X264_BUILD >= 0x0012 var_Get( p_enc, SOUT_CFG_PREFIX "weightb", &val ); p_sys->param.analyse.b_weighted_bipred = val.b_bool;#endif#if X264_BUILD >= 0x0013 var_Get( p_enc, SOUT_CFG_PREFIX "b-adapt", &val ); p_sys->param.b_bframe_adaptive = val.b_bool; var_Get( p_enc, SOUT_CFG_PREFIX "b-bias", &val ); if( val.i_int >= -100 && val.i_int <= 100 ) p_sys->param.i_bframe_bias = val.i_int;#endif#if X264_BUILD >= 23 var_Get( p_enc, SOUT_CFG_PREFIX "chroma-me", &val ); p_sys->param.analyse.b_chroma_me = val.b_bool; var_Get( p_enc, SOUT_CFG_PREFIX "chroma-qp-offset", &val ); p_sys->param.analyse.i_chroma_qp_offset = val.i_int;#endif#if X264_BUILD >= 36 var_Get( p_enc, SOUT_CFG_PREFIX "mixed-refs", &val ); p_sys->param.analyse.b_mixed_references = val.b_bool;#endif#if X264_BUILD >= 37 var_Get( p_enc, SOUT_CFG_PREFIX "crf", &val ); if( val.i_int > 0 && val.i_int <= 51 ) {# if X264_BUILD >= 54 p_sys->param.rc.f_rf_constant = val.i_int;# else p_sys->param.rc.i_rf_constant = val.i_int;# endif# if X264_BUILD >= 48 p_sys->param.rc.i_rc_method = X264_RC_CRF;# endif }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -