]> git.sesse.net Git - vlc/blobdiff - modules/codec/x264.c
ALL: backport of 13058,13059,13070,13088,13090,13091,13099 from trunk.
[vlc] / modules / codec / x264.c
index ec45a7321b23b952277cbfda6144121f32f75fa0..1a82a6eacb2da5f490d3889488c3048495fd0a43 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * x264.c: h264 video encoder
  *****************************************************************************
- * Copyright (C) 2004 VideoLAN
+ * Copyright (C) 2004 the VideoLAN team
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
@@ -121,10 +121,11 @@ static void Close( vlc_object_t * );
 static char *enc_analyse_list[] =
   { "", "all", "normal", "fast", "none" };
 static char *enc_analyse_list_text[] =
-  { N_("default"), N_("all"), N_("normal"), N_("fast"), N_("none") };
+  { N_("default"), N_("all"), N_("slow"), N_("normal"),
+    N_("fast"), N_("none") };
 
 vlc_module_begin();
-    set_description( _("h264 video encoder using x264 library"));
+    set_description( _("H264 encoder (using x264 library)"));
     set_capability( "encoder", 200 );
     set_callbacks( Open, Close );
     set_category( CAT_INPUT );
@@ -185,9 +186,15 @@ vlc_module_begin();
                  SCENE_LONGTEXT, VLC_FALSE );
         change_integer_range( -1, 100 );
 
+#if X264_BUILD >= 30
+    add_integer( SOUT_CFG_PREFIX "subpel", 6, NULL, SUBPEL_TEXT,
+                 SUBPEL_LONGTEXT, VLC_FALSE );
+        change_integer_range( 1, 6 );
+#else
     add_integer( SOUT_CFG_PREFIX "subpel", 5, NULL, SUBPEL_TEXT,
                  SUBPEL_LONGTEXT, VLC_FALSE );
         change_integer_range( 1, 5 );
+#endif
 
 vlc_module_end();
 
@@ -229,6 +236,7 @@ static int  Open ( vlc_object_t *p_this )
         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 )
     {
@@ -246,6 +254,7 @@ static int  Open ( vlc_object_t *p_this )
                   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 );
 
@@ -258,8 +267,12 @@ static int  Open ( vlc_object_t *p_this )
     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 >> 4 << 4;
-    p_sys->param.i_height = p_enc->fmt_in.video.i_height >> 4 << 4;
+    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
 
     var_Get( p_enc, SOUT_CFG_PREFIX "qp-min", &val );
     if( val.i_int >= 1 && val.i_int <= 51 ) i_qmin = val.i_int;
@@ -349,10 +362,17 @@ static int  Open ( vlc_object_t *p_this )
 
 #if X264_BUILD >= 22
     var_Get( p_enc, SOUT_CFG_PREFIX "subpel", &val );
+#if X264_BUILD >= 30
+    if( val.i_int >= 1 && val.i_int <= 6 )
+#else
     if( val.i_int >= 1 && val.i_int <= 5 )
+#endif
         p_sys->param.analyse.i_subpel_refine = val.i_int;
 #endif
 
+#ifndef X264_ANALYSE_BSUB16x16
+#   define X264_ANALYSE_BSUB16x16 0
+#endif
     var_Get( p_enc, SOUT_CFG_PREFIX "analyse", &val );
     if( !strcmp( val.psz_string, "none" ) )
     {
@@ -367,14 +387,23 @@ static int  Open ( vlc_object_t *p_this )
         p_sys->param.analyse.inter =
             X264_ANALYSE_I4x4 | X264_ANALYSE_PSUB16x16;
     }
+    else if( !strcmp( val.psz_string, "slow" ) )
+    {
+        p_sys->param.analyse.inter =
+            X264_ANALYSE_I4x4 |
+            X264_ANALYSE_PSUB16x16 | X264_ANALYSE_PSUB8x8 |
+            X264_ANALYSE_BSUB16x16;
+    }
     else if( !strcmp( val.psz_string, "all" ) )
     {
-#ifndef X264_ANALYSE_BSUB16x16
-#   define X264_ANALYSE_BSUB16x16 0
-#endif
         p_sys->param.analyse.inter =
-            X264_ANALYSE_I4x4 | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_PSUB8x8 |
+            X264_ANALYSE_I4x4 |
+            X264_ANALYSE_PSUB16x16 | X264_ANALYSE_PSUB8x8 |
             X264_ANALYSE_BSUB16x16;
+#ifdef X264_ANALYSE_I8x8
+        p_sys->param.analyse.inter |= X264_ANALYSE_I8x8;
+        p_sys->param.analyse.b_transform_8x8 = 1;
+#endif
     }
     if( val.psz_string ) free( val.psz_string );
 
@@ -386,7 +415,7 @@ static int  Open ( vlc_object_t *p_this )
         i_num = p_enc->fmt_in.video.i_aspect *
             (int64_t)p_enc->fmt_in.video.i_height;
         i_den = VOUT_ASPECT_FACTOR * p_enc->fmt_in.video.i_width;
-        vlc_reduce( &i_dst_num, &i_dst_den, i_num, i_den, 0 );
+        vlc_ureduce( &i_dst_num, &i_dst_den, i_num, i_den, 0 );
 
         p_sys->param.vui.i_sar_width = i_dst_num;
         p_sys->param.vui.i_sar_height = i_dst_den;
@@ -531,7 +560,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict )
 }
 
 /*****************************************************************************
- * CloseEncoder: ffmpeg encoder destruction
+ * CloseEncoder: x264 encoder destruction
  *****************************************************************************/
 static void Close( vlc_object_t *p_this )
 {