X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fx264.c;h=b7778c18f9b3d159ff30c4a3f1edf5eae8b98e6a;hb=35368806703006bd60d50675ef572aea64d4cc43;hp=1d00d5b5264a6564978a83081ce5d7021be6b6e0;hpb=a3ae4031787e58afaab9a7695e5f1a9126fe73fd;p=vlc diff --git a/modules/codec/x264.c b/modules/codec/x264.c index 1d00d5b526..b7778c18f9 100644 --- a/modules/codec/x264.c +++ b/modules/codec/x264.c @@ -40,13 +40,21 @@ #ifdef PTW32_STATIC_LIB #include #endif +#ifdef MODULE_NAME_IS_x262 +#include +#else #include +#endif #include #ifdef MODULE_NAME_IS_x26410b #define SOUT_CFG_PREFIX "sout-x26410b-" -#else +#endif +#ifdef MODULE_NAME_IS_x262 +#define SOUT_CFG_PREFIX "sout-x262-" +#endif +#ifdef MODULE_NAME_IS_x264 #define SOUT_CFG_PREFIX "sout-x264-" #endif @@ -271,7 +279,7 @@ static void x264_log( void *, int i_level, const char *psz, va_list ); "(p4x4 requires p8x8. i8x8 requires 8x8dct).") #define DIRECT_PRED_TEXT N_("Direct MV prediction mode") -#define DIRECT_PRED_LONGTEXT N_( "Direct MV prediction mode.") +#define DIRECT_PRED_LONGTEXT DIRECT_PRED_TEXT #define DIRECT_PRED_SIZE_TEXT N_("Direct prediction size") #define DIRECT_PRED_SIZE_LONGTEXT N_( "Direct prediction size: "\ @@ -321,7 +329,6 @@ static void x264_log( void *, int i_level, const char *psz, va_list ); "tradeoffs involved in the motion estimation decision process " \ "(lower = quicker and higher = better quality). Range 1 to 9." ) -#define B_RDO_TEXT N_("RD based mode decision for B-frames") #define B_RDO_LONGTEXT N_( "RD based mode decision for B-frames. This " \ "requires subme 6 (or higher).") @@ -334,7 +341,6 @@ static void x264_log( void *, int i_level, const char *psz, va_list ); #define CHROMA_ME_LONGTEXT N_( "Chroma ME for subpel and mode decision in " \ "P-frames.") -#define BIME_TEXT N_("Jointly optimize both MVs in B-frames") #define BIME_LONGTEXT N_( "Joint bidirectional motion refinement.") #define TRANSFORM_8X8DCT_TEXT N_("Adaptive spatial transform size") @@ -428,14 +434,14 @@ static const char *const bpyramid_list[] = static const char *const enc_analyse_list[] = { "none", "fast", "normal", "slow", "all" }; static const char *const enc_analyse_list_text[] = - { N_("none"), N_("fast"), N_("normal"), N_("slow"), N_("all") }; + { N_("None"), N_("Fast"), N_("Normal"), N_("Slow"), N_("All") }; static const char *const direct_pred_list[] = { "none", "spatial", "temporal", "auto" }; static const char *const direct_pred_list_text[] = - { N_("none"), N_("spatial"), N_("temporal"), N_("auto") }; + { N_("None"), N_("Spatial"), N_("Temporal"), N_("Auto") }; -static const int const framepacking_list[] = +static const int framepacking_list[] = { -1, 0, 1, 2, 3, 4, 5 }; static const char *const framepacking_list_text[] = { "", N_("checkerboard"), N_("column alternation"), N_("row alternation"), N_("side by side"), N_("top bottom"), N_("frame alternation") }; @@ -444,7 +450,12 @@ vlc_module_begin () #ifdef MODULE_NAME_IS_x26410b set_description( N_("H.264/MPEG-4 Part 10/AVC encoder (x264 10-bit)")) set_capability( "encoder", 0 ) -#else +#endif +#ifdef MODULE_NAME_IS_x262 + set_description( N_("H.262/MPEG-2 encoder (x262)")) + set_capability( "encoder", 0 ) +#endif +#ifdef MODULE_NAME_IS_x264 set_description( N_("H.264/MPEG-4 Part 10/AVC encoder (x264)")) set_capability( "encoder", 200 ) #endif @@ -801,18 +812,30 @@ static int Open ( vlc_object_t *p_this ) int i, i_nal; bool fullrange = false; +#ifdef MODULE_NAME_IS_x262 + if( p_enc->fmt_out.i_codec != VLC_CODEC_MP2V && +#else if( p_enc->fmt_out.i_codec != VLC_CODEC_H264 && +#endif !p_enc->b_force ) { return VLC_EGENERIC; } /* X264_POINTVER or X264_VERSION are not available */ +#ifdef MODULE_NAME_IS_x262 + msg_Dbg ( p_enc, "version x262 0.%d.X", X264_BUILD ); +#else msg_Dbg ( p_enc, "version x264 0.%d.X", X264_BUILD ); +#endif config_ChainParse( p_enc, SOUT_CFG_PREFIX, ppsz_sout_options, p_enc->p_cfg ); p_enc->fmt_out.i_cat = VIDEO_ES; +#ifdef MODULE_NAME_IS_x262 + p_enc->fmt_out.i_codec = VLC_CODEC_MP2V; +#else p_enc->fmt_out.i_codec = VLC_CODEC_H264; +#endif p_enc->p_sys = p_sys = malloc( sizeof( encoder_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; @@ -826,13 +849,14 @@ static int Open ( vlc_object_t *p_this ) { const int mask = x264_bit_depth > 8 ? X264_CSP_HIGH_DEPTH : 0; -#ifdef MODULE_NAME_IS_x26410b + +# ifdef MODULE_NAME_IS_x26410b if( mask == 0) { msg_Err( p_enc, "Only high bith depth encoding supported, bit depth:%d", x264_bit_depth); return VLC_EGENERIC; } -#endif +# endif if( !strcmp( psz_profile, "high10" ) ) { @@ -849,22 +873,22 @@ static int Open ( vlc_object_t *p_this ) p_enc->fmt_in.i_codec = mask ? VLC_CODEC_I444_10L : fullrange ? VLC_CODEC_J444 : VLC_CODEC_I444; p_sys->i_colorspace = X264_CSP_I444 | mask; } -#ifdef MODULE_NAME_IS_x26410b +# ifdef MODULE_NAME_IS_x26410b else { msg_Err( p_enc, "Only high-profiles and 10-bit are supported"); return VLC_EGENERIC; } -#endif +# endif } -#ifdef MODULE_NAME_IS_x26410b +# ifdef MODULE_NAME_IS_x26410b else { msg_Err( p_enc, "Only high-profiles and 10-bit are supported"); return VLC_EGENERIC; } -#endif +# endif free( psz_profile ); #endif //X264_BUILD @@ -875,7 +899,6 @@ static int Open ( vlc_object_t *p_this ) p_sys->i_sei_size = 0; p_sys->p_sei = NULL; - x264_param_default( &p_sys->param ); char *psz_preset = var_GetString( p_enc, SOUT_CFG_PREFIX "preset" ); char *psz_tune = var_GetString( p_enc, SOUT_CFG_PREFIX "tune" ); if( *psz_preset == '\0' ) @@ -883,12 +906,19 @@ static int Open ( vlc_object_t *p_this ) free(psz_preset); psz_preset = NULL; } +#ifdef MODULE_NAME_IS_x262 + p_sys->param.b_mpeg2 = true; + x264_param_default_mpeg2( &p_sys->param ); + x264_param_default_preset_mpeg2( &p_sys->param, psz_preset, psz_tune ); +#else + x264_param_default( &p_sys->param ); x264_param_default_preset( &p_sys->param, psz_preset, psz_tune ); +#endif free( psz_preset ); free( psz_tune ); p_sys->param.i_csp = p_sys->i_colorspace; - p_sys->param.i_width = p_enc->fmt_in.video.i_width; - p_sys->param.i_height = p_enc->fmt_in.video.i_height; + p_sys->param.i_width = p_enc->fmt_in.video.i_visible_width; + p_sys->param.i_height = p_enc->fmt_in.video.i_visible_height; p_sys->param.vui.b_fullrange = fullrange; if( fabs(var_GetFloat( p_enc, SOUT_CFG_PREFIX "qcomp" ) - 0.60) > 0.005 ) @@ -1437,7 +1467,6 @@ static void x264_log( void *data, int i_level, const char *psz, va_list args) i_level = VLC_MSG_INFO; break; case X264_LOG_DEBUG: - i_level = VLC_MSG_DBG; default: i_level = VLC_MSG_DBG; } @@ -1506,7 +1535,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict ) p_block->i_flags |= BLOCK_FLAG_TYPE_I; else if( pic.i_type == X264_TYPE_P || pic.i_type == X264_TYPE_I ) p_block->i_flags |= BLOCK_FLAG_TYPE_P; - else if( pic.i_type == X264_TYPE_B ) + else if( IS_X264_TYPE_B( pic.i_type ) ) p_block->i_flags |= BLOCK_FLAG_TYPE_B; else p_block->i_flags |= BLOCK_FLAG_TYPE_PB; @@ -1534,10 +1563,11 @@ static void Close( vlc_object_t *p_this ) free( p_sys->psz_stat_name ); free( p_sys->p_sei ); - msg_Dbg( p_enc, "framecount still in libx264 buffer: %d", x264_encoder_delayed_frames( p_sys->h ) ); - if( p_sys->h ) + { + msg_Dbg( p_enc, "framecount still in libx264 buffer: %d", x264_encoder_delayed_frames( p_sys->h ) ); x264_encoder_close( p_sys->h ); + } #ifdef PTW32_STATIC_LIB vlc_mutex_lock( &pthread_win32_mutex );