[x264-devel] commit: Full sub8x8 RD mode decision (Jason Garrett-Glaser )
git version control
git at videolan.org
Fri Oct 31 16:57:56 CET 2008
x264 | branch: master | Jason Garrett-Glaser <darkshikari at gmail.com> | Tue Oct 28 20:35:15 2008 -0700| [a0a1bfac7f4a09159f6ef2bf13fb69548b6c5a02] | committer: Jason Garrett-Glaser
Full sub8x8 RD mode decision
Small speed penalty with p4x4 enabled, but significant quality gain at subme >= 6
As before, gain is proportional to the amount of p4x4 actually useful in a given input at the given bitrate.
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=a0a1bfac7f4a09159f6ef2bf13fb69548b6c5a02
---
encoder/analyse.c | 45 +++++++++++++++++++++++----------------------
1 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/encoder/analyse.c b/encoder/analyse.c
index 91b3cb9..8ae426f 100644
--- a/encoder/analyse.c
+++ b/encoder/analyse.c
@@ -1926,35 +1926,36 @@ static void x264_mb_analyse_p_rd( x264_t *h, x264_mb_analysis_t *a, int i_satd )
{
h->mb.i_type = P_8x8;
h->mb.i_partition = D_8x8;
- x264_analyse_update_cache( h, a );
- a->l0.i_cost8x8 = x264_rd_cost_mb( h, a->i_lambda2 );
-
if( h->param.analyse.inter & X264_ANALYSE_PSUB8x8 )
{
- /* FIXME: RD per subpartition */
- int part_bak[4];
- int i, i_cost;
- int b_sub8x8 = 0;
- for( i=0; i<4; i++ )
- {
- part_bak[i] = h->mb.i_sub_partition[i];
- b_sub8x8 |= (part_bak[i] != D_L0_8x8);
- }
- if( b_sub8x8 )
+ int i;
+ x264_macroblock_cache_ref( h, 0, 0, 2, 2, 0, a->l0.me8x8[0].i_ref );
+ x264_macroblock_cache_ref( h, 2, 0, 2, 2, 0, a->l0.me8x8[1].i_ref );
+ x264_macroblock_cache_ref( h, 0, 2, 2, 2, 0, a->l0.me8x8[2].i_ref );
+ x264_macroblock_cache_ref( h, 2, 2, 2, 2, 0, a->l0.me8x8[3].i_ref );
+ for( i = 0; i < 4; i++ )
{
- h->mb.i_sub_partition[0] = h->mb.i_sub_partition[1] =
- h->mb.i_sub_partition[2] = h->mb.i_sub_partition[3] = D_L0_8x8;
- x264_analyse_update_cache( h, a );
- i_cost = x264_rd_cost_mb( h, a->i_lambda2 );
- if( a->l0.i_cost8x8 < i_cost )
+ int costs[4] = {a->l0.i_cost4x4[i], a->l0.i_cost8x4[i], a->l0.i_cost4x8[i], a->l0.me8x8[i].cost};
+ int thresh = X264_MIN4( costs[0], costs[1], costs[2], costs[3] ) * 5 / 4;
+ int subtype, btype = D_L0_8x8;
+ uint64_t bcost = COST_MAX64;
+ for( subtype = D_L0_4x4; subtype <= D_L0_8x8; subtype++ )
{
- for( i=0; i<4; i++ )
- h->mb.i_sub_partition[i] = part_bak[i];
+ uint64_t cost;
+ if( costs[subtype] > thresh || (subtype == D_L0_8x8 && bcost == COST_MAX64) )
+ continue;
+ h->mb.i_sub_partition[i] = subtype;
+ x264_mb_cache_mv_p8x8( h, a, i );
+ cost = x264_rd_cost_part( h, a->i_lambda2, i<<2, PIXEL_8x8 );
+ COPY2_IF_LT( bcost, cost, btype, subtype );
}
- else
- a->l0.i_cost8x8 = i_cost;
+ h->mb.i_sub_partition[i] = btype;
+ x264_mb_cache_mv_p8x8( h, a, i );
}
}
+ else
+ x264_analyse_update_cache( h, a );
+ a->l0.i_cost8x8 = x264_rd_cost_mb( h, a->i_lambda2 );
}
else
a->l0.i_cost8x8 = COST_MAX;
More information about the x264-devel
mailing list