diff options
Diffstat (limited to 'vp8/encoder')
-rw-r--r-- | vp8/encoder/bitstream.c | 17 | ||||
-rw-r--r-- | vp8/encoder/encodeframe.c | 20 | ||||
-rw-r--r-- | vp8/encoder/encodeintra.c | 2 | ||||
-rw-r--r-- | vp8/encoder/ethreading.c | 19 | ||||
-rw-r--r-- | vp8/encoder/pickinter.c | 22 | ||||
-rw-r--r-- | vp8/encoder/rdopt.c | 46 |
6 files changed, 71 insertions, 55 deletions
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c index 4427dfa79..284025d4e 100644 --- a/vp8/encoder/bitstream.c +++ b/vp8/encoder/bitstream.c @@ -948,8 +948,7 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi) int j = 0; do - write_bmode(w, m->bmi[j].mode, pc->fc.bmode_prob); - + write_bmode(w, m->bmi[j].as_mode, pc->fc.bmode_prob); while (++j < 16); } @@ -1016,14 +1015,16 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi) const int *const L = vp8_mbsplits [mi->partitioning]; int k = -1; /* first block in subset j */ int mv_contz; + int_mv leftmv, abovemv; + while (j != L[++k]) if (k >= 16) assert(0); + leftmv.as_int = left_block_mv(m, k); + abovemv.as_int = above_block_mv(m, k, mis); + mv_contz = vp8_mv_cont(&(leftmv.as_mv), &(abovemv.as_mv)); - mv_contz = vp8_mv_cont - (&(vp8_left_bmi(m, k)->mv.as_mv), - &(vp8_above_bmi(m, k, mis)->mv.as_mv)); write_sub_mv_ref(w, b->mode, vp8_sub_mv_ref_prob2 [mv_contz]); //pc->fc.sub_mv_ref_prob); if (b->mode == NEW4X4) @@ -1099,9 +1100,9 @@ static void write_kfmodes(VP8_COMP *cpi) do { - const B_PREDICTION_MODE A = vp8_above_bmi(m, i, mis)->mode; - const B_PREDICTION_MODE L = vp8_left_bmi(m, i)->mode; - const int bm = m->bmi[i].mode; + const B_PREDICTION_MODE A = above_block_mode(m, i, mis); + const B_PREDICTION_MODE L = left_block_mode(m, i); + const int bm = m->bmi[i].as_mode; #ifdef ENTROPY_STATS ++intra_mode_stats [A] [L] [bm]; diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c index 984776fdb..672ceeca0 100644 --- a/vp8/encoder/encodeframe.c +++ b/vp8/encoder/encodeframe.c @@ -477,8 +477,24 @@ void encode_mb_row(VP8_COMP *cpi, x->mb_activity_ptr++; x->mb_norm_activity_ptr++; - for (i = 0; i < 16; i++) - vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof(xd->block[i].bmi)); + if(cm->frame_type != INTRA_FRAME) + { + if (xd->mode_info_context->mbmi.mode != B_PRED) + { + for (i = 0; i < 16; i++) + xd->mode_info_context->bmi[i].mv.as_int = xd->block[i].bmi.mv.as_int; + }else + { + for (i = 0; i < 16; i++) + xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode; + } + } + else + { + if(xd->mode_info_context->mbmi.mode != B_PRED) + for (i = 0; i < 16; i++) + xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode; + } // adjust to the next column of macroblocks x->src.y_buffer += 16; diff --git a/vp8/encoder/encodeintra.c b/vp8/encoder/encodeintra.c index 307064153..835c80d28 100644 --- a/vp8/encoder/encodeintra.c +++ b/vp8/encoder/encodeintra.c @@ -88,7 +88,6 @@ void vp8_encode_intra16x16mby(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) switch (x->e_mbd.mode_info_context->mbmi.mode) { - case DC_PRED: d->bmi.mode = B_DC_PRED; break; @@ -104,7 +103,6 @@ void vp8_encode_intra16x16mby(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) default: d->bmi.mode = B_DC_PRED; break; - } } } diff --git a/vp8/encoder/ethreading.c b/vp8/encoder/ethreading.c index a03ff951f..f99ce6d2f 100644 --- a/vp8/encoder/ethreading.c +++ b/vp8/encoder/ethreading.c @@ -234,8 +234,23 @@ THREAD_FUNCTION thread_encoding_proc(void *p_data) x->mb_activity_ptr++; x->mb_norm_activity_ptr++; - for (i = 0; i < 16; i++) - vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof(xd->block[i].bmi)); + if(cm->frame_type != INTRA_FRAME) + { + if (xd->mode_info_context->mbmi.mode != B_PRED) + { + for (i = 0; i < 16; i++) + xd->mode_info_context->bmi[i].mv.as_int = xd->block[i].bmi.mv.as_int; + }else + { + for (i = 0; i < 16; i++) + xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode; + } + } + else { + if(xd->mode_info_context->mbmi.mode != B_PRED) + for (i = 0; i < 16; i++) + xd->mode_info_context->bmi[i].as_mode = xd->block[i].bmi.mode; + } // adjust to the next column of macroblocks x->src.y_buffer += 16; diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c index b47c7b5f8..431127626 100644 --- a/vp8/encoder/pickinter.c +++ b/vp8/encoder/pickinter.c @@ -214,7 +214,6 @@ static int pick_intra4x4block( *best_mode = mode; } } - b->bmi.mode = (B_PREDICTION_MODE)(*best_mode); vp8_encode_intra4x4block(rtcd, x, ib); return best_rd; @@ -241,8 +240,9 @@ int vp8_pick_intra4x4mby_modes { MODE_INFO *const mic = xd->mode_info_context; const int mis = xd->mode_info_stride; - const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode; - const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode; + const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); + const B_PREDICTION_MODE L = left_block_mode(mic, i); + B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d); @@ -250,8 +250,7 @@ int vp8_pick_intra4x4mby_modes cost += r; distortion += d; - - mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode; + mic->bmi[i].as_mode = xd->block[i].bmi.mode = best_mode; // Break out case where we have already exceeded best so far value // that was passed in @@ -272,9 +271,6 @@ int vp8_pick_intra4x4mby_modes error = INT_MAX; } - for (i = 0; i < 16; i++) - xd->block[i].bmi.mv.as_int = 0; - return error; } @@ -432,9 +428,9 @@ static void update_mvcount(VP8_COMP *cpi, MACROBLOCKD *xd, int_mv *best_ref_mv) * therefore, only need to modify MVcount in NEWMV mode. */ if (xd->mode_info_context->mbmi.mode == NEWMV) { - cpi->MVcount[0][mv_max+((xd->block[0].bmi.mv.as_mv.row - + cpi->MVcount[0][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.row - best_ref_mv->as_mv.row) >> 1)]++; - cpi->MVcount[1][mv_max+((xd->block[0].bmi.mv.as_mv.col - + cpi->MVcount[1][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.col - best_ref_mv->as_mv.col) >> 1)]++; } } @@ -966,11 +962,11 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, // macroblock modes vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO)); - if (x->e_mbd.mode_info_context->mbmi.mode == B_PRED) + + if (x->e_mbd.mode_info_context->mbmi.mode <= B_PRED) for (i = 0; i < 16; i++) { - vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO)); - + x->e_mbd.block[i].bmi.mode = best_bmodes[i].mode; } else { diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 5ac3e4fa7..3d535bc22 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -646,7 +646,6 @@ static int rd_pick_intra4x4block( vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); } } - b->bmi.mode = (B_PREDICTION_MODE)(*best_mode); IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff, 32); @@ -688,8 +687,8 @@ int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, if (mb->e_mbd.frame_type == KEY_FRAME) { - const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode; - const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode; + const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); + const B_PREDICTION_MODE L = left_block_mode(mic, i); bmode_costs = mb->bmode_costs[A][L]; } @@ -702,7 +701,8 @@ int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, cost += r; distortion += d; tot_rate_y += ry; - mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode; + + mic->bmi[i].as_mode = best_mode; if(total_rd >= (long long)best_rd) break; @@ -850,17 +850,8 @@ int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) { - int i; - x->e_mbd.mode_info_context->mbmi.mode = mb; x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int; - - for (i = 0; i < 16; i++) - { - B_MODE_INFO *bmi = &x->e_mbd.block[i].bmi; - bmi->mode = (B_PREDICTION_MODE) mb; - bmi->mv.as_int = mv->as_int; - } } static int labels2mode( @@ -908,10 +899,10 @@ static int labels2mode( thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102); break; case LEFT4X4: - this_mv->as_int = col ? d[-1].bmi.mv.as_int : vp8_left_bmi(mic, i)->mv.as_int; + this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i); break; case ABOVE4X4: - this_mv->as_int = row ? d[-4].bmi.mv.as_int : vp8_above_bmi(mic, i, mis)->mv.as_int; + this_mv->as_int = row ? d[-4].bmi.mv.as_int : above_block_mv(mic, i, mis); break; case ZERO4X4: this_mv->as_int = 0; @@ -923,8 +914,9 @@ static int labels2mode( if (m == ABOVE4X4) // replace above with left if same { int_mv left_mv; + left_mv.as_int = col ? d[-1].bmi.mv.as_int : - vp8_left_bmi(mic, i)->mv.as_int; + left_block_mv(mic, i); if (left_mv.as_int == this_mv->as_int) m = LEFT4X4; @@ -1408,6 +1400,7 @@ static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, BLOCKD *bd = &x->e_mbd.block[i]; bd->bmi.mv.as_mv = bsi.mvs[i].as_mv; + bd->bmi.mode = bsi.modes[i]; bd->eob = bsi.eobs[i]; } @@ -2317,6 +2310,8 @@ 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; + /* required for left and above block mv */ + x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; } other_cost += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; @@ -2408,27 +2403,22 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int return; } - - if(best_mbmode.mode <= B_PRED) - { - int i; - for (i = 0; i < 16; i++) - { - best_bmodes[i].mv.as_int = 0; - } - } - // macroblock modes vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO)); - for (i = 0; i < 16; i++) + if (best_mbmode.mode == B_PRED) { - vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO)); + for (i = 0; i < 16; i++) + x->e_mbd.block[i].bmi.mode = best_bmodes[i].mode; } if (best_mbmode.mode == SPLITMV) { + for (i = 0; i < 16; i++) + x->e_mbd.block[i].bmi.mv.as_int = best_bmodes[i].mv.as_int; + vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); + x->e_mbd.mode_info_context->mbmi.mv.as_int = x->partition_info->bmi[15].mv.as_int; } |