]> granicus.if.org Git - libx264/commitdiff
Fix MB-tree with keyint<3
authorFiona Glaser <fiona@x264.com>
Wed, 19 Aug 2009 04:53:28 +0000 (21:53 -0700)
committerFiona Glaser <fiona@x264.com>
Wed, 19 Aug 2009 04:53:28 +0000 (21:53 -0700)
Also slightly improve VBV keyint handling.

encoder/encoder.c
encoder/slicetype.c

index 03faab47b525151f0d3e30d522b1e3eb7dda4abe..3c95e860614a73afea38d5b7379f0ed2e4b318bd 100644 (file)
@@ -496,7 +496,7 @@ static int x264_validate_parameters( x264_t *h )
 
     if( h->param.rc.b_stat_read )
         h->param.rc.i_lookahead = 0;
-    else if( !h->param.rc.i_lookahead )
+    else if( !h->param.rc.i_lookahead || h->param.i_keyint_max == 1 )
         h->param.rc.b_mb_tree = 0;
     if( h->param.rc.f_qcompress == 1 )
         h->param.rc.b_mb_tree = 0;
index d4a8083475d046b2a7eb6537faa1e5fe243a76f9..54a07fabd483b4ad6d9b75374252fdd605eb5e2a 100644 (file)
@@ -848,21 +848,19 @@ static void x264_slicetype_analyse( x264_t *h, int keyframe )
             frames[j]->i_type = X264_TYPE_P;
 
     /* Perform the actual macroblock tree analysis.
-     * Don't go farther than the lookahead parameter; this helps in short GOPs. */
+     * Don't go farther than the maximum keyframe interval; this helps in short GOPs. */
     if( h->param.rc.b_mb_tree )
-        x264_macroblock_tree( h, &a, frames, X264_MIN(num_frames, h->param.rc.i_lookahead), keyframe );
+        x264_macroblock_tree( h, &a, frames, X264_MIN(num_frames, h->param.i_keyint_max), keyframe );
 
     /* Enforce keyframe limit. */
     for( j = 0; j < num_frames; j++ )
     {
-        if( (j+1)%h->param.i_keyint_max > keyint_limit )
+        if( ((j-keyint_limit) % h->param.i_keyint_max) == 0 )
         {
             if( j )
                 frames[j]->i_type = X264_TYPE_P;
-            frames[j+1]->i_type = idr_frame_type;
-            if( j <= num_bframes )
-                reset_start = j+2;
-            break;
+            frames[j+1]->i_type = X264_TYPE_IDR;
+            reset_start = X264_MIN( reset_start, j+2 );
         }
     }