📄 x264.c
字号:
add_integer( SOUT_CFG_PREFIX "qp", 26, NULL, QP_TEXT, QP_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 51 ); /* QP 0 -> lossless encoding */#if X264_BUILD >= 37 /* r334 */ add_integer( SOUT_CFG_PREFIX "crf", 0, NULL, CRF_TEXT, CRF_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 51 );#endif add_integer( SOUT_CFG_PREFIX "qpmin", 10, NULL, QPMIN_TEXT, QPMIN_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 51 ); add_deprecated( SOUT_CFG_PREFIX "qp-min", VLC_FALSE ); /* Deprecated since 0.8.5 */ add_integer( SOUT_CFG_PREFIX "qpmax", 51, NULL, QPMAX_TEXT, QPMAX_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 51 ); add_deprecated( SOUT_CFG_PREFIX "qp-max", VLC_FALSE ); /* Deprecated since 0.8.5 */ add_integer( SOUT_CFG_PREFIX "qpstep", 4, NULL, QPSTEP_TEXT, QPSTEP_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 51 ); add_float( SOUT_CFG_PREFIX "ratetol", 1.0, NULL, RATETOL_TEXT, RATETOL_LONGTEXT, VLC_FALSE ); change_float_range( 0, 100 ); add_deprecated( SOUT_CFG_PREFIX "tolerance", VLC_FALSE ); /* Deprecated since 0.8.5 */ add_integer( SOUT_CFG_PREFIX "vbv-maxrate", 0, NULL, VBV_MAXRATE_TEXT, VBV_MAXRATE_LONGTEXT, VLC_FALSE ); add_integer( SOUT_CFG_PREFIX "vbv-bufsize", 0, NULL, VBV_BUFSIZE_TEXT, VBV_BUFSIZE_LONGTEXT, VLC_FALSE ); add_float( SOUT_CFG_PREFIX "vbv-init", 0.9, NULL, VBV_INIT_TEXT, VBV_INIT_LONGTEXT, VLC_FALSE ); change_float_range( 0, 1 ); add_float( SOUT_CFG_PREFIX "ipratio", 1.40, NULL, IPRATIO_TEXT, IPRATIO_LONGTEXT, VLC_FALSE ); change_float_range( 1, 2 ); add_float( SOUT_CFG_PREFIX "pbratio", 1.30, NULL, PBRATIO_TEXT, PBRATIO_LONGTEXT, VLC_FALSE ); change_float_range( 1, 2 );#if X264_BUILD >= 23 /* r190 */ add_integer( SOUT_CFG_PREFIX "chroma-qp-offset", 0, NULL, CHROMA_QP_OFFSET_TEXT, CHROMA_QP_OFFSET_LONGTEXT, VLC_FALSE );#endif add_float( SOUT_CFG_PREFIX "qcomp", 0.60, NULL, QCOMP_TEXT, QCOMP_LONGTEXT, VLC_FALSE ); change_float_range( 0, 1 ); add_float( SOUT_CFG_PREFIX "cplxblur", 20.0, NULL, CPLXBLUR_TEXT, CPLXBLUR_LONGTEXT, VLC_FALSE ); add_float( SOUT_CFG_PREFIX "qblur", 0.5, NULL, QBLUR_TEXT, QBLUR_LONGTEXT, VLC_FALSE );/* Analysis */ /* x264 partitions = none (default). set at least "normal" mode. */ add_string( SOUT_CFG_PREFIX "partitions", "normal", NULL, ANALYSE_TEXT, ANALYSE_LONGTEXT, VLC_FALSE ); change_string_list( enc_analyse_list, enc_analyse_list_text, 0 ); add_deprecated( SOUT_CFG_PREFIX "analyse", VLC_FALSE ); /* Deprecated since 0.8.6 */ add_string( SOUT_CFG_PREFIX "direct", "spatial", NULL, DIRECT_PRED_TEXT, DIRECT_PRED_LONGTEXT, VLC_FALSE ); change_string_list( direct_pred_list, direct_pred_list_text, 0 );#if X264_BUILD >= 52 /* r573 */ add_integer( SOUT_CFG_PREFIX "direct-8x8", 0, NULL, DIRECT_PRED_SIZE_TEXT, DIRECT_PRED_SIZE_LONGTEXT, VLC_FALSE ); change_integer_range( -1, 1 );#endif#if X264_BUILD >= 0x0012 /* r134 */ add_bool( SOUT_CFG_PREFIX "weightb", 0, NULL, WEIGHTB_TEXT, WEIGHTB_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 24 /* r221 */ add_string( SOUT_CFG_PREFIX "me", "hex", NULL, ME_TEXT, ME_LONGTEXT, VLC_FALSE ); change_string_list( enc_me_list, enc_me_list_text, 0 ); add_integer( SOUT_CFG_PREFIX "merange", 16, NULL, MERANGE_TEXT, MERANGE_LONGTEXT, VLC_FALSE ); change_integer_range( 1, 64 );#endif add_integer( SOUT_CFG_PREFIX "subme", 5, NULL, SUBME_TEXT, SUBME_LONGTEXT, VLC_FALSE ); change_integer_range( 1, SUBME_MAX ); add_deprecated( SOUT_CFG_PREFIX "subpel", VLC_FALSE ); /* Deprecated since 0.8.5 */#if X264_BUILD >= 41 /* r368 */ add_bool( SOUT_CFG_PREFIX "b-rdo", 0, NULL, B_RDO_TEXT, B_RDO_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 36 /* r318 */ add_bool( SOUT_CFG_PREFIX "mixed-refs", 0, NULL, MIXED_REFS_TEXT, MIXED_REFS_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 23 /* r171 */ add_bool( SOUT_CFG_PREFIX "chroma-me", 1, NULL, CHROMA_ME_TEXT, CHROMA_ME_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 43 /* r390 */ add_bool( SOUT_CFG_PREFIX "bime", 0, NULL, BIME_TEXT, BIME_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 30 /* r251 */ add_bool( SOUT_CFG_PREFIX "8x8dct", 0, NULL, TRANSFORM_8X8DCT_TEXT, TRANSFORM_8X8DCT_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 39 /* r360 */ add_integer( SOUT_CFG_PREFIX "trellis", 0, NULL, TRELLIS_TEXT, TRELLIS_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 2 );#endif#if X264_BUILD >= 42 /* r384 */ add_bool( SOUT_CFG_PREFIX "fast-pskip", 1, NULL, FAST_PSKIP_TEXT, FAST_PSKIP_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 46 /* r503 */ add_bool( SOUT_CFG_PREFIX "dct-decimate", 1, NULL, DCT_DECIMATE_TEXT, DCT_DECIMATE_LONGTEXT, VLC_FALSE );#endif#if X264_BUILD >= 44 /* r398 */ add_integer( SOUT_CFG_PREFIX "nr", 0, NULL, NR_TEXT, NR_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 1000 );#endif#if X264_BUILD >= 52 /* r573 */ add_integer( SOUT_CFG_PREFIX "deadzone-inter", 21, NULL, DEADZONE_INTER_TEXT, DEADZONE_INTRA_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 32 ); add_integer( SOUT_CFG_PREFIX "deadzone-intra", 11, NULL, DEADZONE_INTRA_TEXT, DEADZONE_INTRA_LONGTEXT, VLC_FALSE ); change_integer_range( 0, 32 );#endif/* Input/Output */ add_bool( SOUT_CFG_PREFIX "asm", 1, NULL, ASM_TEXT, ASM_LONGTEXT, VLC_FALSE ); /* x264 psnr = 1 (default). disable PSNR computation for speed. */ add_bool( SOUT_CFG_PREFIX "psnr", 0, NULL, PSNR_TEXT, PSNR_LONGTEXT, VLC_FALSE );#if X264_BUILD >= 50 /* r554 */ /* x264 ssim = 1 (default). disable SSIM computation for speed. */ add_bool( SOUT_CFG_PREFIX "ssim", 0, NULL, SSIM_TEXT, SSIM_LONGTEXT, VLC_FALSE );#endif add_bool( SOUT_CFG_PREFIX "quiet", 0, NULL, QUIET_TEXT, QUIET_LONGTEXT, VLC_FALSE );#if X264_BUILD >= 47 /* r518 */ add_integer( SOUT_CFG_PREFIX "sps-id", 0, NULL, SPS_ID_TEXT, SPS_ID_LONGTEXT, VLC_FALSE );#endif add_bool( SOUT_CFG_PREFIX "aud", 0, NULL, AUD_TEXT, AUD_LONGTEXT, VLC_FALSE );#if X264_BUILD >= 0x000e /* r81 */ add_bool( SOUT_CFG_PREFIX "verbose", 0, NULL, VERBOSE_TEXT, VERBOSE_LONGTEXT, VLC_FALSE );#endifvlc_module_end();/***************************************************************************** * Local prototypes *****************************************************************************/static const char *ppsz_sout_options[] = { "8x8dct", "analyse", "asm", "aud", "bframes", "bime", "bpyramid", "b-adapt", "b-bias", "b-rdo", "cabac", "chroma-me", "chroma-qp-offset", "cplxblur", "crf", "dct-decimate", "deadzone-inter", "deadzone-intra", "deblock", "direct", "direct-8x8", "filter", "fast-pskip", "frameref", "interlaced", "ipratio", "keyint", "keyint-min", "level", "loopfilter", "me", "merange", "min-keyint", "mixed-refs", "nf", "nr", "partitions", "pbratio", "psnr", "qblur", "qp", "qcomp", "qpstep", "qpmax", "qpmin", "qp-max", "qp-min", "quiet", "ratetol", "ref", "scenecut", "sps-id", "ssim", "subme", "subpel", "tolerance", "trellis", "verbose", "vbv-bufsize", "vbv-init", "vbv-maxrate", "weightb", NULL};static block_t *Encode( encoder_t *, picture_t * );struct encoder_sys_t{ x264_t *h; x264_param_t param; int i_buffer; uint8_t *p_buffer; mtime_t i_last_ref_pts;};/***************************************************************************** * 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; }#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 sout_CfgParse( 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 ) ); p_sys->i_last_ref_pts = 0; 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;#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 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; var_Get( p_enc, SOUT_CFG_PREFIX "qpmax", &val ); if( val.i_int >= 0 && val.i_int <= 51 ) i_qmax = val.i_int; 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;#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 >= 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 >= 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 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -