From: Anton Mitrofanov Date: Wed, 28 Oct 2009 19:57:11 +0000 (-0700) Subject: Fix case in which MB-tree didn't propagate all data correctly X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ecbe2b47036d62f05edcaedea381194ae50516f3;p=libx264 Fix case in which MB-tree didn't propagate all data correctly Should improve quality in all cases. Also some minor cosmetic improvements. --- diff --git a/encoder/slicetype.c b/encoder/slicetype.c index 8414dbb1..00f89c3f 100644 --- a/encoder/slicetype.c +++ b/encoder/slicetype.c @@ -506,7 +506,7 @@ static void x264_macroblock_tree( x264_t *h, x264_mb_analysis_t *a, x264_frame_t i--; last_nonb = i; - if( last_nonb < 0 ) + if( last_nonb < idx ) return; memset( frames[last_nonb]->i_propagate_cost, 0, h->mb.i_mb_count * sizeof(uint16_t) ); @@ -519,14 +519,14 @@ static void x264_macroblock_tree( x264_t *h, x264_mb_analysis_t *a, x264_frame_t break; x264_slicetype_frame_cost( h, a, frames, cur_nonb, last_nonb, last_nonb, 0 ); memset( frames[cur_nonb]->i_propagate_cost, 0, h->mb.i_mb_count * sizeof(uint16_t) ); - x264_macroblock_tree_propagate( h, frames, cur_nonb, last_nonb, last_nonb ); - while( frames[i]->i_type == X264_TYPE_B && i > 0 ) + while( i > cur_nonb ) { x264_slicetype_frame_cost( h, a, frames, cur_nonb, last_nonb, i, 0 ); memset( frames[i]->i_propagate_cost, 0, h->mb.i_mb_count * sizeof(uint16_t) ); x264_macroblock_tree_propagate( h, frames, cur_nonb, last_nonb, i ); i--; } + x264_macroblock_tree_propagate( h, frames, cur_nonb, last_nonb, last_nonb ); last_nonb = cur_nonb; }