]> git.sesse.net Git - vlc/blobdiff - modules/codec/avcodec/encoder.c
avcodec: default gop=120 for vp80
[vlc] / modules / codec / avcodec / encoder.c
index 7159effffc27d7208605e8addfbce307d67c30ff..90e76e65868982f0021f05a4da18d7476864134b 100644 (file)
@@ -500,7 +500,8 @@ int OpenEncoder( vlc_object_t *p_this )
         if ( p_sys->i_qmin > 0 && p_sys->i_qmin == p_sys->i_qmax )
             p_context->flags |= CODEC_FLAG_QSCALE;
         /* These codecs cause libavcodec to exit if thread_count is > 1.
-           See libavcodec/mpegvideo_enc.c:MPV_encode_init
+           See libavcodec/mpegvideo_enc.c:MPV_encode_init and
+           libavcodec/svq3.c , WMV2 calls MPV_encode_init also.
          */
         if ( i_codec_id == CODEC_ID_FLV1 ||
              i_codec_id == CODEC_ID_H261 ||
@@ -512,6 +513,7 @@ int OpenEncoder( vlc_object_t *p_this )
              i_codec_id == CODEC_ID_MSMPEG4V2 ||
              i_codec_id == CODEC_ID_MSMPEG4V3 ||
              i_codec_id == CODEC_ID_WMV1 ||
+             i_codec_id == CODEC_ID_WMV2 ||
              i_codec_id == CODEC_ID_RV10 ||
              i_codec_id == CODEC_ID_RV20 ||
              i_codec_id == CODEC_ID_SVQ3 )
@@ -593,23 +595,54 @@ int OpenEncoder( vlc_object_t *p_this )
     /* Misc parameters */
     p_context->bit_rate = p_enc->fmt_out.i_bitrate;
 
-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 68, 2 )
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 69, 2 )
     /* Set reasonable defaults to VP8, based on
        libvpx-720p preset from libvpx ffmpeg-patch */
     if( i_codec_id == CODEC_ID_VP8 )
     {
+        /* Lets give bitrate tolerance */
         p_context->bit_rate_tolerance = __MAX(2 * p_enc->fmt_out.i_bitrate, p_sys->i_vtolerance );
-        /* I used Harrison-stetson method here to get there values */
-        p_context->rc_max_rate = 3 * p_enc->fmt_out.i_bitrate;
-        p_context->rc_min_rate = p_enc->fmt_out.i_bitrate / 200;
+        /* default to 120 frames between keyframe */
+        if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" ) )
+           p_context->gop_size = 120;
+        /* seems that ffmpeg presets have 720p as divider for buffers */
+        if( p_enc->fmt_out.video.i_width >= 720 )
+        {
+           /* Check that we don't overrun users qmin/qmax values */
+           if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
+           {
+              p_context->mb_qmin = p_context->qmin = 10;
+              p_context->mb_lmin = p_context->lmin = 10 * FF_QP2LAMBDA;
+           }
+
+           if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmax" ) )
+           {
+              p_context->mb_qmax = p_context->qmax = 42;
+              p_context->mb_lmax = p_context->lmax = 42 * FF_QP2LAMBDA;
+           }
+
+           p_context->rc_max_rate = 24 * 1000 * 1000; //24M
+           p_context->rc_min_rate = 100 * 1000; // 100k
+        } else {
+           if( !var_GetInteger( p_enc, ENC_CFG_PREFIX "qmin" ) )
+           {
+              p_context->mb_qmin = p_context->qmin = FF_QP2LAMBDA;
+              p_context->mb_lmin = p_context->lmin = FF_QP2LAMBDA;
+           }
+
+           p_context->rc_max_rate = 1.5 * 1000 * 1000; //1.5M
+           p_context->rc_min_rate = 40 * 1000; // 40k
+        }
 
 
+#if 0 /* enable when/if vp8 encoder is accepted in libavcodec */
         p_context->lag = 16;
         p_context->level = 216;
         p_context->profile = 0;
         p_context->rc_buffer_aggressivity = 0.95;
         p_context->token_partitions = 4;
         p_context->mb_static_threshold = 0;
+#endif
     }
 #endif