Index: encoder/encoder.c =================================================================== --- encoder/encoder.c (revision 721) +++ encoder/encoder.c (working copy) @@ -422,7 +422,7 @@ h->param.i_width, h->param.i_height ); } - h->param.i_frame_reference = x264_clip3( h->param.i_frame_reference, 1, 16 ); + h->param.i_frame_reference = x264_clip3( h->param.i_frame_reference, X264_MAX(1, h->param.i_bframe), 16 ); if( h->param.i_keyint_max <= 0 ) h->param.i_keyint_max = 1; h->param.i_keyint_min = x264_clip3( h->param.i_keyint_min, 1, h->param.i_keyint_max/2+1 ); @@ -645,6 +645,8 @@ || h->param.rc.i_rc_method == X264_RC_CRF || h->param.b_bframe_adaptive || h->param.b_pre_scenecut ); + if(h->param.i_bframe > 1) + h->sps->vui.i_max_dec_frame_buffering++; h->frames.i_last_idr = - h->param.i_keyint_max; h->frames.i_input = 0; @@ -1330,16 +1332,12 @@ while( IS_X264_TYPE_B( h->frames.next[bframes]->i_type ) ) bframes++; x264_frame_push( h->frames.current, x264_frame_shift( &h->frames.next[bframes] ) ); - /* FIXME: when max B-frames > 3, BREF may no longer be centered after GOP closing */ - if( h->param.b_bframe_pyramid && bframes > 1 ) + while( bframes-- ) { - x264_frame_t *mid = x264_frame_shift( &h->frames.next[bframes/2] ); - mid->i_type = X264_TYPE_BREF; - x264_frame_push( h->frames.current, mid ); - bframes--; + x264_frame_t *f = x264_frame_shift( h->frames.next ); + f->i_type = X264_TYPE_BREF; + x264_frame_push( h->frames.current, f ); } - while( bframes-- ) - x264_frame_push( h->frames.current, x264_frame_shift( h->frames.next ) ); } TIMER_STOP( i_mtime_encode_frame );