diff --git a/vp8/common/entropymode.h b/vp8/common/entropymode.h index 5c14ccaded9ba659d58e5464214cf8f79e915b81..09d5c7704253c61a2c59d9993eb5f54cf75db3b3 100644 --- a/vp8/common/entropymode.h +++ b/vp8/common/entropymode.h @@ -65,8 +65,11 @@ extern struct vp8_token_struct vp8_small_mvencodings_hp [16]; void vp8_entropy_mode_init(void); void vp8_init_mbmode_probs(VP8_COMMON *x); - +extern void vp8_init_mode_contexts(VP8_COMMON *pc); extern void vp8_update_mode_context(VP8_COMMON *pc);; +extern void vp8_accum_mv_refs(VP8_COMMON *pc, + MB_PREDICTION_MODE m, + const int ct[4]); void vp8_default_bmode_probs(vp8_prob dest [VP8_BINTRAMODES-1]); void vp8_kf_default_bmode_probs(vp8_prob dest [VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES-1]); diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c index 0f5a647256862649dbedbf445cc95f8c47157341..a70d1113b5eb498d80b9c31b102e10eabcb8b133 100644 --- a/vp8/decoder/decodemv.c +++ b/vp8/decoder/decodemv.c @@ -644,7 +644,6 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, const int mis = pbi->common.mode_info_stride; MACROBLOCKD *const xd = & pbi->mb; - int pred_context; int index = mb_row * pbi->common.mb_cols + mb_col; int_mv *const mv = & mbmi->mv; int mb_to_left_edge; diff --git a/vp8/decoder/detokenize.c b/vp8/decoder/detokenize.c index d3566fae5139c822e2f00e4df3755b8e7442c318..ae105b139ed8d23eeabb592b26ea2ca60434c44f 100644 --- a/vp8/decoder/detokenize.c +++ b/vp8/decoder/detokenize.c @@ -265,8 +265,8 @@ int vp8_decode_mb_tokens_8x8(VP8D_COMP *dx, MACROBLOCKD *x) char *eobs = x->eobs; - ENTROPY_CONTEXT *a, *a1; - ENTROPY_CONTEXT *l, *l1; + ENTROPY_CONTEXT *a; + ENTROPY_CONTEXT *l; int i; int eobtotal = 0; diff --git a/vp8/encoder/quantize.h b/vp8/encoder/quantize.h index 93a1b714c4721d57ed007bd328e42c93e2ac71bc..37221839eea2e557396fb941371872abcd33c954 100644 --- a/vp8/encoder/quantize.h +++ b/vp8/encoder/quantize.h @@ -108,6 +108,9 @@ extern prototype_quantize_mb(vp8_quantize_mby); extern void vp8_strict_quantize_b(BLOCK *b,BLOCKD *d); extern void vp8_strict_quantize_b_8x8(BLOCK *b,BLOCKD *d); extern void vp8_strict_quantize_b_2x2(BLOCK *b,BLOCKD *d); +extern prototype_quantize_mb(vp8_quantize_mby_8x8); +extern prototype_quantize_mb(vp8_quantize_mbuv_8x8); + struct VP8_COMP; extern void vp8_set_quantizer(struct VP8_COMP *cpi, int Q); extern void vp8cx_frame_init_quantizer(struct VP8_COMP *cpi); diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 085d8c4cf851fdc6cf6ff1efd19aac8c2ae946f8..fd64182f20c3e5e32c358171817f507a58284402 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -759,12 +759,10 @@ static void macro_block_yrd_8x8( MACROBLOCK *mb, int *Distortion, const VP8_ENCODER_RTCD *rtcd) { - int b; MACROBLOCKD *const x = &mb->e_mbd; BLOCK *const mb_y2 = mb->block + 24; BLOCKD *const x_y2 = x->block + 24; short *Y2DCPtr = mb_y2->src_diff; - BLOCK *beptr; int d; ENCODEMB_INVOKE(&rtcd->encodemb, submby) @@ -1365,7 +1363,11 @@ static int rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate, return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); } -static void rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_tokenonly, int *distortion) +static void rd_pick_intra_mbuv_mode(VP8_COMP *cpi, + MACROBLOCK *x, + int *rate, + int *rate_tokenonly, + int *distortion) { MB_PREDICTION_MODE mode; MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); @@ -1441,6 +1443,55 @@ static void rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int #endif } +static void rd_pick_intra_mbuv_mode_8x8(VP8_COMP *cpi, + MACROBLOCK *x, + int *rate, + int *rate_tokenonly, + int *distortion) +{ + MB_PREDICTION_MODE mode; + MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); + int best_rd = INT_MAX; + int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); + int rate_to; + + for (mode = DC_PRED; mode <= TM_PRED; mode++) + { + int rate; + int distortion; + int this_rd; + + x->e_mbd.mode_info_context->mbmi.uv_mode = mode; + RECON_INVOKE(&cpi->rtcd.common->recon, build_intra_predictors_mbuv) + (&x->e_mbd); + ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), submbuv)(x->src_diff, + x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, + x->src.uv_stride); + vp8_transform_mbuv_8x8(x); + + vp8_quantize_mbuv_8x8(x); + + rate_to = rd_cost_mbuv_8x8(x); + rate = rate_to + x->intra_uv_mode_cost[x->e_mbd.frame_type] + [x->e_mbd.mode_info_context->mbmi.uv_mode]; + + distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; + this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); + + if (this_rd < best_rd) + { + best_rd = this_rd; + d = distortion; + r = rate; + *rate_tokenonly = rate_to; + mode_selected = mode; + } + } + *rate = r; + *distortion = d; + x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected; +} + int vp8_cost_mv_ref(VP8_COMMON *pc, MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) @@ -2466,6 +2517,7 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int int rate2, distortion2; int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; int uv_intra_skippable = 0; + int uv_intra_rate_8x8, uv_intra_distortion_8x8, uv_intra_rate_tokenonly_8x8; int uv_intra_skippable_8x8=0; int rate_y, UNINITIALIZED_IS_SAFE(rate_uv); int distortion_uv; @@ -2477,6 +2529,8 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int //int intermodecost[MAX_MODES]; MB_PREDICTION_MODE uv_intra_mode; + MB_PREDICTION_MODE uv_intra_mode_8x8; + int_mv mvp; int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; int saddone=0; @@ -2556,13 +2610,21 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int /* Initialize zbin mode boost for uv costing */ cpi->zbin_mode_boost = 0; vp8_update_zbin_extra(cpi, x); - rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly, &uv_intra_distortion); - uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; + rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, + &uv_intra_rate_tokenonly, &uv_intra_distortion); + uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; uv_intra_skippable = mbuv_is_skippable(&x->e_mbd); /* rough estimate for now */ - uv_intra_skippable_8x8 = uv_intra_skippable; + if(cpi->common.txfm_mode==ALLOW_8X8) + { + rd_pick_intra_mbuv_mode_8x8(cpi, x, &uv_intra_rate_8x8, + &uv_intra_rate_tokenonly_8x8, + &uv_intra_distortion_8x8); + uv_intra_mode_8x8 = x->e_mbd.mode_info_context->mbmi.uv_mode; + uv_intra_skippable_8x8 = mbuv_is_skippable_8x8(&x->e_mbd); + } // Get estimates of reference frame costs for each reference frame // that depend on the current prediction etc. @@ -2775,10 +2837,20 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rate2 += rate_y; distortion2 += distortion; rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode]; - rate2 += uv_intra_rate; - rate_uv = uv_intra_rate_tokenonly; - distortion2 += uv_intra_distortion; - distortion_uv = uv_intra_distortion; + if(cpi->common.txfm_mode == ALLOW_8X8) + { + rate2 += uv_intra_rate_8x8; + rate_uv = uv_intra_rate_tokenonly_8x8; + distortion2 += uv_intra_distortion_8x8; + distortion_uv = uv_intra_distortion_8x8; + } + else + { + rate2 += uv_intra_rate; + rate_uv = uv_intra_rate_tokenonly; + distortion2 += uv_intra_distortion; + distortion_uv = uv_intra_distortion; + } break; case NEWMV: @@ -3250,7 +3322,12 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int if (this_mode <= B_PRED) { - x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; + if( cpi->common.txfm_mode == ALLOW_8X8 + && this_mode != B_PRED + && this_mode != I8X8_PRED) + x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode_8x8; + else + x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; /* required for left and above block mv */ x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; } diff --git a/vp8/encoder/temporal_filter.c b/vp8/encoder/temporal_filter.c index 6c8b45857e7cb8978ff49473468f8e3f48902249..7440883e07e4bd35ad4d88a2f4e70fd8987e9a4f 100644 --- a/vp8/encoder/temporal_filter.c +++ b/vp8/encoder/temporal_filter.c @@ -116,7 +116,7 @@ void vp8_temporal_filter_apply_c unsigned short *count ) { - int i, j, k; + unsigned int i, j, k; int modifier; int byte = 0; diff --git a/vp8/encoder/tokenize.h b/vp8/encoder/tokenize.h index 545c5d04531aa29343691b58a810b438d7247d64..0608102d053cc0fef794c36e3373bc9531a2af86 100644 --- a/vp8/encoder/tokenize.h +++ b/vp8/encoder/tokenize.h @@ -33,6 +33,13 @@ typedef struct int rd_cost_mby(MACROBLOCKD *); +extern int mby_is_skippable(MACROBLOCKD *x,int has_y2_block); +extern int mbuv_is_skippable(MACROBLOCKD *x); +extern int mb_is_skippable(MACROBLOCKD *x,int has_y2_block); +extern int mby_is_skippable_8x8(MACROBLOCKD *x); +extern int mbuv_is_skippable_8x8(MACROBLOCKD *x); +extern int mb_is_skippable_8x8(MACROBLOCKD *x); + #ifdef ENTROPY_STATS void init_context_counters(); void print_context_counters();