From: Fiona Glaser Date: Wed, 19 Aug 2009 04:53:28 +0000 (-0700) Subject: Fix MB-tree with keyint<3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e824bbcafaf16a4736db0028fdf6dd542f3ed35;p=libx264 Fix MB-tree with keyint<3 Also slightly improve VBV keyint handling. --- diff --git a/encoder/encoder.c b/encoder/encoder.c index 03faab47..3c95e860 100644 --- a/encoder/encoder.c +++ b/encoder/encoder.c @@ -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; diff --git a/encoder/slicetype.c b/encoder/slicetype.c index d4a80834..54a07fab 100644 --- a/encoder/slicetype.c +++ b/encoder/slicetype.c @@ -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 ); } }