diff --git a/encoder/slicetype.c b/encoder/slicetype.c index e00be6f..9f8f704 100644 --- a/encoder/slicetype.c +++ b/encoder/slicetype.c @@ -533,14 +533,13 @@ no_b_frames: if( h->param.b_pre_scenecut && scenecut( h, frames[j+1], j+1 ) ) { frames[j]->i_type = X264_TYPE_P; - frames[j+1]->i_type = idr_frame_type; return; } frames[j]->i_type = X264_TYPE_B; } frames[num_bframes+1]->i_type = X264_TYPE_P; } - else + else if( h->param.i_bframe_adaptive == X264_B_ADAPT_FAST ) { cost2p1 = x264_slicetype_frame_cost( h, &a, frames, 0, 2, 2, 1 ); if( frames[2]->i_intra_mbs[2] > i_mb_count / 2 ) @@ -572,6 +571,34 @@ no_b_frames: frames[j]->i_type = X264_TYPE_B; } } + else + { + int max_bframes = X264_MIN(num_frames-1, h->param.i_bframe); + if( h->param.b_pre_scenecut ) + { + x264_slicetype_frame_cost( h, &a, frames, 0, 1, 1, 0 ); + if( scenecut( h, frames[1], 1 ) ) + { + frames[1]->i_type = idr_frame_type; + return; + } + } + + for( j = 1; j < max_bframes+1; j++ ) + { + if( h->param.b_pre_scenecut ) + { + x264_slicetype_frame_cost( h, &a, frames, 0, j+1, j+1, 0 ); + if( scenecut( h, frames[j+1], j+1 ) ) + { + frames[j]->i_type = X264_TYPE_P; + return; + } + } + frames[j]->i_type = X264_TYPE_B; + } + frames[max_bframes+1]->i_type = X264_TYPE_P; + } } void x264_slicetype_decide( x264_t *h )