]> granicus.if.org Git - libx264/commitdiff
don't treat vbv_maxrate as a minrate too if it's higher than target average bitrate.
authorLoren Merritt <pengvado@videolan.org>
Thu, 23 Nov 2006 03:13:18 +0000 (03:13 +0000)
committerLoren Merritt <pengvado@videolan.org>
Thu, 23 Nov 2006 03:13:18 +0000 (03:13 +0000)
git-svn-id: svn://svn.videolan.org/x264/trunk@602 df754926-b1dd-0310-bc7b-ec298dee348c

encoder/ratecontrol.c

index 072e1a313d4d88ccafb3996e811d2f4275760f12..bca875bd169195a34ec0d4d85ab17f0cff52d945 100644 (file)
@@ -80,6 +80,7 @@ struct x264_ratecontrol_t
     int b_abr;
     int b_2pass;
     int b_vbv;
+    int b_vbv_min_rate;
     double fps;
     double bitrate;
     double rate_tolerance;
@@ -228,7 +229,8 @@ int x264_ratecontrol_new( x264_t *h )
     else if( h->param.rc.i_vbv_max_bitrate > 0 &&
              h->param.rc.i_vbv_buffer_size > 0 )
     {
-        if( h->param.rc.i_vbv_buffer_size < 3 * h->param.rc.i_vbv_max_bitrate / rc->fps ) {
+        if( h->param.rc.i_vbv_buffer_size < 3 * h->param.rc.i_vbv_max_bitrate / rc->fps )
+        {
             h->param.rc.i_vbv_buffer_size = 3 * h->param.rc.i_vbv_max_bitrate / rc->fps;
             x264_log( h, X264_LOG_WARNING, "VBV buffer size too small, using %d kbit\n",
                       h->param.rc.i_vbv_buffer_size );
@@ -239,6 +241,9 @@ int x264_ratecontrol_new( x264_t *h )
         rc->cbr_decay = 1.0 - rc->buffer_rate / rc->buffer_size
                       * 0.5 * X264_MAX(0, 1.5 - rc->buffer_rate * rc->fps / rc->bitrate);
         rc->b_vbv = 1;
+        rc->b_vbv_min_rate = !rc->b_2pass
+                          && h->param.rc.i_rc_method == X264_RC_ABR
+                          && h->param.rc.i_vbv_max_bitrate <= h->param.rc.i_bitrate;
     }
     else if( h->param.rc.i_vbv_max_bitrate )
     {
@@ -709,6 +714,9 @@ void x264_ratecontrol_mb( x264_t *h, int bits )
             int i_qp_min = X264_MAX( prev_row_qp - h->param.rc.i_qp_step, h->param.rc.i_qp_min );
             float buffer_left_planned = rc->buffer_fill - rc->frame_size_planned;
 
+            if( !rc->b_vbv_min_rate )
+                i_qp_min = X264_MAX( i_qp_min, h->sh.i_qp );
+
             while( rc->qpm < i_qp_max
                    && (b1 > rc->frame_size_planned * 1.15
                     || (rc->buffer_fill - b1 < buffer_left_planned * 0.5)))
@@ -1130,6 +1138,9 @@ static double clip_qscale( x264_t *h, int pict_type, double q )
             }
             q = X264_MAX( q0-5, q );
         }
+
+        if( !rcc->b_vbv_min_rate )
+            q = X264_MAX( q0, q );
     }
 
     if(lmin==lmax)